本帖最后由 lotoohe 于 2016-8-24 08:24 编辑
该RTOS系统命名为ZRTOS,是我在阅读了ucos后,并且借鉴了其它操作系统后实现的,完成了一些基础的工作,可以拿过来学习,也可以进行简单的应用。
笔者独自完成了内存分配算法,多任务切换,消息邮箱,信号量,互斥量等,在其中也学到了非常多的东西。
声明:仅供学习!
要自写一个操作系统,我们首先要实现的就是任务切换,再其次是任务调度(高优先级先执行,同优先级时间片分割执行),然后再是消息邮箱,信号量,互斥量等等。
下面我们来看看任务切换的实现,这部分的代码只能由汇编语言来完成,在handler.s中有任务切换的具体代码:
我们的任务板是stm32,stm32是基于cortex-m3内核的,所以在写这个系统的时候很多参照了cortex-m3内核的文档,其中包括了pendsv中断向量,与中断压栈以及堆栈指针等方面。在设计中中断任务我们用的是msp堆栈指针,而我们的任务使用的是psp指针,我们在汇编代码中开启了psp指针的使用以后就,cpu就会自动的进行切换了:
开全局与关全局中断的代码:[mw_shl_code=asm,true]enter_int
export enter_int
CPSID I
RIMASK=1 关中断
BX LR ;返回
exit_int
export exit_int
CPSIE I ;开中断
BX LR ;返回[/mw_shl_code]第一次启动操作系统,我们往往需要初始化psp指针,设置pendsv中断为最低的优先级,然后开始一次调度:
[mw_shl_code=asm,true];开启操作系统
start_os proc
export start_os
CPSID I
;首先设置pendsv为最低优先级
;设置pendsv的中断优先级
ldr r0,=0xE000ED22
;最低优先级
ldr r1,=0xff
;设置
strb r1,[r0]