FreeRTOS新手求解答

2019-07-20 03:25发布

      LED1的优先级高于LED0的优先级,(已经删除浮点任务)
      当第一次vTaskDelay(200),阻塞当前任务,进入LED0任务,进入vTaskDelay(500),等vTaskDelay(200)过后,高任务优先级LED1开始执行,保留现场所以从       延迟之后开始跑,
      但是到vTaskDelay(800)时候,又会进入LED0,此时计时的话,是保留上次计时的数吗?即是从300开始计时吗?
      当计时开始的时候CPU在做什么?因为此时LED1还是在阻塞太,CPU会延迟300后,轮询执行LED0任务吗?(在LED1任务回复就绪状态前)。


    如果我的任务不用任何的延迟,即不用vTaskDelay()函数,怎么去实现多任务?比如I2C读取EEPROM,和读写内部Flash,


   如果CPU在执行当前最高优先级任务,其他任务发生中断怎么处理?(外部按键中断等)


谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
46条回答
烈日灼心
1楼-- · 2019-07-24 03:41
edmund1234 发表于 2019-3-6 18:10
我也只能说这么多, 你还是不明白, 我也没办法了

我现在想知道,当LED1任务vTaskDelay 200,跑去LED0任务,有没有跑完vTaskDelay 500,还是说,vTaskDelay200之后不管LED0任务跑没跑完,都会转到LED1任务。
edmund1234
2楼-- · 2019-07-24 08:09
烈日灼心 发表于 2019-3-7 09:34
我现在想知道,当LED1任务vTaskDelay 200,跑去LED0任务,有没有跑完vTaskDelay 500,还是说,vTaskDelay ...

我可以告诉你这是怎样跑的

但想你先去明白vTaskDelay是什么, 它不是你以往用的Delay, 不是调用后就把一变量从A减到B, 然后返回, 它不是这样的工作原理。
vTaskDelay的工作方式是, 一个变量为你设定的时间(比如是500), 然后由SysTick所触发的1ms中断所递减, 直到等于零就解除阻塞

led1_task     LED1(0);                          0s
led1_task     vTaskDelay(200);            0.x us
led0_task     LED0Toggle;                   0.x us
led0_task     vTaskDelay(500);            0.x us  
Idle
led1_task     LED1(1);                          200ms
led1_task     vTaskDelay(800);            200ms+0.x us
Idle
led0_task     LED0Toggle;                   500ms
led0_task     vTaskDelay(500);            500ms+0.xus
Idle
led1_task     LED1(0);                          1s
led1_task     vTaskDelay(200);            1s + 0.x us
led0_task     LED0Toggle;                   1s + 0.x us
led0_task     vTaskDelay(500);            1s + 0.xus
Idle
led1_task     LED1(1);                          1.2s
led1_task     vTaskDelay(800);            1.2s + 0.x us
Idle
led0_task     LED0Toggle;                   1.5s
led0_task     vTaskDelay(500);            1.5s + 0.xus
" " "
" " "
烈日灼心
3楼-- · 2019-07-24 11:20
 精彩回答 2  元偷偷看……
jermy_z
4楼-- · 2019-07-24 16:00
 精彩回答 2  元偷偷看……
ZHDX
5楼-- · 2019-07-24 21:27
我觉得你应该去学学统筹方法.

或者玩玩一些快餐店游戏.

举个很简单的例子,

你自己是厨师(CPU),

一个烧水的流程是10分钟,

你按烧水,  就相当于烧水的任务代码是  ShaoShui(); vTaskDelay(10分钟);

一旦启动了热水壶,  你自己是CPU, 10分钟之内是不用管这个水壶的.

如果你的所有任务都很轻松,  那么你能准确在10分钟后立刻使用这壶水.

但如果刚巧你有一些很重要的步骤正在做不好打断,  那么你就会选择晚一点管这壶烧好的水.

在这壶烧好的水的角度上, 它就被任务调度影响到了, 自己的vTaskDelay被拖延了. 它不理解你CPU干嘛去了.


这些其实毫无难度,  只要花多一点时间去模拟场景, 去活得类似的经验.

经验不够, 那么理解力就不会够.

烈日灼心
6楼-- · 2019-07-24 22:40
 精彩回答 2  元偷偷看……

一周热门 更多>