UCOSIII优先级反转
2024-10-21 12:57:50
反转现象
任务优先级:H>M>L
绿色部分:任务占用共享资源
理想状态:7释放信号量后,最高优先级H任务抢占CPU
反转原因:H和L等待同一个信号量,H的任务优先级被降至和L相同优先级,此时M已经成为最高优先级
实验举例
void start_task(void *p_arg)
{
OS_CRITICAL_ENTER(); //进入临界区
//创建一个信号量
OSSemCreate ((OS_SEM* )&TEST_SEM,
(CPU_CHAR* )"TEST_SEM",
(OS_SEM_CTR)1, //信号量初始值为1
(OS_ERR* )&err);
//创建HIGH任务
OSTaskCreate((OS_TCB * )&High_TaskTCB,
(CPU_CHAR * )"High task",
(OS_TASK_PTR )high_task,
(void * )0,
(OS_PRIO )HIGH_TASK_PRIO,
(CPU_STK * )&HIGH_TASK_STK[0],
(CPU_STK_SIZE)HIGH_STK_SIZE/10,
(CPU_STK_SIZE)HIGH_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//创建MIDDLE任务
OSTaskCreate((OS_TCB * )&Middle_TaskTCB,
(CPU_CHAR * )"Middle task",
(OS_TASK_PTR )middle_task,
(void * )0,
(OS_PRIO )MIDDLE_TASK_PRIO,
(CPU_STK * )&MIDDLE_TASK_STK[0],
(CPU_STK_SIZE)MIDDLE_STK_SIZE/10,
(CPU_STK_SIZE)MIDDLE_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//创建LOW任务
OSTaskCreate((OS_TCB * )&Low_TaskTCB,
(CPU_CHAR * )"Low task",
(OS_TASK_PTR )low_task,
(void * )0,
(OS_PRIO )LOW_TASK_PRIO,
(CPU_STK * )&LOW_TASK_STK[0],
(CPU_STK_SIZE)LOW_STK_SIZE/10,
(CPU_STK_SIZE)LOW_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OS_CRITICAL_EXIT(); //退出临界区
}
//高优先级任务的任务函数
void high_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
while(1)
{
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err); //延时500ms
printf("high task Pend Sem\r\n");
OSSemPend(&TEST_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
printf("high task Running!\r\n");
OSSemPost(&TEST_SEM,OS_OPT_POST_1,&err); //释放信号量
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_PERIODIC,&err); //延时500ms
}
}
//中等优先级任务的任务函数
void middle_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
while(1)
{
printf("middle task Running!\r\n");
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
//低优先级任务的任务函数
void low_task(void *p_arg)
{
static u32 times;
OS_ERR err;
while(1)
{
OSSemPend(&TEST_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量
printf("low task Running!\r\n");
for(times=0;times<5000000;times++)
{
OSSched(); //发起任务调度
}
OSSemPost(&TEST_SEM,OS_OPT_POST_1,&err);
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
实验现象
解决办法
UCOSIII互斥信号量:
http://blog.csdn.net/zhangxuechao_/article/details/78912647
最新文章
- JS高程3.基本概念(1)
- 【SQL篇章--DATABASE/EVENTS】
- json字符串转java对象数组
- Owin SelfHost Asp.net WebApi 遇到 No type was found that matches the controller named &#39;ControllerName&#39; 异常的解决方案
- .NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱 (转)
- C实现通用数据结构--单链表
- Oracle 11g 虚拟列 Virtual Column介绍
- ChesFrame框架介绍
- Centos6.5使用yum安装MariaDB
- android _scrollview嵌套listview出现高度显示不全解决方案
- 【转载】使用sklearn优雅地进行数据挖掘
- window 上安装 Scala
- SQL Server聚合函数与聚合开窗函数 (转载)
- 最新省市区数据,sql插入语句
- 路由器固定IP配置
- Java学习——Applet画8个同心圆
- gulp-load-task 解决 gulpfile.js 过大的问题
- IOS学习笔记45--UITableView性能优化
- 2017";百度之星";程序设计大赛 - 初赛(B) 度度熊的交易计划 最小费用最大流求最大费用
- SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql
热门文章
- unity2019新建LWRP项目出错:Failed to resolve project template
- android -------- SHA 加密算法
- 微信小程序开发——微信小程序下拉刷新真机无法弹回
- Tomcat中加载不到项目 项目构建Deployment Assembly报错:The given project is not a virtual component project
- Python高级笔记(九)Python使用MySQL
- [Kaggle] Online Notebooks
- tushare包使用案例
- LeetCode_405. Convert a Number to Hexadecimal
- tomcat关闭异常导致的项目无法重启
- python:pytest优秀博客