搜索
bottom↓
回复: 13

32位、16位、8位的全局变量的赋值语句需要加禁止中断吗?

[复制链接]

出0入0汤圆

发表于 2014-3-5 09:20:50 | 显示全部楼层 |阅读模式
用的芯片是32位的ARM,程序环境是KEIL。
int32 ad;
void main(void)
{
        int32 b,c;

        //对于以下两句话,一个是读,在中断里仍然使用了对ad的读写指令。
        b= ad;
        .......
}

需要在此处ad的赋值指令上加禁止中断吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-3-5 09:33:55 来自手机 | 显示全部楼层
变量ad是共享资源么?
也就是多个地方使用这个变量?
如果不是,那就不用。
尽量避免共享可以减少开销。
在使用共享资源时也可以使用互斥,
相关知识可以看操作系统的书籍
关中断是大招

出0入0汤圆

发表于 2014-3-5 09:49:11 | 显示全部楼层
看彙編。如果一條指令就將b=ad;搞掂,那麼無論如何中斷,我相信都不會造成破壞。

出5入14汤圆

发表于 2014-3-5 09:50:43 | 显示全部楼层
1、ARM系统是32位的系统,无需考虑高、低字节不同步的问题;
2、如果有中断和主循环同时会对一个变量既有读又有写 ...... 这种应用反正我是尽量避免的!

出0入0汤圆

 楼主| 发表于 2014-3-5 20:29:05 | 显示全部楼层
全局地址很多的啊,中断也用,不同任务也用。如果是访问一大批地址的话,我就用信号量了。如果是访问单个地址的话,我就用关中断和开中断了。关中断和开中断哪有那么暴力,UCOS里到处都是。
ARM里KEIL编译环境,32位以下的字,有没有必要用关中断和开中断?

出0入0汤圆

发表于 2014-3-13 19:33:31 | 显示全部楼层
可以不用关中断的,如下示例

volatile int32_t mShare = 0;

...int中...
        mShare = mShare + 1;

非中断中
        if (mShare > ???)
        {

        }

出0入0汤圆

发表于 2014-3-14 23:00:26 | 显示全部楼层
看看。学习之!!

出0入0汤圆

发表于 2014-3-15 01:20:37 | 显示全部楼层
y574924080 发表于 2014-3-5 09:33
变量ad是共享资源么?
也就是多个地方使用这个变量?
如果不是,那就不用。

发现之前的回复很粗糙

参考楼上的回复,重新了一下:

    首先是名词约定,共享资源 / 原子性:
    共享资源 :公用的变量(包括寄存器)/不可重入的函数
    原子操作 : 不会出现执行一半被打断,可以认为能保证原子性的操作是安全的

    对于非共享资源,操作是否有原子性没有影响

    对于共享资源时,我们可以使用多种方式来保障原子性。

    一个比较理想的情况是,共享资源的操作是不被会打断的:这时候,即使共享资源
的操作不是原子性,由于不会被打断,从而保障了共享资源的操作是安全的。例如在无
os,不考虑中断的时候,共享资源保护很简单。

    在共享资源的操作可能被打断。例如被中断、抢占式调度器或者os打断。这时候就
要考虑如何保证操作是原子的。简单粗暴的是关中断(在ARM Cortex M系列,用两条指
令专门用来开关中断,从而保障原子性)。在不方便开关中断时,用互斥,自旋锁方式
也不错。

出0入0汤圆

发表于 2014-3-15 14:25:39 | 显示全部楼层
同意楼上的观点,对于一些临界资源,必须要使用上锁的机制,先不说那些比较复杂操作系统的的机制,单说,无操作系统的,可以简单地定义一个CRITICAL结构体,然后在每次访问这个变量的时候,先要使用这个CRITICAL进行上锁,释放资源的时候要进行解锁,并且,你要在其他进程中规定如果访问这个临界资源则要先判断是否上锁,如果上锁则等待,否则就先上锁,然后在使用,并且使用完成后,在解锁,这样的话就可以避免这样的问题,个人观点!!!

出0入0汤圆

发表于 2014-3-20 15:52:24 | 显示全部楼层
如果是后台对前台设置的值进行读写的话,那肯定要关闭中断。
前几天我也出现过中断临界区的问题,
前台接收程序设置数据有效长度到变量A,
后台解包函数,备份变量A后,顺手将变量A清零。就这样连续两行的代码,
如果不加入中断保护,在几十次接收数据后就出现了漏码的现象。
原因自然是在备份变量A和变量A清零的过程中,进入了相应的ISR,A的值刚被设置,
就被后台清掉了~

如果是阻塞式程序这种情况应该是比较稀有的,但在裸机非阻塞环境(无低功耗要求)中,
程序大部分时间都在各种标志位的判断中,而不是在阻塞的等待延时,所以较容易出现没有共享的问题。

出0入0汤圆

发表于 2014-4-16 09:08:04 | 显示全部楼层
  顶一下

出0入0汤圆

发表于 2014-4-16 09:17:24 | 显示全部楼层
就这个问题的话,可以不关中断
因为ARM是1条指令完成32bit变量的读写的。

需要注意的问题就是FLASH的写入延时,其他就OK

出100入101汤圆

发表于 2014-4-16 09:28:59 | 显示全部楼层
原子操作问题

出0入0汤圆

发表于 2014-4-16 09:52:30 | 显示全部楼层
具体看应用需求。
共享变量最大的问题是写冲突;读冲突可以通过连续两次,确认值相同来保证读到的值是一致的(一次完整的读,不是别人写了一半的时候读;但不保证读到的是最新的)。

所以,只有一个人写,就可以考虑无锁;但考虑写操作不一定原子,读需要确认读出来的是一致的。
ARM Core的STR是原子的,但总线的写出操作不一定原子;如果只是Core的LDR,那没问题,但对DMA啥的就可能有问题;位带的话具体需要查手册,印象中是原子的,对Core。

多人写似乎也可以考虑写-读校验的机制;无锁算法有很多,可以查一下资料。

关中断,应该说,是对于某个Core来说,最简单的解决方案。多核,带Cache之类的情形,只关中断不一定能达成。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 06:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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