嵌入式操作系统的任务调度原理

 时间:2024-10-12 00:37:11

编写自己的操作系统,绝对是嵌入式程序员的梦想之一.下面介绍操作系统核心的任务调度的一些知识.

工具/原料

keil5及stm32开发环境 5版本的keil比4好用很多,建议使用keil5

stm32单片机开发板

任务种类及任务组织形式

1、先了解任务的状态(也可以认为任务的种类):runn坡纠课柩ing:运行状态,任务获取到cpu资源,正在运行.系统中某一时刻只能有一个任务在运行.ready:任务准备就绪,可以同时又多个ready任务.ready中拥有最高优先级的任务,下一个运行的任务就是它.delay:任务主动延迟,放弃cpu的资源.pend:阻塞状态,由于任务运行中,缺少必要条件,导致任务不能运行,需要等待某个条件,进入pend状态.suspend:挂起状态,不参与任务调度,比如某个任务只需要开机执行一次,之后再也用不到.则可以在执行完成后让它进入到suspend状态.

嵌入式操作系统的任务调度原理

3、关于链表结构,不再补充,至于原因引用一个名人的话:这里地方太小,写不下.比如:没有优先级为0的任务,那么优先级为0的任务所对应的链表就是空的,这时,链表的头指针和尾指针都是空的.

嵌入式操作系统的任务调度原理嵌入式操作系统的任务调度原理

在ready任务中查找最高优先级的算法

1、查找最紧急的ready任务.上面我们说到设立了一个标志位,这个变量是U8类型的ucPrioFlag.它有8个位,每一位代表了链表是否为空.下面列举这个变量的几种情况,以及所对应的优先级:

嵌入式操作系统的任务调度原理

3、我们把256种情况,及所对应的优先级写到一个数组中,对应关系是,标志的值作为下标,优先级作为数组的内容.通过搜索这个数组,就可以知道每种情况下ready所对应的最高优先级是哪个.方便快捷.在程序中的表现形式是:typedef struct m_tasksched tab //任务调度表{ M_CHAIN astrChain[PRIORI TYNUM]; //各优先级根节点 M_PRIOFLAG strFlag; //优先级标志}M_TASKSCHEDTAB;上面程序只是一个大概讲解,以后会有整体程序清单.

嵌入式操作系统的任务调度原理

任务切换

1、任务之间的切换是用汇编语腱葱炙尕言写成的.每个任务都有一个寄存器组.里面装有这个任务的一些运行参数.只要把缨祢继泐任务的寄存器组恢复到cpu的寄存器中,就可以运行该任务了.如果要停止运行该任务,需要把cpu的寄存器备份到任务的寄存器组中.一般的任务调度是通过定时器中断实现的,也就是定时器每进入中断,就会检测一下有没有需要切换的任务.如果是用arm处理器,就需要学习arm寄存器相关的汇编语言.如下面的例子:MDS_TickContextSwitch: @保存接口寄存器 STDMB R13!,{R0-R3,R12,R14} @调用C语言TICK中断处理函数 LDR R0,=MDS_Ticklsr MOV R14,PC BX R0 @保存当前任务的堆栈信息 LDR R0,=gpstrCurTaskSpAddr LDR R14,[R0] MRS R0,SPSR STMIA R14!,{R0} LDMIA R13!{R0-R3,R12} STMIA R14,{R0-R14}^ ADD R14,R14,#0X3C LDMIA R13!,{R0} STMIA R14,{R0} @任务调度完毕,恢复将要运行任务现场 LDR R0,=gpstrNextTaskSpAddr LDR R14,[R0] LDMIA R14,{R0} MSR SPSR,R0 LDMIB R14,{R0-R14}^ NOP ADD R14,R14,#0X40 LDMIA R14,{R14} SUBS PC,R14,#4

嵌入式操作系统的任务调度原理
  • 两台linux服务器挂载共享一个磁盘
  • 玉树叶子枯萎掉叶怎么救治#校园分享#
  • Ulysses软件智能列表设置在哪里打开
  • 天涯明月刀:少林打法
  • 业主如何起诉物业
  • 热门搜索
    怀孕前期有什么症状 副词是什么 past是什么意思 醍醐灌顶什么意思 4p是什么意思 痤疮用什么药 ftp是什么意思 adobe是什么意思 头痛是什么原因 rise是什么意思