OpenEdv-开源电子网

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

ucosii

[复制链接]

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
发表于 2016-11-3 14:49:42 | 显示全部楼层 |阅读模式
3金钱
OS_CPU_A.ASM移植文件中有关开中断的函数OS_CPU_SR_Save
    MRS     R0, PRIMASK                                         ; Set prio int mask to mask all (except faults)
    CPSID   I
    BX      LR
。。。。。。。
OS_CPU_SR_Restore
    MSR     PRIMASK, R0
    BX      LR

为什么要通过R0来开中断呐,关中断期间如果R0的值改变了怎么办?还有这完全可以用
CPSIE   I  来代替额?


最佳答案

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

楼主在学习汇编?玩汇编坛友好像不多。以一个门外汉的理解,这里R0只是暂存了中断配置,先读操作完再写,至于关中断期间R0值是否改变就要更深层次研究了,应该是关中断期间不会动用R0寄存器的
我就是我,是颜色不一样的烟火。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-3 14:49:43 | 显示全部楼层
楼主在学习汇编?玩汇编坛友好像不多。以一个门外汉的理解,这里R0只是暂存了中断配置,先读操作完再写,至于关中断期间R0值是否改变就要更深层次研究了,应该是关中断期间不会动用R0寄存器的
回复

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
 楼主| 发表于 2016-11-4 14:07:35 | 显示全部楼层
龙之谷 发表于 2016-11-3 17:24
楼主在学习汇编?玩汇编坛友好像不多。以一个门外汉的理解,这里R0只是暂存了中断配置,先读操作完再写,至 ...

#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}
OS_CPU_SR_Save
    MRS     R0, PRIMASK   ;读取PRIMASK到R0中,R0为返回值
    CPSID   I             RIMASK=1,关中断(NMI和硬fault可以响应)
    BX      LR            ;返回

OS_CPU_SR_Restore
    MSR     PRIMASK, R0   ;读取R0到PRIMASK中,R0为参数
    BX      LR            ;返回
上面是我在网上找的解释,不过用汇编来看,R0怎么就成返回值了?难道和编译器有关系么。不知道有没有大神能解释下
我就是我,是颜色不一样的烟火。
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-11-4 18:22:31 | 显示全部楼层
idqiye 发表于 2016-11-4 14:07
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_ ...

对stm32汇编不熟悉,但是之前用过凌阳单片机的汇编,猜测除了指令不同,其他方面应该大同小异。

凌阳单片机的寄存器是从R1开始的,当c语言函数传递参数时,如果是一个参数,就使用R1来传递,两个就用R2,以此类推(好像超过几个参数以后是用堆栈来传递的,这个不太清楚)。c语言的函数如果有返回值时,固定使用R1寄存器来传递返回值。

感觉这里的R0寄存器是与凌阳单片机的R1起相同的作用,楼主可以看看《CM3权威指南》,上面应该有写,如果实在不理解,楼主可以自己写一个小函数(带两个参数和有一个返回值的那种),用IDE反汇编一下,看看C语言与汇编语言的对应关系,应该就清楚了。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
 楼主| 发表于 2016-11-7 10:50:47 | 显示全部楼层
东北小辉辉 发表于 2016-11-4 18:22
对stm32汇编不熟悉,但是之前用过凌阳单片机的汇编,猜测除了指令不同,其他方面应该大同小异。

凌阳 ...

谢谢耐心的解释,你说的很对,就是那个样子,已经查资料验证了。
我就是我,是颜色不一样的烟火。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 00:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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