OpenEdv-开源电子网

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

关于双堆栈的问题!

[复制链接]

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
发表于 2012-11-24 00:06:44 | 显示全部楼层 |阅读模式
 我正在研究堆栈的问题!想试一下进程堆栈是如何操作的!但是总是找不到配置寄存器CONTROL 的物理地址!请问它具体的物理地址是多少!最好是截图那一页!怎样设置为PSP!请原子哥指点!谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 01:53:08 | 显示全部楼层
你用的是STM32吗?Cortex M 的CONTROL是没有地址的,要读写的话需要用特别的指令,
比如把program stack pointer 读到R0,可以用
MRS   R0,PSP
把R0的值写到那个SP用
MSR   SP,R0
如果你想切换去用那个SP,可以先读出CONTROL,改完写回去,
比如当前用的是MSP想切换到用PSP可以这样
MRS   R0,CONTROL
ORR   R0, R0, #2     ;//bit[1] 0 选择MSP, 1选择PSP
MSR   CONTROL, R0
ISB                         ;//资料上说了需要加ISB确保后面用的是新选择的SP,好像跟预取指令
                     ;//相关,详细的没研究
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-11-24 11:20:57 | 显示全部楼层
顶一楼。
回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-24 19:46:21 | 显示全部楼层
回复【2楼】edmundchang:
你用的是STM32吗?Cortex M 的CONTROL是没有地址的,要读写的话需要用特别的指令, 比如把program stack pointer 读到R0,可以用 MRS   R0,PSP 把R0的值写到那个SP用 MSR   SP,R0 如果你想切换去用那个SP,可以先读出CONTROL,改完写回去, 比如当前用的是MSP想切换到用PSP可以这样 MRS   R0,CONTROL ORR   R0, R0, #2     ;//bit[1] 0 选择MSP, 1选择PSP MSR   CONTROL, R0 ISB                         ;//资料上说了需要加ISB确保后面用的是新选择的SP,好像跟预取指令                      ;//相关,详细的没研究
---------------------------------
那就是说我不能用C直接访问了是吗!谢谢 !
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 22:03:25 | 显示全部楼层
回复【4楼】lgh050706:
---------------------------------
用C的话,好像有一些指令吧,好像不同的编译器提供的不一样,具体我也没研究,
比如我用的是KEIL, 汇编关中断是
CPSID   I
用C的话是   __disable_irq();

至于SP的操作就不清楚了,我用的是在C里面插汇编
比如你当前用的是MSP,想切换到PSP,可以(两下划线 __asm)
__asm void CHANGE_TO_PSP(unsigned int NOT_USE){
    MRS    R0, CONTROL
    ORR    R0, R0, #2
    MSR   CONTROL, R0
}
切到MSP可以
__asm void CHANGE_TO_MSP(unsigned int NOT_USE){
   MRS   R0, CONTROL
   BIC    R0, R0, #2
   MSR   CONTROL, R0
}
那个NOT_USE是因为你调用这个汇编的时候他用到他用到R0, 如果没参数没返回的话,怕影响到你原来的函数里用到R0的值
定义为带参数的话,编译器会躲开他,你也可以在汇编的程序里把R0存到SP里在返回前取回来,我觉得定义传一个参数比较方便

如果你想读出当前的SP,可以直接用MOV   R0, SP  
读出MSP
__asm unaigned int READ_MSP(void){
    MRS  R0, MSP
}
读出PSP
__asm unsigned int READ_PSP(void){
   MRS  R0, SP
}
写MSP
__asm void SET_MSP(unsigned int SP){
   MSR   MSP, R0
}
写PSP
__asm void SET_PSP(unsigned int SP){
   MSR   SP, R0
}
刚刚查了下资料,原来之前说的PSP错了,不是program stack pointer, 是process stack pointer才对,不好意思,
这资料上也找到了一些C的用法,可以直接用,不需要查汇编,
PSP C操作可以用
uint32_t __get_PSP(void);
void __set_PSP(uint32_t TopOfProcStack);
MSP C操作可以用
uint32_t  __get_MSP(void);
void __set_MSP(uint32_t TopOfMainStack);
CONTROL C 操作
uint32_t __get_CONTROL(void);
void __set_CONTROL(uint32_t value);
具体看看DUI0552A_cortex_m3_dgug.pdf,我试一下能否上载,因为我是刚进来的新人不知道能不能上载






回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 22:10:12 | 显示全部楼层
貌似可以上传

DUI0552A_cortex_m3_dgug.pdf

