首页 > 其他分享 >RTOS学习记录2:同步与互斥

RTOS学习记录2:同步与互斥

时间:2023-09-15 21:35:23浏览次数:37  
标签:同步 优先级 give 队列 RTOS 信号量 互斥 xSemUART

同步和互斥

循环检测某个变量是否已经释放的方式占用较多,效率较低。需要加一些函数,让其进入到blocked(阻塞)状态

Task3和Task4同时使用串口打印信息时,没有设定mutex,因此打印出来的内容各有混杂。通过设定USARTFlag来实现互斥+Delay让出优先权。

正确性和效率:

1.队列FIFO:传送带,流水线。

  实现同步:

  1.创建队列:动态和静态两种方式。xQueueHandle() 

  2.Task1进行xQueueSend,Task2进行xQueueReceive

  实现互斥:

  1. GetUARTLock通过QueueReceive实现,PutUARTLock通过QueueSend实现。但是会出现问题,一直只有task4运行——》通过Delay来让出抢占权

  分辨数据源

typedef struct {
    ID_t eDataID;
    int32_t lDataValue;
}Data_t;

  邮箱

  队列集:

  1.创建队列

  2.创建队列集

  3.把队列添加到队列集

  4.创建任务:队列1和2都是普通的读或写,队列3监测队列1和2。

2.事件组

typedef struct EventGroupDef_t
{
    EventBits_t uxEventBits;   //每个bit表示一个事件
    List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */

    #if ( configUSE_TRACE_FACILITY == 1 )
        UBaseType_t uxEventGroupNumber;
    #endif

    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
        uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */
    #endif
} EventGroup_t;

 正常用法:create -> setbits -> waitbits;但是事件组只能传递状态,需要传递的数据需要用队列或其他结构来传递。

同步点:xEventGroupSync()函数

3.信号量(semaphore)——计数值

 SemaphoreHandle_t实际上也是QueueHandle_t类型。其中的uxMessagesWaiting表示其value

 give和take

Task1和Task2之间使用了flag,但是效率比较差

 使用信号量能保证同步,但是不能保证传输数据的安全性

 实现互斥:先give,每次使用时take,然后释放give

4.任务通知:多对一

使用任务通知时,任务结构体TCB(Task Control Block)就包含了内部对象,可以直接接收别人发送出来的通知。

使用ucNotifyState切换任务状态,使用ulNotifiedValue来传递消息。

轻量级信号量:take和give通过ulTaskNotifyTake、ulTaskNotifyGive实现,不需要创建信号量 

轻量级队列:

轻量级事件组: 

5.互斥量mutex,也需要解决优先级问题

对临界资源的保护,谁lock,谁unlock(有进程会give,然后自己再take)。解决互斥量和优先级反转的需求。

1)优先级反转:优先级C>B>A,但是C需要A释放资源,A不释放,则会一直让B执行。B持续执行,则A得不到运行的机会,导致C也不能运行。

2)二次上锁:任务1lock了锁1,结果任务1里面的调用了任务2,任务2也请求锁1,导致死锁。——通过递归锁解决

  常规使用:与二进制信号量的唯一差别是初始化函数,其余用法一模一样:

/*初始化函数*/
//xSemUART = xSemaphoreCreateBinary();
//xSemaphoreGive(xSemUART);
xSemUART = xSemaphoreCreateMutex();

/*常规使用*/
void TaskGenericFunction(void * param)
{
    while (1)
    {    
        xSemaphoreTake(xSemUART,portMAX_DELAY);
        printf("%s\r\n", (char *)param);
        xSemaphoreGive(xSemUART);
        vTaskDelay(1);
    }
}

  优先级反转

  

  互斥量的缺陷和递归锁:

    会出现监守自盗(别人使用了,强盗想用,自己释放,然后再抢占),不能实现谁持有谁释放。 

    该问题可以通过递归锁来解决

 

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:同步,优先级,give,队列,RTOS,信号量,互斥,xSemUART
From: https://www.cnblogs.com/ustc2122zy/p/17698318.html

