[应用相关] RT-Thread ——初始化线程栈

[复制链接]
1358|7
 楼主| stm32jy 发表于 2019-1-29 20:20 | 显示全部楼层 |阅读模式
线程第一次运行的时候,加载到CPU寄存器的参数就放在线程栈里面,改函数 rt_hw_stack_init()在cpuport.c中实现。
 楼主| stm32jy 发表于 2019-1-29 20:21 | 显示全部楼层

具体代码如下:

  1. /*  初始化线程栈  */
  2. rt_uint8_t *rt_hw_stack_init(void      *tentry,
  3.                                    void      *parameter,
  4.                                                                                                                  rt_uint8_t   *stack_addr)
  5. {
  6.       struct stack_frame *stack_frame;
  7.             rt_uint8_t  *stk;
  8.             unsigned long  i;
  9.        
  10.             /* 获取栈顶指针 rt_hw_stack_init 在调用时,传给stack_addr的是(栈顶指针-4)*/
  11.             stk = stack_addr + sizeof(rt_uint32_t);
  12.             
  13.             /*让stk指针向下8字节对齐*/
  14.             stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk,8);
  15.        
  16.             /*stk指针继续向下移动sizeof(struct stack_frame)个偏移*/
  17.             stk -=sizeof(struct stack_frame);
  18.             
  19.             /* 将stk指针强制转换为 stack_frame类型后存到stack_frame*/
  20.             stack_frame =(struct stack_frame *)stk;
  21.        
  22.             /*以stack_frame 为起始地址,将栈空间里面的sizeof(struct stack_frame)个内存初始化为0xdeadbeef */
  23.             for(i=0; i<sizeof(struct stack_frame)/sizeof(rt_uint32_t); i++)
  24.             {
  25.                     ((rt_uint32_t *)stack_frame)[i] = 0xdeadbeef;
  26.                   }
  27.             
  28.                         /*初始化异常发生时自动保存的寄存器*/
  29.                         stack_frame->exception_stack_frame.r0 =(unsigned long)parameter;
  30.                         stack_frame->exception_stack_frame.r1  = 0;                        /* r1 */
  31.       stack_frame->exception_stack_frame.r2  = 0;                        /* r2 */
  32.       stack_frame->exception_stack_frame.r3  = 0;                        /* r3 */
  33.       stack_frame->exception_stack_frame.r12 = 0;                        /* r12 */
  34.       stack_frame->exception_stack_frame.lr  = 0;                        /* lr */
  35.       stack_frame->exception_stack_frame.pc  = (unsigned long)tentry;    /* entry point, pc */
  36.       stack_frame->exception_stack_frame.psr = 0x01000000L;              /* PSR */
  37.       
  38.                         /* 返回线程指针 */
  39.                         return stk;
  40. }


 楼主| stm32jy 发表于 2019-1-29 20:21 | 显示全部楼层
代码 stk = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stk,8);   让stk这个指针向下8个字节对齐,确保stk是8字节对齐的地址。
 楼主| stm32jy 发表于 2019-1-29 20:22 | 显示全部楼层
代码 stk -=sizeof(struct stack_frame);     stk 指针继续向下移动sizeof(struct stack_frame)个偏移,即16字的大小。
 楼主| stm32jy 发表于 2019-1-29 20:23 | 显示全部楼层
代码 stack_frame =(struct stack_frame *)stk;   将stk指针强制转换为stack-frame类型后存到指针变量stack_frame中。
 楼主| stm32jy 发表于 2019-1-29 20:24 | 显示全部楼层

改函数最终会返回线程栈顶指针stk, 在线程栈初始化函数中,定义了struct  stack_frame 类型的结构体指针stack_frame,改结构体类型具体如下:

  1. struct exception_stack_frame
  2. {
  3.    /*异常发生时自动加载CPU寄存器的内容*/
  4.          rt_uint32_t  r0;
  5.          rt_uint32_t  r1;
  6.          rt_uint32_t  r2;
  7.          rt_uint32_t  r3;
  8.          rt_uint32_t  r12;
  9.          rt_uint32_t  lr;
  10.    rt_uint32_t  pc;
  11.          rt_uint32_t  psr;
  12. };


  13. struct stack_frame
  14. {
  15.    /*异常发生时需要手动加载CPU寄存器的内容*/
  16.          rt_uint32_t   r4;
  17.          rt_uint32_t   r5;
  18.          rt_uint32_t   r6;
  19.          rt_uint32_t   r7;
  20.          rt_uint32_t   r8;
  21.          rt_uint32_t   r9;
  22.    rt_uint32_t   r10;
  23.          rt_uint32_t   r11;
  24.          struct exception_stack_frame   exception_stack_frame;
  25. };


 楼主| stm32jy 发表于 2019-1-29 20:24 | 显示全部楼层
这个还是比较简单的,初学STM32 RTT
mmuuss586 发表于 2019-1-29 20:36 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

1118

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部