关于正点原子FreeRTOS动态创建任务实验,点灯任务亮灭不同步问题

先直接说结论,工程启用了MicroLIB微库导致和usart.c文件内宏定义内容产生了冲突。取消选中MicroLIB,即可解决不同步问题。

问题背景:我用的板子是STM32F103RCT6最小系统板,移植了FreeRTOS代码后,按照视频复刻了原子的实验代码。FreeRTOS版本为9.0。代码要求执行两个点灯任务,周期为500ms亮灭。两个任务的优先级相同。

 问题现象:

不同步问题现象

创建任务函数



问题描述:按照预期现象,应该是两个灯同周期的亮灭。即使FreeRTOS是按照时间片调度,任务执行不是严格意义的同时,但因为时间片是1ms。照理说,人眼观察是感觉不出差距的。可是当我把代码运行时,两个灯并不是同时进行亮灭。反而随着时间的进行,两个灯之间亮灭的同步性越来越差。

所作检查:起初我认为这是时钟频率没设置好,所导致的误差。可是如果是时钟没设置好,照理应该是两个灯亮灭周期不是500ms,而不应该是不同步亮灭的现象。在网上搜索了一番,也有人说是任务中使用了裸机延时函数,于是我重新检查了一遍代码,发现并没有一处有执行裸机延时函数。在我多次确认时钟频率没有出现问题后,也就是时钟频率为默认的72Mhz的情况下。并且并没有出现多余的外部中断打断任务的情况下,我开始排查任务内的每条语句。

排查问题:采用经典的注释调试法。我发现问题解决了。两个灯可以进行同时的亮灭,并且周期为500ms。所以可以确定问题出在串口发送这。


而后转到printf()函数的定义文件usart.c内查看。发现了下面这段话。

usart.c文件


于是我去查看了下我的配置

果然开了微库,在把微库MicroLIB关闭后,再把printf函数注释取消,问题也得到了解决。所以可以确定,是启用了微库和usart.c文件内的宏定义产生了冲突,导致了问题的出现。

解决后的现象

不同步问题解决后现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值