完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
vTaskDelay的函数声明是这样的
void vTaskDelay( const tickType_t xTicksToDelay ); 而TickType_t在promacro.h头文件里有这样的typedef typedef uint32_t TickType_t; 这是一个32位整形数 另外,FreeRTOSConfig.h文件里面,有这样一个宏定义 #define configTICK_RATE_HZ (100), 值配置为100的意思就是100HZ的tick,每10ms进行一次任务调度 楼主的程序有一些任务里面用到了vTaskDelay,其中有一个任务是周期性的,希望每1ms执行一次,而且因为是用宏定义替换的参数,所以相当于vTaskDelay(0.1)这样调用了任务延时的函数。但是忘记了configTICK_RATE_HZ只有100,而且还传入了浮点参数 结果这个任务运行起来还挺正常的。开始我还以为是错觉,就重新写了一个测试的小程序,configTICK_RATE_HZ还是设置成100,程序只有一个任务,每1ms执行一次,发现确实每个ms都执行了任务,用秒表观察了一会,时间大致也对。想请教一下前辈这个是什么原因 。 任务代码如下 [AppleScript] 纯文本查看 复制代码 void TaskTest(void *para){static u16 ms,se,min;while(1){vTaskDelay( 0.1 );ms ++;if(ms >= 1000){ms = 0;se++;if(se>=60){se = 0;min ++;}}printf("%d:%d:%dtn",min,se,ms);}} |
|
相关推荐
2个回答
|
|
vTaskDelay()理论上传递的是一个延时节拍值,跟你OS的节拍时间是10ms或者100ms没多大关系,最简单的方法就是按你上面的测试方法直接单步进去该函数看看参数传递的节拍值是多少,如果是0那肯定是没有延时的
|
|
|
|
传入参数0.1,一般来说编译器会强制赋值为0,这时候延时函数实际上只进去玩一圈就出来了,啥也没做,也没有进行任务切换。
接下来你将计时进行了输出,如果你的波特率是9600的话,发送一个字符大概1ms,假设分,秒,毫秒都是1位,加上2个冒号,和tn,一共7个字符,如果分,秒,毫秒不止1位,则大概10~11个字符,这时候也就是10ms左右,所以看到的效果就好像延时对了。 假如你把字符输出改成中断方式,或者你采用指示灯的方式,1秒闪一次,应该就不对了,你可以试试。 |
|
|
|
只有小组成员才能发言,加入小组>>
689 浏览 0 评论
1102 浏览 1 评论
2469 浏览 5 评论
2803 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2642 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
650浏览 9评论
648浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
777浏览 6评论
622浏览 5评论
664浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 11:19 , Processed in 1.001240 second(s), Total 51, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号