新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > GNU ARM汇编--(十四)GNU ARM汇编下做任务调度

GNU ARM汇编--(十四)GNU ARM汇编下做任务调度

作者: 时间:2016-11-26 来源:网络 收藏
以前工作中用过arm7,没有MMU,也没有用任何OS.现在回忆当时的代码结构,我觉得可以叫无限循环的有限状态机.arm7不跑OS,就相当于单片机,单片机跑的肯定是无限死循环.有限状态机是因为整个代码要处理很多外部的事情,那就是大的循环里面来套小循环,以轮询的方式来检查外界的变化,然后系统作出变化,系统在有限的状态中切换.

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
  1. kernelScheduler:
  2. /*
  3. @---------------------------------------------------
  4. @RoundRobinScheduler
  5. @---------------------------------------------------
  6. */
  7. CurrentTask:
  8. ldrr3,=PCB_CurrentTask
  9. ldrr0,[r3]
  10. ldrr1,=PCB_Table
  11. ldrr1,[r1,r0,LSL#2]
  12. ldrr2,=PCB_PtrCurrentTask
  13. strr1,[r2]
  14. /*
  15. @**PCB_PtrCurrentTask-updatedwiththenewaddress
  16. */
  17. NextTask:
  18. addr0,r0,#1
  19. cmpr0,#3
  20. moveqr0,#0
  21. strr0,[r3]
  22. ldrr1,=PCB_Table
  23. ldrr1,[r1,r0,LSL#2]
  24. ldrr0,=PCB_PtrNextTask
  25. strr1,[r0]
  26. /*
  27. @**PCB_PtrCurrentTask=currentPCB
  28. @**PCB_PtrNextTask=nextPCB
  29. @**PCB_CurrentTask=newTASK_ID
  30. @------------------------------------------------------
  31. @ContextSwitch
  32. @------------------------------------------------------
  33. */
  34. handler_contextswitch:
  35. ldmfdsp!,{r0-r12,r14}
  36. ldrr13,=PCB_PtrCurrentTask
  37. ldrr13,[r13]
  38. subr13,r13,#60
  39. stmiar13,{r0-r14}^
  40. mrsr0,SPSR
  41. stmdbr13,{r0,r14}
  42. ldrr13,=PCB_PtrNextTask
  43. ldrr13,[r13]
  44. subr13,r13,#60
  45. ldmdbr13,{r0,r14}
  46. msrspsr_cxsf,r0
  47. ldmiar13,{r0-r14}^
  48. ldrr13,=PCB_TopOfIRQStack
  49. ldrr13,[r13]
  50. movspc,r14
  51. .end

一共写了3个静态任务,第一个任务做一个简单的算术运算,第二个任务是一个流水灯,而第三个任务是利用蜂鸣器来产生旋律.

仅贴出第三个任务的代码:


上一页 1 2 下一页

关键词: ARM汇编任务调

评论


技术专区

关闭