OpenEdv-开源电子网

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

关于ucos堆栈初始化函数中的寄存器地址

[复制链接]

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-1-5
在线时间
0 小时
发表于 2015-10-15 16:48:55 | 显示全部楼层 |阅读模式
5金钱


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                                      */

                                                 /* 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                                                 */

    return (stk);
}


请问0x04040404L对应的就是STM32的R4寄存器地址吗?不是说这些通用寄存器以及特殊寄存器没有地址的吗?如果没有,那os怎么把这些寄存器的数值存档在建立的任务堆栈中?

最佳答案

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

这个压栈顺序,是处理器决定的。 并不需要软件指定。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-15 16:48:56 | 显示全部楼层
这个压栈顺序,是处理器决定的。
并不需要软件指定。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-15 17:03:03 | 显示全部楼层
谁跟你说的通用寄存器没地址,你自己杜撰的?
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-1-5
在线时间
0 小时
 楼主| 发表于 2015-10-16 10:30:36 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
麻烦你给出答案再数落人好吗?
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-16 11:04:36 | 显示全部楼层
回复【3楼】mystm32:
---------------------------------
好吧,是我想的简单了,概念搞混了

--------------------------------------


51通用寄存器:http://zhidao.baidu.com/link?url=IChTgzkwVO6_j31klpSfiPhau_nCoFbJHnnl-XkICG41MjnxOMMZIgAVwz35vjb38J6sGpC6eiSNBGaFRv1iUa
STM32通用寄存器:http://www.openedv.com/posts/list/46263.htm

抱歉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

15

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-5-18
在线时间
35 小时
发表于 2017-7-18 12:00:38 | 显示全部楼层
我也不懂  往堆栈里写  0x01010101L 这是什么意思,请各位指教一下
回复

使用道具 举报

38

主题

195

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1168
金钱
1168
注册时间
2015-11-9
在线时间
247 小时
发表于 2017-7-18 12:45:48 | 显示全部楼层
caokangchun 发表于 2017-7-18 12:00
我也不懂  往堆栈里写  0x01010101L 这是什么意思,请各位指教一下

这个只是初始化各个task的初始化堆栈,也就是每个任务第一次执行的时候你希望要的状态,一般也就是PC,xPSR,LR这三个寄存器的值有意义,其他寄存器实质没什么意义,不一定非要是上面的值
回复

使用道具 举报

15

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-5-18
在线时间
35 小时
发表于 2017-7-18 13:52:28 | 显示全部楼层
哦  是说,任务第一次执行的时候,把这些值写进寄存器的意思是吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-19 01:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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