中断程序如何解决互斥问题

williamvv1 2011-03-01 12:13:25
在通讯程序中,使用中断接收数据,并保存到自定义栈中,用另一个程序读出这个栈,如下

void irq_XXX(void)
{
buf[dex]=DataRegister;//buf[]是自己定义的,当发生接收中断时,把寄存器DataRegister数据读出
dex++; //索引号

。。。
}


void Receive(&MyBuf) // 普通函数
{
...
MyBuf[n]=buf[dex];
dex--;
.....
}

简单的例子,普通函数运行时,如果突然产生中断,那么这个dex的值就会混乱,这种情况该如何解决?
...全文
114 2 点赞 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wxzking 2011-03-02
在linux内核中有对应的两个禁止/激活中的函数:
local_irq_disable();
local_irq_enable();
如果在调用local_irq_disable()例程之前已经禁止了中断,那么该例程往往会带来潜在的危险;同样相应的local_irq_enable()例程也存在潜在的危险,因为它将无条件地激活中断,尽管这些中断可能在开始的时候就是关闭的。
local_irq_save(unsigned long flags);
local_irq_restore(unsigned long flags);
这两个函数先保存中断状态,然后把中断恢复到以前的状态,而不是简单地禁止或激活。
  • 打赏
  • 举报
回复
hicaru000000 2011-03-01
在普通函数dex操作时禁止中断就好。

例如:



void Receive(&MyBuf) // 普通函数
{
...
IRQ_DISABLE();
MyBuf[n]=buf[dex];
dex--;
IRQ_ENABLE();
.....
}



  • 打赏
  • 举报
回复
相关推荐
发帖
驱动开发/核心开发
创建于2007-09-28

2.1w+

社区成员

硬件/嵌入开发 驱动开发/核心开发
申请成为版主
帖子事件
创建了帖子
2011-03-01 12:13
社区公告
暂无公告