FreeRTOS互斥信号量

RTOS互斥信号量使用详解
本文详细介绍了RTOS中互斥信号量的使用方法及其实现原理,通过三个不同优先级的任务示例演示了互斥信号量如何在多任务环境下进行资源保护。文章通过具体的代码实现展示了互斥信号量的获取与释放过程。

API函数

#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
    #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )
#endif

QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )

举例

//高优先级任务的任务函数
void high_task(void *pvParameters)
{
    while(1)
    {
        vTaskDelay(500);    //延时500ms,也就是500个时钟节拍   
        printf("high task Pend Sem\r\n");
        xSemaphoreTake(MutexSemaphore,portMAX_DELAY);   //获取互斥信号量
        printf("high task Running!\r\n");
        xSemaphoreGive(MutexSemaphore);                 //释放信号量
        vTaskDelay(500);    //延时500ms,也就是500个时钟节拍  
    }
}

//中等优先级任务的任务函数
void middle_task(void *pvParameters)
{
    while(1)
    {
        printf("middle task Running!\r\n");
        vTaskDelay(1000);   //延时1s,也就是1000个时钟节拍 
    }
}

//低优先级任务的任务函数
void low_task(void *pvParameters)
{
    static u32 times;

    while(1)
    {
        xSemaphoreTake(MutexSemaphore,portMAX_DELAY);   //获取互斥信号量
        printf("low task Running!\r\n");
        for(times=0;times<5000000;times++)              //模拟低优先级任务占用互斥信号量
        {
            taskYIELD();                                //发起任务调度
        }
        xSemaphoreGive(MutexSemaphore);                 //释放互斥信号量
        vTaskDelay(1000);   //延时1s,也就是1000个时钟节拍 
    }
}

实验现象
1

### FreeRTOS互斥信号量的使用方法 #### 创建互斥信号量 为了创建一个互斥信号量,可以使用 `xQueueCreateMutex()` 函数。如果希望静态分配内存,则可采用 `xSemaphoreCreateMutexStatic()` 宏来实现[^3]。 ```c // 动态创建互斥信号量 SemaphoreHandle_t xMutex; xMutex = xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ); if (xMutex != NULL) { // 互斥信号量创建成功 } else { // 处理错误情况 } ``` 对于静态创建的情况: ```c static StaticSemaphore_t xMutexBuffer; // 静态缓冲区 SemaphoreHandle_t xMutex; xMutex = xSemaphoreCreateMutexStatic(&xMutexBuffer); ``` #### 获取互斥信号量 当任务需要访问受保护的共享资源时,应先尝试获取互斥信号量。可以通过调用 `xSemaphoreTake()` 来完成这一操作。此函数会指定等待时间,在这段时间内如果没有获得锁将会超时并返回失败状态;也可以设置无限期等待直至得到锁为止[^2]。 ```c if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) { // 成功获取到互斥信号量,现在可以安全地访问临界区内的数据结构或其他资源 // 访问完成后记得释放互斥信号量 xSemaphoreGive(xMutex); } ``` #### 释放互斥信号量 一旦完成了对共享资源的操作,应当立即通过 `xSemaphoreGive()` 将互斥信号量归还给系统,以便其他正在等待的任务能够继续运行。 ```c if (xSemaphoreGive(xMutex) == pdPASS) { // 正常交出了互斥信号量 } ``` #### 错误处理与调试支持 在某些情况下可能还需要考虑如何捕获异常状况以及利用内置工具辅助开发过程中的问题排查工作。例如,`traceRETURN_xQueueCreateMutex()` 可帮助追踪互斥信号量创建的过程,这对于理解系统的实时行为非常有用[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值