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在执行当前最高优先级任务,其他任务发生中断怎么处理?(外部按键中断等)
谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我可以告诉你这是怎样跑的
但想你先去明白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
" " "
" " "
一周热门 更多>