OpenEdv-开源电子网

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

关于OS_CPU_SR cpu_sr

[复制链接]

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2015-7-17 11:21:47 | 显示全部楼层 |阅读模式
5金钱

ucos-ii系统自带的一些函数,都会用某个变量来保存cpu的状态寄存器,为了好识别,一般是用cpu_sr;

譬如:
INT8U  OSSemPost (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3u                          /* Allocate storage for CPU status register      */
    OS_CPU_SR  cpu_sr = 0u;
#endif

...


INT8U  OSSemQuery (OS_EVENT     *pevent,
                   OS_SEM_DATA  *p_sem_data)
{
    INT8U       i;
    OS_PRIO    *psrc;
    OS_PRIO    *pdest;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    OS_CPU_SR   cpu_sr = 0u;
#endif

...



有一点我比较奇怪,为什么开关中断这个两个函数:

#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}

同样使用cpu_sr来保存cpu状态寄存器,但是在函数中没用定义cpu_sr这个变量呢,而是需要在调用这个两个函数的任务或者中断中定义这个变量    OS_CPU_SR   cpu_sr = 0u;

如果这样:

#define  OS_ENTER_CRITICAL()  {OS_CPU_SR   cpu_sr = 0u;  cpu_sr = OS_CPU_SR_Save();}

#define  OS_EXIT_CRITICAL()     {OS_CPU_SR   cpu_sr = 0u; OS_CPU_SR_Restore(cpu_sr);}

可以吗?


或者ucos-ii系统中为什么不干脆吧cpu_sr定义成一个全局变量呢?

最佳答案

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

在宏 CPU_SR_ALLOC() 已定义过cpu_sr并初始化了。 每一个任务都有一个 CPU_STK  **_task_STK[]用于保存临时变量和当前任务环境,无需使用全局变量也可以保证当前状态值不被改变。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2015-7-17 11:21:48 | 显示全部楼层
在宏 CPU_SR_ALLOC() 已定义过cpu_sr并初始化了。
每一个任务都有一个 CPU_STK  **_task_STK[]用于保存临时变量和当前任务环境,无需使用全局变量也可以保证当前状态值不被改变。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-17 12:59:59 | 显示全部楼层
这个你就要问UCOS的作者了。
开往春天的手扶拖拉机
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2015-7-17 15:53:51 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
调皮!
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2015-7-17 15:59:03 | 显示全部楼层
回复【3楼】hhlh2l:
---------------------------------
#define  OS_ENTER_CRITICAL()  {OS_CPU_SR   cpu_sr = 0u;  cpu_sr = OS_CPU_SR_Save();} 

#define  OS_EXIT_CRITICAL()     {OS_CPU_SR   cpu_sr = 0u; OS_CPU_SR_Restore(cpu_sr);} 
这样写会使得cpu_sr回不去,下面写法可以保证OS_CPU_SR_Restore(cpu_sr)中的cpu_sr为中断打断时的cpu_sr,两个配套使用
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
 #define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-17 16:10:39 | 显示全部楼层
回复【4楼】善良的二哥:
---------------------------------
哈哈~~,本来就是的嘛,这个是UCOS作者写的东东,肯定就要问一下他了
开往春天的手扶拖拉机
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-17 20:09:19 | 显示全部楼层
回复【5楼】善良的二哥:
---------------------------------
某些情况,估计你这代码,无法使用。
mdk 很多时候,不支持在代码中间加入变量定义的,你可以自己试试把OS_ENTER_CRITICAL加入到代码里是个什么效果。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2015-7-20 20:04:27 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,mdk代码之间变量定义是不允许的,但是像这种#define  OS_ENTER_CRITICAL()  {OS_CPU_SR   cpu_sr = 0u;  cpu_sr = OS_CPU_SR_Save();} 应该是属于函数开始定义吧。
类似于
void delay(int x)
{
  int y=x*100;
 while(y--);
}
作为延时函数被调用。我理解对吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-7-20 22:28:15 | 显示全部楼层
回复【8楼】善良的二哥:
---------------------------------
就是个宏定义。
你可以自己测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
 楼主| 发表于 2015-7-21 09:23:52 | 显示全部楼层
回复【9楼】正点原子:
------------------------------
好的,谢谢原子哥。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 13:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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