反转现象



任务优先级: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

最新文章

  1. JS高程3.基本概念(1)
  2. 【SQL篇章--DATABASE/EVENTS】
  3. json字符串转java对象数组
  4. Owin SelfHost Asp.net WebApi 遇到 No type was found that matches the controller named &#39;ControllerName&#39; 异常的解决方案
  5. .NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱 (转)
  6. C实现通用数据结构--单链表
  7. Oracle 11g 虚拟列 Virtual Column介绍
  8. ChesFrame框架介绍
  9. Centos6.5使用yum安装MariaDB
  10. android _scrollview嵌套listview出现高度显示不全解决方案
  11. 【转载】使用sklearn优雅地进行数据挖掘
  12. window 上安装 Scala
  13. SQL Server聚合函数与聚合开窗函数 (转载)
  14. 最新省市区数据,sql插入语句
  15. 路由器固定IP配置
  16. Java学习——Applet画8个同心圆
  17. gulp-load-task 解决 gulpfile.js 过大的问题
  18. IOS学习笔记45--UITableView性能优化
  19. 2017&quot;百度之星&quot;程序设计大赛 - 初赛(B) 度度熊的交易计划 最小费用最大流求最大费用
  20. SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

热门文章

  1. unity2019新建LWRP项目出错:Failed to resolve project template
  2. android -------- SHA 加密算法
  3. 微信小程序开发——微信小程序下拉刷新真机无法弹回
  4. Tomcat中加载不到项目 项目构建Deployment Assembly报错:The given project is not a virtual component project
  5. Python高级笔记(九)Python使用MySQL
  6. [Kaggle] Online Notebooks
  7. tushare包使用案例
  8. LeetCode_405. Convert a Number to Hexadecimal
  9. tomcat关闭异常导致的项目无法重启
  10. python:pytest优秀博客