RTOS共享串口常见处理方法

在rtos多任务编程的时候,同一个串口(硬件)被多个任务访问的情况比较多,如果不合理处理,就会导致“混乱”的局面。  处理“混乱”局面的方法比较多,下面基于freertos,以uart为例讲讲常见的互斥、队列这两种方法。   互斥访问
 互斥量:是一个可以处于两态之一的变量:解锁和加锁。  原理:创建一个互斥量,任务a在需要占用资源(使用uart发送数据),把资源(uart)占用。此时,任务b及其他任务就不能占用该资源。当任务a使用完资源(uart发送完数据),释放资源,其他任务就可以抢占该资源。 创建互斥量  任务a占用资源使用资源(发送数据)任务a释放资源  优先级高的任务b占用资源使用资源任务b释放资源  依次,优先级任务占用资源···  
代码:
//创建互斥量资源semaphorehandle_t xsemaphore = null;xsemaphore = xsemaphorecreatemutex();void taska(void *pvparameters){ for(;;) { //占用资源 if(xsemaphoretake(xsemaphore, 10 ) == pdtrue) { //使用资源(发送数据) usart_sendnbyte(); //释放资源 xsemaphoregive(xsemaphore); } }}  信号量与互斥量区别:信号量:多个任务同步使用某个资源;一个任务完成某个动作后通过信号告诉别的任务,别的任务才可以执行某些动作;  互斥量:多任务互斥使用某个资源;一个任务占用某个资源,那么别的任务就无法访问,直到该任务离开,其他任务才可以访问该资源;  
队列操作
 队列操作方法就是fifo,先入先出的原理。比如:任务a要使用uart发送一串数据,将其加入队列; 接着任务b也要使用uart发送一串数据。  那么,任务a将这串数据加入队列,接着任务b又将要发送的一串数据加入队列。  在另外一个uart发送的任务中,从队列中按照fifo方式读取队列里面的数据,依次发送出去即可。 创建一个队列(发送数据队列)创建一个任务(uart发送数据任务)  任务a加入队列任务b加入队列   ·   ·   ·  另外一边的任务,依次读取队列数据,使用uart发送出去。  
代码:
queuehandle_t xqueue;xqueue = xqueuecreate(queue_length, queue_item_size);xtaskcreate(uart_send_task, uart_send, stack_size, null, task_priority, null);void taska(void *pvparameters){ for(;;) { //任务相关操作 //加入队列 xqueuesend(xqueue, &taska_buf, 10) }}void taskb(void *pvparameters){ for(;;) { //任务相关操作 //加入队列 xqueuesend(xqueue, &taskb_buf, 10) }}void uart_send_task(void *pvparameters){ for(;;) { //循环读取队列buf if(xqueuereceive(xqueue, &buf, 10) == pdtrue) { usart_sendnbyte(&buf); } }}  
以上两种方法比较常用,也比较简单,希望对大家有帮助。

新能源汽车热管理技术发展报告
美国正在威胁德国禁止使用华为5G设备
工信部修订人工智能等行业标准项目计划
Intel在官网正式发布了首款5G基带XMM 8160
苹果又被告了,苹果中国宣布将以旧换新的活动延期至3月25日
RTOS共享串口常见处理方法
fpga开发板与linux开发板区别
cbb22电容是交流电还是直流电?
数字孪生工厂3D交互模型,3d可视化建模,智慧城市园区三维仿真模型
张忠谋:暂不打算与中芯合作 对张汝京没看法
物联网服务平台应当具备5大核心功能
贴片压敏电阻生产厂家 0805封装系列详解
离手检测HoD提高驾驶安全性
焦点对激光切割的影响是怎样的
一加7T将在推送软件软件更新中支持超级慢动作视频录制功能
英特尔一直致力于在业务运营过程中节约水资源
戴森HP04评测 到底怎么样
MAX12900高度集成的4-20mA传感器变送器,可节省20%空间、功耗降低50%
SK电讯携手合作伙伴共同推动5G虚拟化网络的商用
TV类显示产品价格下滑一年后有望回暖