嵌入式开发交流网论坛
标题: 任务创建堆栈初始化 [打印本页]
作者: 看狡灿鼻 时间: 2019-2-22 05:31
标题: 任务创建堆栈初始化
[attach]26327[/attach]
0x01
摘要
前面介绍到ucos任务初始化过程中会有堆栈和TCB初始化的过程,堆栈是任务在切换过程中用于保存寄存器变量或者恢复寄存器变量的一个数组,为了保证任务工作的正常需要对其内容进行初始化,避免一些不可预知的错误。
0x02
引言
Ucos的任务创建时对堆栈进行初始化,初始化堆栈相对来说进行了操作比较简单,主要是对用户自己建立的用来存放堆栈数据的数组进行初始化,我们在下面具体介绍其实现的方式。
0x03
原理
这里采用源码加讲解嵌套进行的方式进行,这样理解起来比较简单,所有源码均从ucos的源代码中直接复制过来的。
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
这里是函数名,具体的参数意思和上一篇文章相同。
{
OS_STK *stk;
建立了一个堆栈数组型的指针,用于接收传进来的堆栈数组指针。
(void)opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer*/
这里将传进来的数组指针赋值给前面建立的指针,便于下面继续操作。
/* Registers stacked as if auto-saved on exception */
*(stk) = (INT32U)0x01000000L;/*xPSR*/
*(--stk) = (INT32U)task;/* Entry Point*/
*(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/
*(--stk) = (INT32U)0x12121212L;/*R12*/
*(--stk) = (INT32U)0x03030303L;/* R3 */
*(--stk) = (INT32U)0x02020202L;/* R2*/
*(--stk) = (INT32U)0x01010101L;/* R1 */
*(--stk) = (INT32U)p_arg;/* R0 : argument */
这部分主要是用来存放任务切换时芯片自动进行存放的内容,各个寄存器的所存放内容的意思大家可以参考芯片手册。当任务进入到切换任务的汇编函数时,便将以上寄存器直接存放到这里,其地址通过PSP这个寄存器获取。
/* Remaining registers saved on process stack */
*(--stk) = (INT32U)0x11111111L;/* R11*/
*(--stk) = (INT32U)0x10101010L;/* R10*/
*(--stk) = (INT32U)0x09090909L;/* R9 */
*(--stk) = (INT32U)0x08080808L;/* R8*/
*(--stk) = (INT32U)0x07070707L;/* R7 */
*(--stk) = (INT32U)0x06060606L;/* R6*/
*(--stk) = (INT32U)0x05050505L;/* R5*/
*(--stk) = (INT32U)0x04040404L;/* R4 */
以上这些寄存器便是需要系统自行进行存储的内容,在PendSV中断函数中,有一段SUBS R0, R0, #0x20就表示将地址跳过前面自动存储的区域,指向这一块区域,然后用汇编存储。这里需要给大家说的stm32系列的栈是递减满栈,所以当初始化传入的堆栈地址应该是定义的堆栈数组的最高地址。
return (stk);
这里将堆栈的最低地址返回给函数,这个地址主要是给任务的TCB初始化使用。TCB的初始化在下面一文中再进行讲解。
}
0x04
结论
任务堆栈的初始化,确切的说应该将任务的栈初始化,堆和栈是两个不同的意思,如果大家不理解可以到网上查看具体的解释。栈的生长方向和空漫栈是和芯片的型号有关,这两个概念容易让人混淆,大家可以去查看相关资料,网上有很多的资料,总有几篇适合你的。
如果大家对任务的栈理解不是很深,可以再结合前面讲解的PendSV中断函数的汇编代码中的栈存储结合起来一起了解,这样能有助于大家增加印象和理解。
Change
你的努力
我的付出
大家的支持
终将化作生命辉煌
如有任何疑问请后台回复
或添加作者Waiting_B_H
知识传播是一种美德
让更多人少走弯路
才能有更多人与你携手前进
欢迎扫码一起分享经验
[attach]26328[/attach]
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/) |
Powered by Discuz! X3.2 |