1.32 MB, 下载次数: 1009

回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-24 22:35:39 | 显示全部楼层
edmundchang :谢谢大哥!还有一个问题!CONTROL寄存器其它位的功能资料好像没有说啊!是不是啊!以下是CM3权威指南里的!只说到低两位,其它位没有说!英文低子不好!那资料看一起有点吃力!







回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 22:46:29 | 显示全部楼层
回复【7楼】lgh050706:
---------------------------------
我手头上的资料也只是说这两位,其他的没用,如果刚刚那资料你看不明白我现在说一下,不过我这部分没用过C的,所以不知道有没有错,
如果你当前是MSP想切换到PSP
unsigned int TEMP;
TEMP = __get_CONTROL();   //读出当前CONTROL
TEMP |= 2;  //设bit[1] 为1
__set_CONTROL();   //写回去

这样就可以了,如此类推
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 22:56:52 | 显示全部楼层
特权级跟用户级我也比较纠结,搞不明白,比如我在进入用户程序前把模式设为用户级别,用户级别的限制是不能用MRS,MSR
等等的指令,可是如果我的程序在用户级别要切换任务需要用到MRS,MSR这些命令怎么办呢?是不是需要一些类似SWI的
操作让他进入中断呢?后来我就干脆让用户程序也用特权模式算了,
请问一下有没有人有琢磨过可以分享一下经验的?
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 22:56:55 | 显示全部楼层
另外还想问一下有没有那位大哥有接触过STM32W的?
我想用STM32W简单的收发一下数据,不需要复杂的协议,比如zigbee之类的都不需要,只要能当作普通的STM32F1来用,然后可以
读写他收发相关的寄存器来收发数据就OK了,,
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-11-24 23:23:57 | 显示全部楼层
回复【5楼】edmundchang:
---------------------------------

1. embedded asm 不是 inline asm, 光这样一句不一定能用的,最好看一下 MDK 的帮助文档 Restrictions on embedded assembly language functions in C and C++ code

2. 这些函数不要自己写, 有标准的 intrinsic function, core_cm3

https://github.com/roxma
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 23:28:24 | 显示全部楼层
回复【11楼】Pony279:
---------------------------------
谢谢你,可是在我找到这些文件之前我已经这样写好了,所以就没改,
请问一下你对那个特权模式熟悉吗?能否说一下?
谢谢你
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-11-24 23:31:25 | 显示全部楼层
回复【12楼】edmundchang:
---------------------------------
特权模式我不懂, 还是参考 CM3 的标准文档吧
https://github.com/roxma
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 23:36:29 | 显示全部楼层
回复【11楼】Pony279:
---------------------------------
还有想问一下,你说不一定能用是那个程序?指的是部分的指令后面后面要加一些ISB,DSB之类的来防止预取之类的问题吗?
在我的程序里有一些地方有加,因为我要做一些任务切换之类的东西,所以这部分就只好用汇编了,有其他好方法参考一下吗?
谢谢你
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-11-24 23:39:02 | 显示全部楼层
回复【14楼】 edmundchang :
---------------------------------

Restrictions on embedded assembly language functions in C and C++ code

Restrictions on embedded assembly language functions in C and C++ code

The following restrictions apply to embedded assembly language functions:

  • After preprocessing, __asm functions can only contain assembly code, with the exception of the following embedded assembler builtins:

    __cpp(expr)
    __offsetof_base(D, B)
    __mcall_is_virtual(D, f)
    __mcall_is_in_vbase(D, f)
    __mcall_offsetof_base(D, f)
    __mcall_this_offset(D, f)
    __vcall_offsetof_vfunc(D, f)[/mw_shl_code] 
  • No return instructions are generated by the compiler for an __asm function. If you want to return from an __asm function, you must include the return instructions, in assembly code, in the body of the function.

    Note

    This makes it possible to fall through to the next function, because the embedded assembler guarantees to emit the __asm functions in the order you define them. However, inlined and template functions behave differently. Do not assume that code execution falls out of an inline or template function into another embedded assembly function.

  • __asm functions do not change the ARM Architecture Procedure Call Standard (AAPCS) rules that apply. This means that all calls between an __asm function and a normal C or C++ function must adhere to the AAPCS, even though there are no restrictions on the assembly code that an __asm function can use (for example, change state).

https://github.com/roxma
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 23:43:47 | 显示全部楼层
刚刚下了STM32W的介绍,,好复杂啊,里面又MAC又什么的,看了几页就看不下去了,怪不得市面上都是卖模块的多,
看来要放弃用STM32W的念头了,

