最近阅读了公司同事的代码,代码片段如下:
代码环境:裸机编程 stm32f103zet6 MDK5(ARMCC编译器)
代码内容:MENU_t是其中的核心结构体,Menu_t类型SysMenu1和SysMenu2是全局变量。
- void TIM6_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
- {
- TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
- MenuProcess(&SysMenu1); /* 因为SysMenu1和SysMenu2的处理过程类似,所以将全局变量的指针作为形参带入函数中,而没有直接在函数内部使用全局变量 */
- }
- }
复制代码
代码思考:
问题1:在ISR中调用MenuProcess(&SysMenu)一定会产生临界资源问题吗?
问题2:MenuProcess():是不可重入函数(按照我之前的理解,在函数内部使用全部变量是不可重入函数,那函数的实参是全局变量或者全局变量指针该怎么办?)?
问题3:我理解:所谓的临界资源,是担心数据在另外一个线程被“意外的”修改(ISR算是另外一个线程)。如果在MenuProcess(&SysMenu)中只是查看(&SysMenu)的一个成员变量,而没有进行任何赋值操作,那还会产生临界资源问题嘛(此时仅仅只有一个线程可以执行读/写操作)?
恳请大神指教,感谢。。。
我对这个问题的解决思路是绕开它。
1,更换更高档的MCU。
2,不开中断,用查询法。
答1:不一定。
如果调用MenuProcess(&SysMenu)的地方只有ISR,则不产生资源操作冲突问题;如果在大循环中有调用MenuProcess(&SysMenu),ISR也调用MenuProcess(&SysMenu),则操作不当会导致数据错乱。
话说,菜单处理就不要在ISR里整了,这样的设计不合理。
答2:可重入函数基本就是函数内没有使用全局或静态的变量。
如果入参是全局变量指针,并不影响该函数的可重入性,只是这样调用可能会产生资源操作冲突问题,属于调用不当。
答3:不会。
资源冲突一般都是多线程同时“操作”临界资源,“获取”一般不影响。原子操作会保证数据的完整性。
一周热门 更多>