Freertos 互斥锁

来源:互联网 发布:淘宝上怎么收藏店铺 编辑:程序博客网 时间:2024/06/07 05:45
Freertos 互斥锁

     信号量是任务与任务之间,任务与中断之间同步的重要方式,二元信号量与互斥锁十分相像,两者之间的差别在于优先级的继承机制,当另外一个具有更高优先级的任务试图获取同一个互斥锁时,已经获得互斥锁的任务将继承试图获取同一互斥锁的任务的优先级。而信号量没有这种机制,所以二元信号量更适合实现同步,互斥锁更适合实现简单的互斥。需要注意的是互斥锁在使用完资源后必须返还,否则高优先级的任务永远也无法获取互斥锁,低优先级的任务将不会放弃优先级的继承。二元信号量并不需要在得到后立即释放,因此同步操作一般可以通过一个任务或中断持续释放信号量,另一个任务持续获取信号量来实现。

一、简单例程
互斥锁主要作用是保护资源,创建一个全局变量test_value作为共享资源,其中任务2每隔十毫秒申请操作资源,将test_value赋值为1,任务1每隔100ms申请互斥锁,成功后将test_value清0,并等待1秒时间,1秒内如果test_value值被改写则打印测试失败,如果值没有被改变则打印测试成功,释放互斥锁。
/* includes. */#include <stdio.h>#include "FreeRTOS.h"#include "task.h"#include "queue.h"#include "stm32f10x.h"#include "semphr.h"#include "portmacro.h"static void prvSetupHardware( void );void vPrintTask(void *pvParameters);void vTask1(void *pvparameters);void vTask2(void *pvparameters);void vLedInit(void);void UartInit(void);#define LED1_ON() GPIO_SetBits(GPIOB,GPIO_Pin_0)#define LED1_OFF() GPIO_ResetBits(GPIOB,GPIO_Pin_0)SemaphoreHandle_t xSemaphore = NULL;unsigned int test_value = 0;int main( void ){    prvSetupHardware();    /* 创建互斥信号量 */     xSemaphore = xSemaphoreCreateMutex();    xTaskCreate( vTask1, "vTask1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+6, NULL );    xTaskCreate( vTask2, "vTask2", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+7, NULL );    vTaskStartScheduler();    return 0;}void vTask1(void *pvparameters){    TickType_t xLastWakeTime;    while(1)    {        if(xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE)        {            test_value = 0;            xLastWakeTime = xTaskGetTickCount();            vTaskDelayUntil( &xLastWakeTime, 1000/portTICK_RATE_MS );            if(!test_value)                printf("Test ok!\r\n");            else                printf("Test false!\r\n");            xSemaphoreGive( xSemaphore );        }        xLastWakeTime = xTaskGetTickCount();        vTaskDelayUntil( &xLastWakeTime, 100/portTICK_RATE_MS );    }}void vTask2(void *pvparameters){    TickType_t xLastWakeTime;    while(1)    {        if(xSemaphoreTake( xSemaphore, portMAX_DELAY ) == pdTRUE)        {            test_value = 1;            xSemaphoreGive( xSemaphore );               }        xLastWakeTime = xTaskGetTickCount();        vTaskDelayUntil( &xLastWakeTime, 10/portTICK_RATE_MS );     }}

结果:


二、分析
SemaphoreHandle_t xSemaphore = NULL;
创建互斥锁句柄。
xSemaphore = xSemaphoreCreateMutex();
创建互斥锁。
xSemaphoreTake( xSemaphore, portMAX_DELAY ) 
申请互斥锁,第一个参数为互斥锁句柄,第二个参数为等待最大时间,成功则返回pdTRUE,失败则返回pdFALSE。
xSemaphoreGive( xSemaphore );
释放互斥锁。

三、其他
使用互斥锁时需要在FreeRTOSConfig.h中宏定义#define configUSE_MUTEXES           1
0 0