有没有人有合适的芯片推荐一下啊?我想收发器简单点的,就像nRF9E5 那样(51 + 收发器)
但我希望MCU是CM3的,
有人有合适的推荐吗?
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-24 23:54:51 | 显示全部楼层
回复【15楼】Pony279:
---------------------------------

原来这样啊,,谢谢你的提点啊,感激不尽
能否顺便帮我看一下,我这几个有没有问题,,唉,汇编的东西真麻烦,哈哈,

__asm void endSV_Handler(void)
{
IMPORT CURRENT_TCB
IMPORT READY_LIST
MRS R0, RIMASK
CPSID I

ALIGN
MRS R1, SP
VSTMFD R1!, {D8 - D15}
STMFD R1!, {R4 - R11}
LDR R2, =CURRENT_TCB
LDR R12,[R2]
STR R1, [R12]

LDR R1, =READY_LIST
LDR R1, [R1]
LDR R3, [R1]

LDMFD R3!, {R4 - R11}
IF {FPU} != "SoftVFP"
VLDMFD R3!, {D8 - D15}
ENDIF

STR R1, [R2]
MSR PSP, R3
;//---------------------------------------------------------------------------------------

MSR PRIMASK, R0
ISB
ORR LR, LR, #0x04
BX LR
}
//-------------------------------------------------------------------------------------------------------------------------
__asm void CPU_JUMP_TO_FIRST_TASK(void)
{
LDR R1, =CURRENT_TCB
LDR R1, [R1]
LDR R1, [R1]
ALIGN

BL __cpp(CPU_GET_STACK_FRAME_TOP_OFFSET)
ADD R2, R1, R0
MSR PSP, R2

BL __cpp(CPU_GET_R0_IN_STACK_OFFSET)
ADD R2, R1, R0

LDR R0, [R2, #0]
LDR LR, [R2, #20]
LDR R3, [R2, #24]
LDR R2, [R2, #28]
ALIGN

MSR APSR, R2
MRS R2, CONTROL
ORR R2, R2, #2
MSR CONTROL, R2
ISB

CPSIE I

BX R3
}
__asm unsigned int CPU_MUTEX_LOCK(unsigned int *MUTEX)
{
LDREX R1, [R0]
DMB

CBNZ R1, LOCK_FAIL

MOV R1, #1
STREX R2, R1, [R0]
DMB
CBNZ R1, LOCK_FAIL

MOV R0, #1
BX LR
LOCK_FAIL
MOV R0, #0
BX LR
}
__asm unsigned int CPU_IRQ_ENABLE(void){
MRS R0, RIMASK
CPSIE I
BX LR
}
__asm unsigned int CPU_IRQ_DISABLE(void){
MRS R0, RIMASK
CPSID I
BX LR
}
__asm void CPU_IRQ_RESTORE(unsigned int IRQ_BAK){
MSR PRIMASK, R0
BX LR
}

这些部分是参考一些书和网上找的资料的,现在系统用起来没发现什么大问题,可以帮我看看吗?
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2195
金钱
2195
注册时间
2012-2-8
在线时间
34 小时
发表于 2012-11-25 00:06:41 | 显示全部楼层
回复【17楼】edmundchang:
---------------------------------
这个我帮不了你了, 我对汇编不熟悉, 除了在微机原理实验课上用过, 基本都不写汇编代码的
https://github.com/roxma
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-25 00:15:26 | 显示全部楼层
回复【15楼】Pony279:
---------------------------------
我原来写好了这几个汇编的,后来看到__asm 的用法,想这样放在同一个C文件里贪方便,没注意到这些问题,
是不是还是该搬回去直接用汇编文件安全点呢?还是说,如果我没什么传的参数或返回的就不用管呢?
CPU_MUTEX_LOCK函数我是没怎么用了,其他有参数或返回的就IRQ那几个,可是我跟踪进去好像没问题啊,
你刚刚那个资料在那里找的?可以说一下吗?
谢谢你
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-25 00:18:46 | 显示全部楼层
我再找找资料,谢谢你提点,哈哈,要不是你说我还以为__asm是跟直接写的一样呢,差点被骗了,
谢谢你
回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-25 21:38:26 | 显示全部楼层
对于在C文件中嵌入汇编,STM32我还没有试过!所以我几个问题想请问一下大家!
__asm void CHANGE_TO_PSP(unsigned int NOT_USE){ 
    MRS    R0, CONTROL 
    ORR    R0, R0, #2 
    MSR   CONTROL, R0 

例如(1):如何在汇编程序中引NOT_USE数据的值。

unsigned int TEMP; 
TEMP = __get_CONTROL();   //读出当前CONTROL 
TEMP |= 2;  //设bit[1] 为1 
__set_CONTROL();   //写回去 


例如:上面当中的__get_CONTROL();   函数是如何返回一个值让被调用函数引用。


请问有没有这方面的文档,能共享一下吗!谢谢 !
 
回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-25 22:43:56 | 显示全部楼层
 __asm void CHANGE_TO_PSP(unsigned int NOT_USE){
    MRS    R0, CONTROL
    ORR    R0, R0, #2
    MSR   CONTROL, R0
}
    



上图是长成后的反汇编!程序没有对RO的值进行压栈,如果这样的话,调用会不会破坏RO的值!谢谢!
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-26 02:02:09 | 显示全部楼层
回复【22楼】lgh050706:
---------------------------------
 ony279 找了个文档说嵌入汇编是跟直接写汇编不同的,有可能会破坏R0的值,
如果是用汇编写的,不是嵌入在C里的就应该不会,因为NOT_USE那个传进来的参赛就是R0,不过你也可以存到SP里
就不用传参数来占住R0了,不过你如果要在里面切换SP的话要小心记得存到那个SP就从那里取出,

不过你还是用C的好了,没那么麻烦,直接用__get_CONTROL(); 这些操作吧,不过我也不是很清楚行不行,我没试过
 ony279 说 这些函数不要自己写, 有标准的 intrinsic function, core_cm3 ,你问一下他用那些?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-11-26 10:24:22 | 显示全部楼层
本帖讨论氛围很好,置酷。希望多一些这样的帖子。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-26 21:55:14 | 显示全部楼层
回复【23楼】 edmundchang :
回复【22楼】 lgh050706 : ---------------------------------  Pony279 找了个文档说嵌入汇编是跟直接写汇编不同的,有可能会破坏R0的值, 如果是用汇编写的,不是嵌入在C里的就应该不会,因为NOT_USE那个传进来的参赛就是R0,不过你也可以存到SP里 就不用传参数来占住R0了,不过你如果要在里面切换SP的话要小心记得存到那个SP就从那里取出, 不过你还是用C的好了,没那么麻烦,直接用__get_CONTROL(); 这些操作吧,不过我也不是很清楚行不行,我没试过  Pony279 说 这些函数不要自己写, 有标准的 intrinsic function, core_cm3 ,你问一下他用那些?
---------------------------------
你好!多谢你的耐心教导!这个函数我也试过调用,但是可能要包含某个头文件才可以!如查直接这样调用会把错!如下图






回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-26 21:58:29 | 显示全部楼层
 


前辈!请指导一下新手可以吗!谢谢!
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-11-26 23:55:29 | 显示全部楼层
回复【26楼】lgh050706:
---------------------------------
我试了一下编译没问题啊,不过也没找到那个头文件,你的工程模版是自己建的吗?我是直接用例子的
回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-27 10:26:35 | 显示全部楼层
是的!我是自已建的!能上传你的那个工程我参考一下吗!谢谢!
回复 支持 反对

使用道具 举报

44

主题

128

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2012-9-13
在线时间
14 小时
 楼主| 发表于 2012-11-30 17:01:26 | 显示全部楼层
?回复【28楼】lgh050706:
是的!我是自已建的!能上传你的那个工程我参考一下吗!谢谢!
---------------------------------
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-11-23
在线时间
0 小时
发表于 2012-12-4 18:28:00 | 显示全部楼层
回复【29楼】lgh050706:
---------------------------------
我的工程模版是STM32F4 discovery kit 那里下的,不知道合不合适你用的F10x,你可以去ST网站那里找你要的例程
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-5-28
在线时间
1 小时
发表于 2015-5-28 16:35:24 | 显示全部楼层
回复【16楼】edmundchang:
---------------------------------
http://down.51cto.com/data/1010948
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2022-10-24
在线时间
11 小时
发表于 2023-5-23 15:02:47 | 显示全部楼层
edmundchang 发表于 2012-11-24 22:56
特权级跟用户级我也比较纠结,搞不明白,比如我在进入用户程序前把模式设为用户级别,用户级别的限制是不能 ...

cortex-m3内核用户级转换成特权级用SVC,让其软件中断,然后更改模式
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 08:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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