相关文章

  • 3 - 任务调度算法 & 同步与互斥 &队列
    之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行怎样才能讲道理呢?稍微等等嘛,等我做完活你再做 1支持抢占,0不支持抢占 同优先级任务是否交替执行,1交替0不交 空闲任务是否礼让其他任务礼让的话,自己的函数逻辑在时间片内只执行......
  • 迁移pgsql从数据库(原先数据库架构为主从同步)
    迁移pgsql从数据库将原先的1.56服务器上的从数据库迁移至1.62服务器上55服务器为主库1、安装依赖包yum-yinstallreadlinegcc-yreadline-develzlib-devel2、下载对应版本的pgsql并解压编译安装下载地址:https://www.postgresql.org/ftp/source/tar-xvfpostgresql-11.6......
  • 多任务互斥与同步
    多任务互斥与同步1.互斥和同步概述同步和互斥是用于解决如下两个问题:1)在多任务操作系统中,同时运行的多个任务可能都需要访问/使用同一种资源。2)多个任务之间有依赖关系,某个任务的运行依赖于另一个任务互斥:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不......
  • ntp时间同步
    1、检查系统是否安装了NTP包(linux系统一般自带NTP4.2)没有安装我们直接使用yum命令在线安装:yuminstallntpsystemctlenablentpd开机启动ntpsystemctlstartntpd启动服务systemctlstopntpd停止服务systemctlstatusntpd查看服务状态2、NTP服务端配置文件编辑vim/et......
  • 同步异步 阻塞非阻塞
    同步异步描述的事任务的提交方式 描述的事一段代码或者函数同步:任务提交后,原地等待任务的返回结果,等待的过程中不做任何事(干等)程序层面上表现出来的感觉就是卡住了例子:importtime deffunc():time.sleep(3)print('helloworld')  if__name++=='__main__......
  • 使用python进行数据同步,根据游标的方式
    使用python进行数据同步,根据游标的方式一、介绍:数据同步分为好几种,比如根据最大id排序,其次才是根据游标进行排序。为什么不使用最大id进行数据同步?如下:因为如果数据表中的数据是按照降序排序的,那么每次根据最大id取1000条数据的方式也是一种可行的分页查询方式。这种方式的优......
  • 修改了虚拟机名称后,数据存储上的文件名称如何同步修改
    更改虚拟机名称虚拟机的名称在虚拟机所在的文件夹中必须是唯一的。如果将某虚拟机移至其他数据存储文件夹或移至具有相同名称的现有虚拟机的主机,则可以更改该虚拟机的名称以使其保持唯一。 更改某虚拟机的名称时,应更改 vCenterServer 清单中用于标识该虚拟机的名称。该操作......
  • 火狐浏览器的书签丢失了怎么办?书签同步失败怎么办?
    参考:http://mzl.la/1BAQULj 您对Firefox做的所有更改,比如您的主页、工具栏、扩展、保存的密码以及书签等,都被保存在一个特别的文件夹中,称为用户配置文件夹。您的用户配置文件夹和Firefox的程序文件并不在一起,这样一旦Firefox出现问题,您的所有信息仍旧是安全的。也就是说,......
  • Terraform 状态不同步处理
    背景在使用Terraform创建TencentCloudTKE的时候,手贱把nodepool删掉了。导致执行destroy,plan都会报错。│Error:[TencentCloudSDKError]Code=InternalError.UnexpectedInternal,Message=relatednodepoolqueryerr(getnodepoolfailed:[E501001DBRecordNotFou......
  • buildroot 构建根文件系统(8)添加网络时间同步
    一、开发背景构建最小系统后成功运行后,时间都是从初始化时间开始计算,形如:ThuJan 109:57:55UTC1970二、开发需求开机联网后自动从网络中获取最新的时间,同步到系统中三、开发环境LinuxUbuntu4.15.0-65-generic+buildroot-2023.02.3+i.mx6d(cortex-A9)......