TM32CubeIDE V1.7.0,模运算 => 编译器错误?
我一直使用以下函数或宏:
#define usTimeRead() ((int16_t) (SysTick->VAL >> 1))
#define usTimePlus(TP, US) ((int16_t) TP - ((int16_t) US * (int16_t) 85))
#define usTimePast(TP) (((int16_t) TP - usTimeRead()) > (int16_t) 0)
这些宏用于在16位MCU上实现超时或周期性任务。
在移植到STM32G4时,以下代码本应在引脚B6上生成100us的方波:
int main(void) {
sysConfigMCU();
/* Loop */
int16_t tp = usTimeRead();
for(;;) {
GPIOB->BSRR = ((uint16_t)0x0040);
tp = usTimePlus(tp, 100);
for ( ; !usTimePast(tp); );
GPIOB->BRR = ((uint16_t)0x0040);
tp = usTimePlus(tp, 100);
for ( ; !usTimePast(tp); );
}
}
但运行失败。我必须修改宏 usTimePast(TP),将差值赋给临时变量,程序才能正确运行:
#define usTimePast(TP) ((tmp = (int16_t) TP - usTimeRead()) > (int16_t) 0)
我用TDM-GCC模拟了这种现象,结果相同
例如:
当 usTimeRead() == -32703 且 tp == 32735 时,usTimePast(TP) 中的比较会根据是否将差值赋给临时变量而产生不同的结果!
|
|