实际场景:

首先有个标志位 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);

05-24 22:24