Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424907
  • 博文数量: 103
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-15 22:17
文章分类

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: LINUX

2012-11-18 20:34:11

在main函数中不能init中断,只能创建task 和event(消息队列消息邮箱等),在系统的第一个子程序中才能init中断,开启timetick开始调度任务,中断向量表应该在main函数运行之前的汇编boot函数中就已经确定了。
看一下main中的最后一个函数调用

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * START MULTITASKING
  4. *
  5. * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
  6. * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
  7. * and you MUST have created at least one task.
  8. *
  9. * Arguments : none
  10. *
  11. * Returns : none
  12. *
  13. * Note : OSStartHighRdy() MUST:
  14. * a) Call OSTaskSwHook() then,
  15. * b) Set OSRunning to OS_TRUE.
  16. * c) Load the context of the task pointed to by OSTCBHighRdy.
  17. * d_ Execute the task.
  18. *********************************************************************************************************
  19. */

  20. void OSStart (void)
  21. {
  22.     if (OSRunning == OS_FALSE) {
  23.         OS_SchedNew(); /* Find highest priority's task priority number */
  24.         OSPrioCur = OSPrioHighRdy;
  25.         OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
  26.         OSTCBCur = OSTCBHighRdy;
  27.         OSStartHighRdy(); /* Execute target specific code to start task */
  28.     }
  29. }

在task创建函数中我们已经将就绪表中我们创建的函数置为rdy,也就是说,所有初始化创建的任务都是就绪态
那么直接开始调度函数OS_SchedNew,就会将OSPrioHighRdy设置为task0
第二部,将调度程序求出来的最高优先级赋值给OSPrioCur
第三步,将指向当前运行TCB的指针OSTCBCur指向最高优先级的taskTCB
第四步,调用OSStartHighRdy函数

点击(此处)折叠或打开

  1. ;*********************************************************************************************************
  2. ; START MULTITASKING
  3. ; void OSStartHighRdy(void)
  4. ;
  5. ; The stack frame is assumed to look as follows:
  6. ;
  7. ; Entry Point(Task Name) (High memory)
  8. ; LR(R14)
  9. ; R12
  10. ; R11
  11. ; R10
  12. ; R9
  13. ; R8
  14. ; R7
  15. ; R6
  16. ; R5
  17. ; R4
  18. ; R3
  19. ; R2
  20. ; R1
  21. ; R0 : argument
  22. ; OSTCBHighRdy->OSTCBStkPtr --> CPSR (Low memory)
  23. ;
  24. ; Note : OSStartHighRdy() MUST:
  25. ; a) Call OSTaskSwHook() then,
  26. ; b) Set OSRunning to TRUE,
  27. ; c) Switch to the highest priority task.
  28. ;********************************************************************************************************** */
  29. OSStartHighRdy
  30. ;----------------------------------------------------------------------------------
  31. ; OSRunning = TRUE;
  32. ;----------------------------------------------------------------------------------
  33. MSR CPSR_cxsf,#SVCMODE|NOINT ;Switch to SVC mode with IRQ&FIQ disable
  34. BL OSTaskSwHook ;Call user define Task switch hook
  35. LDR R0, =OSRunning ; OSRunning =TRUE
  36. MOV R1, #1
  37. STRB R1, [R0]
  38. ;----------------------------------------------------------------------------------
  39. ; SP = OSTCBHighRdy->OSTCBStkPtr;
  40. ;----------------------------------------------------------------------------------
  41. LDR R0, =OSTCBHighRdy
  42. LDR R0, [R0]
  43. LDR SP, [R0]
  44. ;----------------------------------------------------------------------------------
  45. ; Prepare to return to proper mode
  46. ;----------------------------------------------------------------------------------
  47. LDMFD SP!, {R0}
  48. MSR SPSR_cxsf, R0
  49. LDMFD SP!, {R0-R12, LR, PC}^
OSRunning =TRUE,SP = OSTCBHighRdy->OSTCBStkPtr;弹出堆栈中的上下文
 
很有必要认真学习ARM和x86体系的汇编语言和简单的boot驱动
以便更好的移植各种操作系统
 
 
阅读(2424) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~