关于中断服务函数中使用临界资源的思考,恳请指教

2019-12-25 18:46发布

最近阅读了公司同事的代码,代码片段如下:

代码环境:裸机编程 stm32f103zet6 MDK5(ARMCC编译器)

代码内容:MENU_t是其中的核心结构体,Menu_t类型SysMenu1和SysMenu2是全局变量。

  1. void TIM6_IRQHandler(void)
  2. {
  3.         if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
  4.         {
  5.                 TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
  6.                 MenuProcess(&SysMenu1); /* 因为SysMenu1和SysMenu2的处理过程类似,所以将全局变量的指针作为形参带入函数中,而没有直接在函数内部使用全局变量 */
  7.         }
  8. }
复制代码

代码思考:

问题1:在ISR中调用MenuProcess(&SysMenu)一定会产生临界资源问题吗?

问题2:MenuProcess():是不可重入函数(按照我之前的理解,在函数内部使用全部变量是不可重入函数,那函数的实参是全局变量或者全局变量指针该怎么办?)?

问题3:我理解:所谓的临界资源,是担心数据在另外一个线程被“意外的”修改(ISR算是另外一个线程)。如果在MenuProcess(&SysMenu)中只是查看(&SysMenu)的一个成员变量,而没有进行任何赋值操作,那还会产生临界资源问题嘛(此时仅仅只有一个线程可以执行读/写操作)?

恳请大神指教,感谢。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
stm32_xiaocai
1楼-- · 2019-12-25 23:40
原子操作没问题,但是很多是需要读->修改->写的,这就需要特殊处理了。
xf331785508
2楼-- · 2019-12-26 04:32
MenuProcess中如果加入全局中断 关 开 动作,应该不存在临界资源问题。无论读写,只要是可重入,就有可能会有错误结果产出。
su33691
3楼-- · 2019-12-26 05:02
能把这个问题解决得好,是成为高手的基础。
我对这个问题的解决思路是绕开它。
1,更换更高档的MCU。
2,不开中断,用查询法。
落叶知秋
4楼-- · 2019-12-26 05:22
说一下个人理解,有误请指出:
答1:不一定。
如果调用MenuProcess(&SysMenu)的地方只有ISR,则不产生资源操作冲突问题;如果在大循环中有调用MenuProcess(&SysMenu),ISR也调用MenuProcess(&SysMenu),则操作不当会导致数据错乱。
话说,菜单处理就不要在ISR里整了,这样的设计不合理。

答2:可重入函数基本就是函数内没有使用全局或静态的变量。
如果入参是全局变量指针,并不影响该函数的可重入性,只是这样调用可能会产生资源操作冲突问题,属于调用不当。

答3:不会。
资源冲突一般都是多线程同时“操作”临界资源,“获取”一般不影响。原子操作会保证数据的完整性。
擦鞋匠
5楼-- · 2019-12-26 06:16
 精彩回答 2  元偷偷看……
wswh2o
6楼-- · 2019-12-26 08:29
具体问题具体分析,看不到函数内部,不好下结论吧。用全局变量也不一定不可重入啊。

一周热门 更多>