OpenEdv-开源电子网

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

freeRTOS里面vTaskDelay()的输入参数

[复制链接]

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2017-1-4 16:18:49 | 显示全部楼层 |阅读模式
10金钱
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都执行了任务,用秒表观察了一会,时间大致也对。想请教一下前辈这个是什么原因 。
任务代码如下
[mw_shl_code=applescript,true]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:%d\t\n",min,se,ms);
        }
}[/mw_shl_code]


最佳答案

查看完整内容[请看2#楼]

vTaskDelay()理论上传递的是一个延时节拍值,跟你OS的节拍时间是10ms或者100ms没多大关系,最简单的方法就是按你上面的测试方法直接单步进去该函数看看参数传递的节拍值是多少,如果是0那肯定是没有延时的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
11922
金钱
11922
注册时间
2015-11-5
在线时间
2086 小时
发表于 2017-1-4 16:18:50 | 显示全部楼层
vTaskDelay()理论上传递的是一个延时节拍值,跟你OS的节拍时间是10ms或者100ms没多大关系,最简单的方法就是按你上面的测试方法直接单步进去该函数看看参数传递的节拍值是多少,如果是0那肯定是没有延时的
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-1-4
在线时间
11 小时
发表于 2017-1-24 00:13:06 | 显示全部楼层
传入参数0.1,一般来说编译器会强制赋值为0,这时候延时函数实际上只进去玩一圈就出来了,啥也没做,也没有进行任务切换。
接下来你将计时进行了输出,如果你的波特率是9600的话,发送一个字符大概1ms,假设分,秒,毫秒都是1位,加上2个冒号,和\t\n,一共7个字符,如果分,秒,毫秒不止1位,则大概10~11个字符,这时候也就是10ms左右,所以看到的效果就好像延时对了。
假如你把字符输出改成中断方式,或者你采用指示灯的方式,1秒闪一次,应该就不对了,你可以试试。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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