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

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: LINUX

2012-11-28 20:40:44

在OS_cpu_c.c中确定了任务堆栈的格式,这个格式根据不同的体系结构不同的寄存器结构有所不同,因为在上下文切换时需要将所有相关的寄存器(除了任务堆栈指针SP)压入堆栈,从而起到保护上下文的作用
修改任务堆栈初始化函数,这个函数在建立TCB的时候使用,建立TCB链表在系统初始化阶段就完成了

点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************************
  3. * INITIALIZE A TASK'S STACK
  4. *
  5. * Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the
  6. * stack frame of the task being created. This function is highly processor specific.
  7. *
  8. * Arguments : task is a pointer to the task code
  9. *
  10. * p_arg is a pointer to a user supplied data area that will be passed to the task
  11. * when the task first executes.
  12. *
  13. * ptos is a pointer to the top of stack. It is assumed that 'ptos' points to
  14. * a 'free' entry on the task stack. If OS_STK_GROWTH is set to 1 then
  15. * 'ptos' will contain the HIGHEST valid address of the stack. Similarly, if
  16. * OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address
  17. * of the stack.
  18. *
  19. * opt specifies options that can be used to alter the behavior of OSTaskStkInit().
  20. * (see uCOS_II.H for OS_TASK_OPT_???).
  21. *
  22. * Returns : Always returns the location of the new top-of-stack' once the processor registers have
  23. * been placed on the stack in the proper order.
  24. *
  25. * Note(s) : 1) Interrupts are enabled when your task starts executing.
  26. * 2) All tasks run in SVC mode.
  27. *********************************************************************************************************
  28. */

  29. OS_STK *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)
  30. {
  31.     OS_STK *stk;

  32.     opt = opt; /* 'opt' is not used, prevent warning */
  33.     
  34.     stk = ptos; /* Load stack pointer */
  35.     
  36.     *(stk) = (OS_STK)task; /* Entry Point */
  37.     *(--stk) = (INT32U)0;     /* LR */
  38.     *(--stk) = (INT32U)0;     /* R12 */
  39.     *(--stk) = (INT32U)0;     /* R11 */
  40.     *(--stk) = (INT32U)0;     /* R10 */
  41.     *(--stk) = (INT32U)0;     /* R9 */
  42.     *(--stk) = (INT32U)0;     /* R8 */
  43.     *(--stk) = (INT32U)0;     /* R7 */
  44.     *(--stk) = (INT32U)0;     /* R6 */
  45.     *(--stk) = (INT32U)0;     /* R5 */
  46.     *(--stk) = (INT32U)0;     /* R4 */
  47.     *(--stk) = (INT32U)0;     /* R3 */
  48.     *(--stk) = (INT32U)0;     /* R2 */
  49.     *(--stk) = (INT32U)0;     /* R1 */
  50.     *(--stk) = (INT32U)p_arg;        /* R0 : argument */
  51.     *(--stk) = (INT32U)0x00000013L; /* CPSR (SVC mode, Enable both IRQ and FIQ interrupts) */
  52.                                      
  53.     return (stk);
  54. }
在ARM体系结构中,共有R0-R15(sp=R13,LR=R14,PC=R15)和状态寄存器CPSR 非中断情况,这些以一定的格式被存储在堆栈中,在DSP中寄存器必然有所不同,使用其中一个寄存器作为SP,其余都可以进行保存。
另外在这个文件中还有许多hook函数,这些函数起到的作用是在某些重要的时间节点,如tick或者TCBinit时进行用户自定义的操作,方便许多
 
修改void ISRInit(void)中断初始化函数,这个函数在系统创建的第一个运行的task中实现,用来启动tick,定时器中断触发上一个文章中OS_CPU_a.s中的OSTickISR函数

点击(此处)折叠或打开

  1. void ISRInit(void)
  2. {
  3.     // 设置中断控制器
  4.     rPRIORITY = 0x00000080;        // 使用默认的固定的优先级
  5.     rINTMOD = 0x00000000;        // 所有中断均为IRQ中断
  6.     pISR_TIMER0= (uint32) OSTickISR;
  7.     rINTMSK &= ~(1<<10);            // 打开TIMER0中断允许
  8. //**********************************************************
  9. }

在DSP中使用interrupt();函数关联定时器中断和服务子程序,配置全局寄存器设置优先级和使能中断
 
修改中断开关宏!
设置状态寄存器CPSR
读取CPSR状态查看是否成功,如果不成功重新设置
如果成功子程序返回
其实可以使用c语言编写,这是个宏,甚至可以在宏中直接设置寄存器实现
 
MOV PC LR 的使用:
当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复。
异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址。

另外注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址,大家可以试一下用mov pc,pc,结果得到的是跳转两条指令,这个原因是由于arm的流水线造成的,预取两条指令的结果.
 

另:子程序返回的三种方法:1.MOV PC,LR 2.BL LR 3 STMFD    SP!,{,LR}压栈弹栈


最后完成数据的重新定义,在文件OS_CPU.h中配置各种数据格式,堆栈增长方式

阅读(1813) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~