FREE RTOS到底用抢占还是协程?为什么delay_ms延时严重不准呢

2019-12-12 18:10发布




两个问题:

1、用哪种模式好?

2、延时遇到问题,两种都试了下没用,



延时用的。无论写的delay_ms(3000)还是6000,延时最大只有1.2S,不科学呢,按道理只会拖后呀



//延时 nms,会引起任务调度
//nms:要延时的 ms 数
//nms:0~65535
void delay_ms(u32 nms)
{
  if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
  {
   if(nms>=fac_ms) //延时的时间大于 OS 的最少时间周期
   {
     vTaskDelay(nms/fac_ms);  //FreeRTOS 延时
   }
   nms%=fac_ms;  //OS 已经无法提供这么小的延时了,
   //采用普通方式延时
  }
  delay_us((u32)(nms*1000)); //普通方式延时
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
cloudboy
1楼-- · 2019-12-12 23:57
 精彩回答 2  元偷偷看……
1208877122
2楼-- · 2019-12-13 00:19
cloudboy 发表于 2019-4-4 16:08
抢占啊,楼主是不是时钟没调对

时间是对的,是我看错了,抢占不会会 优先级高的运行的多呢?打扰了优先级低的,比如我串口中断接收GPS,任务里面解析,有时候就解析失败,数据不全
foxpro2005
3楼-- · 2019-12-13 02:17
楼主用的是正点原子的例程吧, 先自己的心跳时间1ms是不是对的
68336016
4楼-- · 2019-12-13 04:00
1208877122 发表于 2019-4-4 20:35
时间是对的,是我看错了,抢占不会会 优先级高的运行的多呢?打扰了优先级低的,比如我串口中断接收GPS, ...

设置可能有些错了
假如不屏蔽串口中断,一直接数据收放缓冲区,任务不断去读缓冲区,怎么会丢数据。
我猜是你任务里的操作将一些中断屏蔽了。
在freertos有个宏叫什么可管理中断最高优先级的
硬邦邦
5楼-- · 2019-12-13 06:34
68336016 发表于 2019-4-5 11:17
设置可能有些错了
假如不屏蔽串口中断,一直接数据收放缓冲区,任务不断去读缓冲区,怎么会丢数据。
我猜 ...

昨天被这个宏搞的神经了,小于宏的中断优先级不能用freetos的api 。我用了,总是出错
68336016
6楼-- · 2019-12-13 12:25
 精彩回答 2  元偷偷看……

一周热门 更多>