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

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)的一个成员变量,而没有进行任何赋值操作,那还会产生临界资源问题嘛(此时仅仅只有一个线程可以执行读/写操作)?

恳请大神指教,感谢。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。