动手写简单的嵌入式操作系统一
作者:网络转载 发布时间:[ 2013/8/14 11:30:19 ] 推荐标签:
在时钟中断里,退出时调用 OSIntExit(); //触发任务切换软中断
在这个函数中,比较当前任务指针是否发生了改变,若发生了改变,说明需要进行任务切换了。
下面再看看延时函数OSTimeDly (int32 ticks)
void OSTimeDly (int32 ticks)
{
OS_CPU_SR cpu_sr = 0;
int8 index;
TCB *pTCB;
OS_ENTER_CRITICAL();
OSCurTCB->TCBDelay = ticks;
OSNewTCB = NULL;
/*任务优先级查找算法,从当前任务
向后遍历,第一个大的优先级的任务
是需要调度进去的任务*/
for (index = 0; index < TaskNUM;index++)
{
pTCB = OSTCBTable+index;
/*跳过睡眠任务*/
if (pTCB->TCBDelay != 0)
{
continue;
}
/*跳过挂起任务*/
if (pTCB->TaskStat == OS_Task_Pend)
{
continue;
}
/*找到了高优先级的任务,
并且比当前任务优先级高*/
if (OSCurTCB->CurPriority < pTCB->CurPriority)
{
OSNewTCB = pTCB;
break;
}
/*找到了比当前优先级低的任务*/
if (OSCurTCB->CurPriority > pTCB->CurPriority)
{
/*如果当前任务之前有同优先级的绪任务,
则选择该任务,否则使用*/
if (OSNewTCB == NULL)
{
OSNewTCB = pTCB;
}
break;
}
/*找到了高优先级的任务,
并且跟当前任务优先级相等*/
if (OSCurTCB->CurPriority == pTCB->CurPriority)
{
/*该任务在当前任务之后*/
if ((pTCB > OSCurTCB))
{
OSNewTCB = pTCB;
break ;
}
/*在当前任务之前或者是当前任务
则还需要继续向后搜索第一个同优先级的任务*/
if (((pTCB < OSCurTCB)||(pTCB == OSCurTCB))
&&(OSNewTCB == NULL))
{
OSNewTCB = pTCB;
continue;
}
}
}
OS_EXIT_CRITICAL();
OSTaskSche();
}
延时函数也很简单,是一方面把需要延时的时间给任务控制结构体中的延时变量,一方面查找高优先级的任务开始进行任务切换。以上完成了简单的任务切换和调度。从上面可以看出,查找效率是很低的,尤其是任务数目多的时候,需要从头到尾的遍历一遍数组。创建任务和查找高优先级的任务都有改进的空间,如果以后想到更好的更有效的方法再改一改,试一试。
以上实现了简单的任务调度和切换。接下来,是任务间如何进行同步和通讯...
在CSDN资源中可以下载工程的源码,KEILMDK4.23的IDE
相关推荐
更新发布
功能测试和接口测试的区别
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