高级会员
- 积分
- 647
- 金钱
- 647
- 注册时间
- 2014-4-29
- 在线时间
- 299 小时
|
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那肯定是没有延时的
|