- 打卡等级:以坛为家I
- 打卡总天数:217
- 最近打卡:2024-11-15 09:12:27
荣誉版主
- 积分
- 2790
|
本帖最后由 gentleman 于 2024-3-9 16:05 编辑
FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下)
原计划,这一期 讲挂起任务
考虑到和 阻塞任务有很高的相似度
再发一期 就有点水了
这期不读源码,总结一下完整的任务调度 (含阻塞)
详细内容去对应的那一期查看
图
图2
这期我们自己写一个例程
1. 任务函数
portTASK_FUNCTION( vTaskA, pvParameters )
{
UNUSED( pvParameters );
while(1)
{
printf("运行任务A\r\n"); //实际项目不建议这样使用共享资源,此处仅为方便观察
vTaskDelay(100);
}
vTaskDelete(NULL);
}
portTASK_FUNCTION( vTaskB, pvParameters )
{
UNUSED( pvParameters );
while(1)
{
printf("运行任务B\r\n"); //实际项目不建议这样使用共享资源,此处仅为方便观察
vTaskDelay(500);
}
vTaskDelete(NULL);
}
portTASK_FUNCTION( vTaskC, pvParameters )
{
UNUSED( pvParameters );
while(1)
{
printf("运行任务C\r\n"); //实际项目不建议这样使用共享资源,此处仅为方便观察
vTaskDelay(1000);
}
vTaskDelete(NULL);
}
portTASK_FUNCTION( vTaskD, pvParameters )
{
UNUSED( pvParameters );
while(1)
{
printf("运行任务D\r\n"); //实际项目不建议这样使用共享资源,此处仅为方便观察
vTaskDelay(1000);
}
vTaskDelete(NULL);
}
4个任务 A 延时100 B 500 CD 1000
2.建立任务 再main中
xTaskCreate(vTaskA,"TaskA",128,NULL,1,NULL);
xTaskCreate(vTaskB,"TaskB",128,NULL,2,NULL);
xTaskCreate(vTaskC,"TaskC",128,NULL,2,NULL);
xTaskCreate(vTaskD,"TaskD",128,NULL,2,NULL);
让BCD 优先级2
A 优先级1
3.运行过程分析
建立任务后 当前任务会指向任务D (不懂的去看之前的内容)
所以D会先运行
D运行 D运行到vTaskDelay(1000); 进入阻塞状态
把D 放到了 阻塞链表
这时 当前任务指向了B (不懂的还是去看之前的内容 :)
B运行 B 阻塞
B 移入阻塞链表
当前任务指向C
C运行 C 阻塞
C 移入阻塞链表
当前任务指向低优先级的A
A运行 A 阻塞
A 移入阻塞链表
空闲任务运行
100ms到了 A 退出阻塞 ,被移回 就绪链表【1】
A 时此时优先级最高的任务
当前任务指向A
运行A A阻塞
运行空闲
。。。
500ms B退出阻塞,被移回就绪链表【2】
B的优先级更高,所以不管A是否就绪
当前任务都会指向B
B运行 B阻塞
B 移入阻塞链表
恢复B退出阻塞前的状态
继续运行A 或者空闲
。。。
1000ms 虽然C D 同为1000ms
但C后移入阻塞链表的
C在D 的后一项
所以 D先退出阻塞
先运行D
。。。
以上就是 包含阻塞任务的整体任务调度分析
例程见附件
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+1
楼主威武~
|