OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3869|回复: 6

初始化任务堆栈问题,去掉指针自减也能运行?

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-12-12
在线时间
9 小时
发表于 2022-3-3 22:34:21 | 显示全部楼层 |阅读模式
1金钱
大家好,问个钻牛角尖的问题初始化任务堆栈中为什么刚开始就要使指针自减1,感觉上就是空的,为什么不直接写xPSR呢?浪费一个字,或者说为了保持指针自减再压栈的习惯?还是有别的什么原因呢

最佳答案

查看完整内容[请看2#楼]

看看是不是这个意思https://zhidao.baidu.com/question/2058021855716773587.html
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2034
金钱
2034
注册时间
2021-7-17
在线时间
635 小时
发表于 2022-3-3 22:34:22 | 显示全部楼层
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-12-12
在线时间
9 小时
 楼主| 发表于 2022-3-3 22:35:41 | 显示全部楼层
  1. StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
  2. {
  3.   [color=Red]  pxTopOfStack--; [/color]                                                                        /* 栈顶地址减1,相当于向下移动4个地址 */
  4.     *pxTopOfStack = portINITIAL_XPSR;                                   /* xPSR = 0x01000000,其中bit24被置1,表示使用Thumb指令*/
  5.     pxTopOfStack--;
  6.     *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK;        /* 任务函数指针 */
  7.     pxTopOfStack--;
  8.    *pxTopOfStack = ( StackType_t ) prvTaskExitError;           /* LR为函数指针prvTaskExitError,由移植层提供的一个出错处理函数*/
  9.     pxTopOfStack -= 5;                                                                  /* R12, R3, R2 and R1. */

  10.     *pxTopOfStack = ( StackType_t ) pvParameters;           /* R0,此寄存器为传递参数 */
  11.     pxTopOfStack -= 8;                                                                  /* R11, R10, R9, R8, R7, R6, R5 and R4. */

  12.     return pxTopOfStack;
  13. }
复制代码
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-12-12
在线时间
9 小时
 楼主| 发表于 2022-3-4 21:39:02 | 显示全部楼层
用keil仿真试了下,切换任务出栈时,最后PSP会指向栈数组的最后一个地址+4。看似溢出了,但出栈结束后,不需要再弹出数据,只要写数据。到时又是回到数组的最后一个元素。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2016-8-2
在线时间
14 小时
发表于 2022-3-7 16:26:48 | 显示全部楼层
因为在STM32中,栈的生长方向是向下生长的,且是满栈。满栈是指栈顶指针指向的是最后存入的有效数据,而非待存入的栈空间,所以要操作栈的话首先要做双字对齐(M3以下是双字,如果是M4处理器的话,因为涉及到浮点数运算,要做8字节对齐),然后进行地址减一操作,指向待入栈的空间,最后是赋值
回复

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-3-11 15:59:46 | 显示全部楼层
wzj2265 发表于 2022-3-7 16:26
因为在STM32中,栈的生长方向是向下生长的,且是满栈。满栈是指栈顶指针指向的是最后存入的有效数据,而非 ...

在入栈,岂不是又要减
回复

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2022-3-11 16:04:44 | 显示全部楼层
ChenRyan 发表于 2022-3-3 22:34
看看是不是这个意思https://zhidao.baidu.com/question/2058021855716773587.html

这个是C语言的,stm32的堆栈是向下增长的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表