linux串⼝互斥,互斥锁在串⼝通信中的简单应⽤
关键字
嵌⼊式开发
硬件资源
互斥锁
freeRTOS操作系统
串⼝通信
基本介绍
互斥锁(英⽂:Mutual exclusion,常缩写为Mutex,是⼀种常⽤在多线程编程中,防⽌多个线程对⼀个公共资源做读写操作的机制,以保证共享操作的数据的完整性。互斥锁是最基本的进程或者线程间同步的⽅法,⽤来保护临界区,以保证任何时候只有⼀个线程或者进程在访问共享资源(如共享的代码段)。
笔者使⽤的操作系统为freeRTOS,下⽂提到的“进程”实则为freeRTOS中的“任务”,”Task“。
互斥锁在串⼝通信中的应⽤
在串⼝通信中,互斥锁经常被⽤到。⽤于保证串⼝发送的⼀帧数据的完整性。不会被插⼊其他数据。
串⼝资源被抢占
uart_send_hello()
{
char send_data[6] = "hello";
tx_send_data(data,length);//底层串⼝发送函数
}
uart_send_world()
{
char send_data[6] = "world";
嵌入式多线程编程tx_send_data(data,length);//底层串⼝发送函数
}
如果不进⾏加锁,当uart_send_hello() 执⾏到⼀半时,可能被其他更⾼优先级的调⽤uart_send_world() 的进程打断,导致发送的数据
为“heworldllo”、或“hellworldo”等其他情况。
使⽤互斥锁保证⼀帧串⼝数据的完整性
为了避免这种情况,可以在串⼝发送的开始和结束阶段“加锁”,进⾏简单的封装。这样在不同的进程调⽤封装函数
tx_send_data_with_lock()的时候,即使进程的优先级不同,也不会出现⼀帧数据还没有发送完就被打断。
tx_send_data_with_lock(char *data, int lenth)
{
MutexLock(uart_lock);//上锁
tx_send_data(data,lenth);
MutexUnLock(uart_lock);//解锁
uart_send_hello()
{
char send_data[6] = "hello";
tx_send_data_with_lock(data,length);//带互斥所封装的串⼝发送函数
}
uart_send_world()
{
char send_data[6] = "world";
tx_send_data_with_lock(data,length);//带互斥所封装的串⼝发送函数
}
使⽤互斥锁保证两帧数据的时间间隔
如果有些应⽤场景,对串⼝发送的时间间隔有要求:保证两帧数据的时间间隔不少于20ms,那么在适当的位置加⼊互斥锁可以简单实现这个功能。例如,要保证两个“hello”之间的间隔不⼩于20mS。
写法⼀:不可⾏
uart_send_hello()
{
char send_data[6] = "hello";
tx_send_data_with_lock(data,length);//带互斥所封装的串⼝发送函数
delayms(20);//任务休眠(延时)20mS
}
写法⼆:可⾏
uart_send_hello()
{
MutexLock(hello_lock);//上锁
char send_data[6] = "hello";
tx_send_data_with_lock(data,length);//带互斥所封装的串⼝发送函数
delayms(20);//任务休眠(延时)20mS
MutexUnLock(hello_lock);//解锁
}
写法⼀中,虽然uart_send_hello() 在结束发送”hello“后进⾏了20mS的延时,但实际当两个线程同时调⽤uart_send_hello() 时,并不是等待⼀个完整的uart_send_hello() 执⾏完再执⾏另⼀个uart_send_hello() :前⼀个进程中的”uart_lock“被释放之后,下⼀个调⽤uart_send_hello() 的进程可
以⽴即取”uart_lock“执⾏并执⾏串⼝发送任务,这样仍然不能保证两个”hello“之间的发送间隔为20mS 以上。
写法⼆能有效实现这个功能,由于”hello_lock“互斥锁的存在,不管以任何⽅式调⽤uart_send_hello() ,在发送”hello“之后始终会进⾏20mS的延时。
同理,在不同的位置上锁,还可以实现不同的功能,如:
保证所有相临的串⼝发送帧(不仅仅是“hello”)间隔不少于20mS 保证串⼝发送⼀帧数据和接收⼀帧数据的间隔不少于50mS
使⽤互斥锁保证其他硬件资源或全局变量不被抢占操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论