OpenEdv-开源电子网

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

关于UCOS2的临界区的问题

[复制链接]

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2015-10-23
在线时间
19 小时
发表于 2016-6-27 14:33:19 | 显示全部楼层 |阅读模式
5金钱
ucos中用#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(保存全局中断标记,除了故障中断)
    CPSID   I                                             ; PRIMASK=1,关中断
    BX      LR                                            ; 返回, 返回值保存在 R0



OS_CPU_SR_Restore
    MSR     PRIMASK, R0                                ; 读取 R0 到 PRIMASK 中(恢复全局中断标记), 通过 R0 传递参数
    BX      LR


汇编中将当前 PRIMASK寄存器的值保存到了R0,然后关闭全局中断 ; 在c语言宏定义中cpu_sr = OS_CPU_SR_Save(); 将当前值保存到cpu_sr 这个变量中,我就是这里不明白,汇编中
把寄存器值给了R0,那么R0又是怎么把值给cpu_sr的??R0和cpu_sr有什么关系吗?

逐梦的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-6-27 23:29:15 | 显示全部楼层
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-7-27
在线时间
8 小时
发表于 2016-6-28 10:04:23 | 显示全部楼层
你要看进入临界区宏定义
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2015-10-23
在线时间
19 小时
 楼主| 发表于 2016-6-28 14:34:19 | 显示全部楼层
txmsszd 发表于 2016-6-28 10:04
你要看进入临界区宏定义

我看了,我是想问,汇编中把全局中断寄存器的值给了R0,,然后R0是怎么把值给CPU_sr的
逐梦的人
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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