先直接说结论,工程启用了MicroLIB微库导致和usart.c文件内宏定义内容产生了冲突。取消选中MicroLIB,即可解决不同步问题。
问题背景:我用的板子是STM32F103RCT6最小系统板,移植了FreeRTOS代码后,按照视频复刻了原子的实验代码。FreeRTOS版本为9.0。代码要求执行两个点灯任务,周期为500ms亮灭。两个任务的优先级相同。
问题现象:
不同步问题现象
创建任务函数
问题描述:按照预期现象,应该是两个灯同周期的亮灭。即使FreeRTOS是按照时间片调度,任务执行不是严格意义的同时,但因为时间片是1ms。照理说,人眼观察是感觉不出差距的。可是当我把代码运行时,两个灯并不是同时进行亮灭。反而随着时间的进行,两个灯之间亮灭的同步性越来越差。
所作检查:起初我认为这是时钟频率没设置好,所导致的误差。可是如果是时钟没设置好,照理应该是两个灯亮灭周期不是500ms,而不应该是不同步亮灭的现象。在网上搜索了一番,也有人说是任务中使用了裸机延时函数,于是我重新检查了一遍代码,发现并没有一处有执行裸机延时函数。在我多次确认时钟频率没有出现问题后,也就是时钟频率为默认的72Mhz的情况下。并且并没有出现多余的外部中断打断任务的情况下,我开始排查任务内的每条语句。
排查问题:采用经典的注释调试法。我发现问题解决了。两个灯可以进行同时的亮灭,并且周期为500ms。所以可以确定问题出在串口发送这。
而后转到printf()函数的定义文件usart.c内查看。发现了下面这段话。
usart.c文件
于是我去查看了下我的配置
果然开了微库,在把微库MicroLIB关闭后,再把printf函数注释取消,问题也得到了解决。所以可以确定,是启用了微库和usart.c文件内的宏定义产生了冲突,导致了问题的出现。
解决后的现象
不同步问题解决后现象