在介绍互斥量之前,先说说什么是临界资源。
最经典的临界资源就是打印机,在你同时让打印机打印两分文档的时候,会弹出一个窗口,上面列出打印队列。
这就是说,打印机只有一个,它无法同时打印两个文档,只能排队,一个个地打。
如果同时打印的话,会出错,这不是用户想要的结果。
同样的,在单片机里面,串口1,也是个临界资源,为了不让它出错,必须使用互斥量。
所谓互斥,就是互相排斥,任务A在使用串口1的时候,任务B不能使用,反之亦然。
使用互斥量之后,效果如下图所示。
把第16、23、34、39、46、51行都注释掉,不使用互斥量,效果如下图所示。
显然,不使用互斥量会让串口输出错误的信息。
1、CoCreateMutex(),创建一个互斥量。
OS_MutexID CoCreateMutex(void);
如果成为创建一个互斥量,会返回一个OS_MutexID变量;创建失败的话,返回-1。
2、CoEnterMutexSection(),进入临界段。
StatusType CoEnterMutexSection(OS_MutexID mutexID);
3、CoLeaveMutexSection(),退出临界段。
StatusType CoLeaveMutexSection(OS_MutexID mutexID);
4、其实互斥量,就是在嵌入式常常说的“锁”,进入临界段对应“加锁”,退出临界段对应“解锁”。
而在linux驱动,还有自旋锁和睡眠锁两种,对加锁和解锁操作不当的话,也极易让任务变得不稳定,所以使用前请注意一下。