【4】从0到1教你写uC/OS-III————>堆栈初始化

  1. CPU在启动运行一个任务时,CPU的各寄存器总是需要预置一些初始数据,例如指向任务的指针、程序状态字PSW等
  2. 由于它们都是任务的私有数据,所以应该将它们都存放在任务堆栈
  3. 当任务获取CPU的使用权时,就把堆栈的内容复制到CPU的各寄存器中,从而使任务顺利运行
  4. 例程:
    /*********************************************************
     * 函数名:
            CPU_STK *OSTashkStkInit(    OS_TASK_PTR     p_task,     //任务名
                                        void            *p_arg,      //形参,用于传递参数
                                        CPU_STK         *p_stk_base,//任务堆栈的起始地址
                                        CPU_STK_SIZE    stk_size    //堆栈大小
                                    )
     * 描述  :M3处理器的栈是由高到低生长,初始栈时,要找到栈顶地址; 
     * 输入  :无
     * 输出  :无
     * 返回  :无 
     * 调用  :内部调用 
     **********************************************************/
    CPU_STK *OSTashkStkInit(    OS_TASK_PTR     p_task,     //任务名
                                void            *p_arg,      //形参,用于传递参数
                                CPU_STK         *p_stk_base,//任务堆栈的起始地址
                                CPU_STK_SIZE    stk_size    //堆栈大小
                            )
    {
        CPU_STK     *p_stk;
        
        p_stk = &p_stk_base[stk_size];
        
        //异常发生时     自动      保存的寄存器
        *--p_stk = (CPU_STK)0x01000000u;        //xPSR的bit24必须置1;否则进入ARM模式,运行异常
        *--p_stk = (CPU_STK)p_task;             //任务的入口地址;
        *--p_stk = (CPU_STK)0x14141414u;        //R14 (lr)
        *--p_stk = (CPU_STK)0X12121212U;        //r12
        *--p_stk = (CPU_STK)0x03030303u;        //r3
        *--p_stk = (CPU_STK)0x02020202u;        //r2
        *--p_stk = (CPU_STK)0x01010101u;        //r1
        *--p_stk = (CPU_STK)p_arg;              //r0:任务异常
        
        //异常发生时     手动      保存的寄存器
        *--p_stk = (CPU_STK)0x11111111u;        //r11
        *--p_stk = (CPU_STK)0x10101010u;        //r10
        *--p_stk = (CPU_STK)0x09090909u;        //r9
        *--p_stk = (CPU_STK)0x08080808u;        //r8
        *--p_stk = (CPU_STK)0x07070707u;        //r7
        *--p_stk = (CPU_STK)0x06060606u;        //r6
        *--p_stk = (CPU_STK)0x05050505u;        //r5
        *--p_stk = (CPU_STK)0x04040404u;        //r4
        
        return (p_stk);                         //返回栈指针p_stk,这时p_stk指向剩余栈的栈顶
    } 
发布了24 篇原创文章 · 获赞 1 · 访问量 1507

猜你喜欢

转载自blog.csdn.net/Linux_ARM9/article/details/105152269