- CPU在启动运行一个任务时,CPU的各寄存器总是需要预置一些初始数据,例如指向任务的指针、程序状态字PSW等
- 由于它们都是任务的私有数据,所以应该将它们都存放在任务堆栈
- 当任务获取CPU的使用权时,就把堆栈的内容复制到CPU的各寄存器中,从而使任务顺利运行
- 例程:
/********************************************************* * 函数名: 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指向剩余栈的栈顶 }
【4】从0到1教你写uC/OS-III————>堆栈初始化
最新推荐文章于 2024-03-14 23:50:32 发布