动手写简单的嵌入式操作系统二
作者:网络转载 发布时间:[ 2013/8/15 12:21:07 ] 推荐标签:
/*
*在有间片内等待一个消息
*该函数不能用在中断函数中,也不能在关中断的地方运行
*/
OS_MSG OSQPend(OS_Q *q, uint32 timeout)
{
uint32 index;
uint32 cpu_sr = 0;
OS_MSG msg;
for (index = 0;index < timeout+1;index++)
{
OS_ENTER_CRITICAL();
if (q->front==q->rear)
{
OS_EXIT_CRITICAL();
OSTimeDly(1);
}
else
{
msg=q->msgQueue[q->front];
/*消息个数满时自动从0开始重新计数*/
q->front=(q->front+1)%MAX_MSG_NUMBER;
OS_EXIT_CRITICAL();
return msg;
}
}
OS_EXIT_CRITICAL();
return NULL ;
}
/*
*直接获取一个消息,可用在中断函数中
*/
OS_MSG OSQGet(OS_Q *q)
{
OS_MSG msg;
uint32 cpu_sr = 0;
OS_ENTER_CRITICAL();
if (q->front==q->rear)
{
OS_EXIT_CRITICAL();
return NULL;
}
else
{
msg=q->msgQueue[q->front];
q->front=(q->front+1)%MAX_MSG_NUMBER;
OS_EXIT_CRITICAL();
return msg;
}
}
实时性和相关的优先级反转问题,
在实时领域,是个很关键的问题
首先说多任务,
任务是让一段“流程”,一般都是一遍又一遍的循环运行(死循环)。
一次“流程”运行一遍之后,常常会等待一段时间,
自己休息休息,也让其他任务也运行一下,
这是多任务并行。
在多任务的系统之中,实时性,是让当前高优先级的任务优先运行;
若当前高优先级的任务不是当前正在运行的任务,那么要给一个时机(时钟中断),
让高优先级的任务运行,正在运行的(低优先级)任务等下再运行。
这是实时系统中的抢占调度。
实时操作系统的本质是,
让当前高优先级的任务以快的速度运行!
(如果有同优先级的任务,则大家轮流运行)
由此看来,实时的多任务设计,难度在于:
要保证系统性能满足的需求,
在硬性保证高优先级任务在deadline之前运行完的同时
也要保证低优先级的任务顺利的完成自己的工作。
当然,这里提出了优先级反转的问题了
典型情况如下:
高优先级的任务A要请求的资源被低优先级任务C所占用,
但是任务C的优先级比任务B的优先级低
于是任务B一直运行,比A低优先级的其他任务也一直能运行,
反而高优先级的任务A不能被运行了。
从实时性上讲,若高优先级在等待一个某个资源,
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11