OpenEdv-开源电子网

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

UCOSII中怎样写,来保护全局变量?

[复制链接]

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
652
金钱
652
注册时间
2013-11-22
在线时间
130 小时
发表于 2016-12-19 18:13:13 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 zhp 于 2016-12-19 18:28 编辑

在 UCOSII 系统中
比如我现在有个32位的全局变量   u32  global_var1;
想在普通任务中和中断任务中都来操作该变量

任务1{

while(1)
{
       func1();

       //任务进入临界区,读取全局变量 global_var1,不允许写全局变量 global_var1
       func2();
       //任务退出临界区

       func3();
       delay();
}

}

中断函数
{
       funca();

       //进入临界区,写全局变量 global_var1
       funcb();
       //退出临界区

       funcc();


}


比如上面那段示意代码,我想要保证  func2() 函数 和 funcb() 函数的执行时间绝对的错开,怎么保证呢?
我有试过使用
任务1{

while(1)
{
       func1();

       //任务进入临界区,读取全局变量 global_var1,不允许写全局变量 global_var1
       OS_ENTER_CRITICAL();
       func2();
       OS_EXIT_CRITICAL();
       //任务退出临界区

       func3();
       delay();
}

}

中断函数
{
       funca();

       //进入临界区,写全局变量 global_var1
       OS_ENTER_CRITICAL();                    funcb();
       OS_EXIT_CRITICAL();
       //退出临界区

       funcc();


}

这样写,可以跑一会,但是过会儿(大概5分钟左右)任务就不能调度了,但程序并
没有死,我打断点,程序还是可以进入中断任务,有点搞不清楚
了,谁知道怎么解决?谢谢!



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

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-19 18:47:47 | 显示全部楼层
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
652
金钱
652
注册时间
2013-11-22
在线时间
130 小时
 楼主| 发表于 2016-12-20 09:52:43 | 显示全部楼层

版主您好,我之前有考虑过用信号量,可在看UCOS_II 中文注释文档中说,释放信号量函数OSMutexPost 不能在中断中使用,这里该怎样去使用?
还有一个问题就是:比如我现在有 2个中断函数,分别需要操作2个共享资源,主要是写操作;然后另外有一个普通任务里面,想读这2个共享资源,这个用信号量可以实现吗?
我主要是让他们各自的读和写绝对分开,避免写操作一半,就被错误读走了;或者读了一半,又被错误的写成其它的值了。
回复

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
652
金钱
652
注册时间
2013-11-22
在线时间
130 小时
 楼主| 发表于 2016-12-20 10:04:21 | 显示全部楼层
本帖最后由 zhp 于 2016-12-20 10:07 编辑

比如有2个共享资源
u32   global_var1, global_var2;
普通任务想读这两个全局变量;

普通任务{

while(1)
{
       func_1();

       /
/任务进入临界区,读取全局变量 global_var1,global_var2;不允许写全局变量 global_var1,global_var2
       func_2();
       //任务退出临界区

       func_3();
       delay();
}

}

中断函数1
{
       func_a();

       //进入临界区,写全局变量 global_var1
       func_b();
       //退出临界区

       func_c();


}
中断函数2
{
       func_q();

       //进入临界区,写全局变量 global_var2
       func_w();
       //退出临界区

       func_e();


}

这个用信号量可以做吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 00:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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