被两个及以上并发程序单元(任务或者ISR)访问的资源称为共享资源,共享资源不一定是全局资源(有的全局变量只被一个任务调用)。
具体可以采用以下方法:
1.关中断
OS_ENTER_CRITICAL();//关中断
........
OS_EXIT_CRITICAL();//退出中断
中断关闭后,系统失去对有所事件的反应能力,不可能进行任务切换,保证对共享资源的独占访问。
2.关调度
OS_SchedLock();//关调度
........
OS_Schedunlock();//开调度
与该共享资源无关的任务也受到牵连,即使他们的优先级足够高、ISR触发也无法获得CPU使用权。
3. 互斥信号量
INT8U err;
OS_EVENT *Sem;//创建互斥信号量,继承优先级为2.继承优先级必须高于所有需要访问这个共享资源的任务的优先级,且继承优先级不能和其他任务的优先级相同。
void task(void * pdata)
{
........
OSMutexPend(Sem,0,&err);获取互斥信号量Sem
........
OSMutexPost(Sem);//释放互斥信号量Sem
}
4.保证数据的完整性
将共享资源备份一份,再进行处理。提高系统的实时性。