GNU ARM汇编--(十四)GNU ARM汇编下做任务调度
OS的一个标识就是支持多任务的并发.比方说linux,我们看起来是多个进程在同时运行,实际上还是cpu运行一下这个进程,再运行一下其他进程.这个就涉及到上下文切换以及进程调度的算法.当然我这里说的是单核的情况,如果是SMP的话,可能有些区别.暂时也没研究linux下的进程调度,但是通过自己写个最简单的任务调度可以理解任务调度是个什么回事.其实说到底任务调度就是那么回事.据说linux的最初版本,就是两个任务在不停的打印AB...
本文引用地址:https://www.eepw.com.cn/article/201611/321717.htm硬件平台是s3c2440:
利用RTC的Tick中断,在中断处理中进行任务的调度,调度算法采用最简单的轮循.
其中核心就是中断的写法,PCB的建立和任务调度中任务堆栈的保存和恢复:
调度的代码参考《ARM System Developers Guide》一书.
给出scheduler.S的代码:
[cpp]view plaincopy
- kernelScheduler:
- /*
- @---------------------------------------------------
- @RoundRobinScheduler
- @---------------------------------------------------
- */
- CurrentTask:
- ldrr3,=PCB_CurrentTask
- ldrr0,[r3]
- ldrr1,=PCB_Table
- ldrr1,[r1,r0,LSL#2]
- ldrr2,=PCB_PtrCurrentTask
- strr1,[r2]
- /*
- @**PCB_PtrCurrentTask-updatedwiththenewaddress
- */
- NextTask:
- addr0,r0,#1
- cmpr0,#3
- moveqr0,#0
- strr0,[r3]
- ldrr1,=PCB_Table
- ldrr1,[r1,r0,LSL#2]
- ldrr0,=PCB_PtrNextTask
- strr1,[r0]
- /*
- @**PCB_PtrCurrentTask=currentPCB
- @**PCB_PtrNextTask=nextPCB
- @**PCB_CurrentTask=newTASK_ID
- @------------------------------------------------------
- @ContextSwitch
- @------------------------------------------------------
- */
- handler_contextswitch:
- ldmfdsp!,{r0-r12,r14}
- ldrr13,=PCB_PtrCurrentTask
- ldrr13,[r13]
- subr13,r13,#60
- stmiar13,{r0-r14}^
- mrsr0,SPSR
- stmdbr13,{r0,r14}
- ldrr13,=PCB_PtrNextTask
- ldrr13,[r13]
- subr13,r13,#60
- ldmdbr13,{r0,r14}
- msrspsr_cxsf,r0
- ldmiar13,{r0-r14}^
- ldrr13,=PCB_TopOfIRQStack
- ldrr13,[r13]
- movspc,r14
- .end
一共写了3个静态任务,第一个任务做一个简单的算术运算,第二个任务是一个流水灯,而第三个任务是利用蜂鸣器来产生旋律.
仅贴出第三个任务的代码:
评论