实际场景:操作系统
首先有个标志位 pps_flag,是一个全局变量。有两个地方会用到这个变量,一个是pps信号触发的外部中断,一个是ucos的任务。当pps信号触发外部中断的时候pps_flag被置为2,当任务里面检测到pps_flag被置为2的时候,会把pps_flag设置为0,所以就产生一个问题,会不会这样操做,致使pps_flag乱掉。没法保证数据的可靠性和完整性啊。怎么搞,所以查了一下书《基于嵌入式实时操做系统点的程序设计技术》第七章资源同步-103页。设计
1.关中断资源
当参与访问共享资源的 程序中包含 中断程序(ISR)时,必须也只能用关中断的方式处理。优势是简单,缺点是影响系统实时性。所以在关中断里的代码必须的短。同步
采用OS_ENTER_CRITICAL(); 关中断程序设计
采用OS_EXIT_CRITICAL();退出关中断变量
2.关调度程序
关调度只能用于任务之间,并且关调度开启的时候不影响中断的运行,他只是不让各个task跑了,对系统其余的运行操做无影响。关调度的缺点是:使与该共享资源无关的任务都受到牵连,把全部任务都暂停了,确定受牵连了啊。技术
OSSchedLock(); OSSchedUnlock();数据
若是关调度时间长了,那么会影响其余的任务运行,因此不要使用关调度,采用互斥锁吧。时间
3.互斥锁-互斥信号量
互斥锁也是仅限于 任务之间使用,若是涉及到了isr,那么还得使用关中断。使用互斥锁的时候,对于其余任务和中断都没有影响,只对涉及到使用共享资源的任务有影响。所以对于系统的实时性影响最小。
OSMutexPend(Sem,0,&err);
OSmutexPost(Sem);