嵌入式系统FreeRTOS — 互斥信号量

本文详细介绍了FreeRTOS中互斥信号量的概念、作用,以及它与二值信号量的区别。通过示例解释了互斥信号量如何防止优先级翻转问题,并阐述了FreeRTOS中互斥信号量的实现过程。此外,还提到了相关API函数的使用,如xSemaphoreCreateMutex()、xSemaphoreGive()和xSemaphoreTake()。强调了在任务中正确使用互斥信号量的重要性。
摘要由CSDN通过智能技术生成

互斥信号量可以在资源保护的时候很有帮助。用于控制在两个或多个任务间访问共享资源。任务1里面用互斥,那么任务2只能等任务1访问完再访问同一个变量。

比如全局变量double gADC_value[CH_ADC_NUM] = {0};      //7 adc channals

任务1中:周期100ms的采样任务,并保存数据都全局数组中。

           osMutexWait(myMutex01Handle, osWaitForever);
            gADC_value[adc_index] = Get_ADS1259_ADC_Value();
            osMutexRelease(myMutex01Handle);

任务2中:  周期1000ms的采样任务,并读取保存在全局数组中的adc数据。

        osMutexWait(myMutex01Handle, osWaitForever);
        TC355_ADC_Value = gADC_value[CH_TMCOM2];
        TC314_ADC_Value = gADC_value[CH_TMCOM1];
        osMutexRelease(myMutex01Handle);

以下参考:

https://mp.weixin.qq.com/s?src=11&timestamp=1565745402&ver=1789&signature=qe1QZ6HPJRk6tu9AxDhfQCwtlsxg-7pc3ce9vjSpWHkNrvz-epufym9ZTh1qxLs71Y9Kl5Jj4xvcAr*JWBTv0oHXYA7-t1Or9kDhsiJm2VL6TEBoyGBXx8qH7UL8vJ-V&new=1

1 、互 斥 信 号 量

1.1 互斥信号量的概念及其作用

互斥信号量的主要作用是对资源实现互斥访问,使用二值信号量也可以实现互斥访问的功能,不过互斥信号量与二值信号量有区别。下面我们先举一个通过二值信号量实现资源独享,即互斥访问的例子,让大家有一个形象的认识,进而引出要讲解的互斥信号量。

运行条件:  

让两个任务 Task1 和 Task2 都运行串口打印函数 printf,这里我们就通过二值信号量实现对函数printf 的互斥访问。如果不对函数 printf 进行互斥访问,串口打印容易出现乱码。

用计数信号量实现二值信号量只需将计数信号量的初始值设置为 1 即可。

代码实现:

创建二值信号量

 通过二值信号量实现对 printf 函数互斥访问的两个任务

static SemaphoreHandle_t xSemaphore = NULL;
// * 函 数 名: AppObjCreate
// * 功能说明: 创建任务通信机制
// * 形 参: 无
// * 返 回 值: 无
static void AppObjCreate (void)
{
    /* 创建二值信号量,首次创建信号量计数值是 0 */
    xSemaphore = xSemaphoreCreateBinary();
    if (xSemaphore == NULL)
    {
        /* 没有创建成功,用户可以在这里加入创建失败的处理机制 */
    }/* 先释放一次,将初始值改为 1,利用二值信号量实现互斥功能 */
    //xSemaphoreGive(xSemaphore);这句可以不用
}
//通过二值信号量实现对 printf 函数互斥访问的两个任务

static void vTaskLED(void *pvParameters)
{
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 300;/* 获取当前的系统时间 */
    xLastWakeTime = xTaskGetTick
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值