OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3758|回复: 0

关于原子哥提供的delay_ms毫秒延时函数在ucosii某些情况下无法使用的问题分析

[复制链接]

3

主题

18

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-7-23
在线时间
31 小时
发表于 2017-6-7 18:34:11 | 显示全部楼层 |阅读模式
这几天在调试一个云平台的项目,其中一个任务是读取DHT11数据,上传平台。但发现dht11在ucosii中无法实现数据的读取,起初怀疑驱动代码问题,于是在裸机中试了试并不是驱动问题,正常读出数据。开始怀疑是系统哪里没有配置好,检查一圈也没发现问题,最后将目光锁定在了延时函数上。
GQ_GU2O{`)Z4G9[FAODEJNH.png
注释掉的delay_ms就是之前有问题的部分,追踪这个毫秒延时函数如下
_S]7WU~~7N@JMHSJPBU6{DC.png
继续追踪找到
可以看出当你调用延时函数的时长大于系统的OS_TICKS_PER_SEC(我的时间片长为10ms)时,会调用
ucosii自带的延时函数

8F5JOG_}CIJ}LN[DTQ@7RKA.png
最后找到了问题所在:在ucosii自带的延时函数中会发生任务调度,如果此时你的数据采集任务优先级较低的话,优先级高的极有可能
打断时序逻辑,对于时序要求较高的一些外设,可能根本无法通信。
即使在读取函数前加入临界区代码也不行
SPF9H0AQTH2~K5Y@A5Y)4D9.png
如果你的ms延时不大于你的OS_TICKS_PER_SEC,可以正常使用,但delay_us不存在这个问题,在写时序逻辑时可以用us延时代替ms延时,
或者在调用delay_ms函数前关闭任务调度,延时完在恢复。(谨慎使用,此方法仅限于编写时序逻辑代码时使用,其实delay_us就是这个原理,但us时间短,对系统调度影响较小,可以使用,但ms延时不推荐使用这种方法)



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 02:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表