12306的网站多少钱做的,网站开发技术文档 范本,网页设计html代码大全下载,ui设计接单价目表作者 | strongerHuang微信公众号 | 嵌入式专栏在基于RTOS开发项目时#xff0c;通常都会遇到互斥的情况#xff0c;比如#xff1a;几个任务都要使用一个UART串口进行发送数据。如果不加互斥锁#xff0c;优先级高的任务#xff0c;会抢占串口并发送数据#xff0c;则有可… 作者 | strongerHuang微信公众号 | 嵌入式专栏在基于RTOS开发项目时通常都会遇到互斥的情况比如几个任务都要使用一个UART串口进行发送数据。如果不加互斥锁优先级高的任务会抢占串口并发送数据则有可能会出现发送数据“乱码”的情况。今天就说说在RTOS开发中互斥锁一个常见的问题。什么是Mutex互斥锁学习过RTOS的读者应该对互斥不陌生互斥锁就是为了避免任务之间互相抢占某种资源而设计的一种“锁”。就如上面说的一个串口被两个任务抢占如果不加锁则会出现两个任务交叉发送数据即“乱码”但是如果加了互斥锁则会等待其他任务发送完成之后才继续发送保证了数据的完整而不是乱码Mutex互斥锁例子这里以三个任务、两个互斥锁为例代码如下void task1()
{/*do something*/OSMutex1_Pend(); //互斥锁1加锁/*加锁处理事情*/OSMutex1_Post(); //互斥锁1解锁
}void task2()
{/*do something*/OSMutex1_Pend(); //互斥锁1加锁OSMutex2_Pend(); //互斥锁2加锁/*加锁处理事情*/OSMutex2_Post(); //互斥锁2解锁OSMutex1_Post(); //互斥锁1解锁
}void task3()
{/*do something*/OSMutex2_Pend(); //互斥锁2加锁/*加锁处理事情*/OSMutex2_Post(); //互斥锁1解锁
}这样设计大家看出问题了吗老司机应该看出来了新手可能摸不着头脑。在任务2中进行了2次加锁、解锁而且“环环相扣”。Mutex互斥锁问题假如任务1、 任务2、 任务3优先级分别为1、 2、 3。优先级顺序就是任务1 任务2 任务3数字越小代表任务优先级越高。假设任务1和任务2处于等待事件状态也就是处于阻塞状态 task 3 处于运行状态。当任务3在“加锁处理事情”的时候任务2抢占了任务3任务2挂起时间到了此时任务3挂起任务2处于运行状态如果任务2在“互斥锁1加锁”之后任务1抢占了任务2此时任务1处于运行状态这个时候你发现问题了没有任务1在执行“OSMutex1_Pend();”会等待“互斥锁1解锁”如果其他方式没有对“互斥锁1解锁”则会出现“死锁”的情况。分享一张图片你就会明白什么是死锁了解决办法比如对任务2加锁方式进行改善void task2()
{/*do something*/OSMutex1_Pend(); //互斥锁1加锁/*do something*/OSMutex1_Post(); //互斥锁1解锁OSMutex2_Pend(); //互斥锁2加锁/*do something*/OSMutex2_Post(); //互斥锁1解锁
}或者对低优先级的任务3加锁方式进行改善void task3()
{/*do something*/OSMutex1_Pend(); //互斥锁1加锁OSMutex2_Pend(); //互斥锁2加锁/*加锁处理事情*/OSMutex2_Post(); //互斥锁2解锁OSMutex1_Post(); //互斥锁1解锁
}出问题的原因 当一个任务获得了临界区资源的锁在没有释放这个锁的前提下又去获得另外一块临界区资源这个时候就要引起足够的注意了设计成败在于你是否彻底理解了之前的问题。但是归根到底这样的问题还是要求用户在设计阶段去避免一个系统不可能是万能的正确的设计才是最重要的。------------ END ------------点击“阅读原文”查看更多分享。