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
- Freertos 互斥锁
- FreeRTOS
- FreeRTOS
- FreeRTOS 学习五:信号量和互斥锁
- FreeRTOS----创建FreeRTOS项目
- FreeRTOS--XQueueReceiveFromISR
- 初识FreeRTOS
- freertos小记
- 配置 FreeRTOS
- FreeRTOS分析
- 初识FreeRTOS
- 配置FreeRTOS
- FreeRTOS分析
- FreeRTOS 复习
- 配置 FreeRTOS
- FreeRTOS vApplicationSetupHardware()
- FreeRTOS随记
- freeRTOS配置
- 条款03:尽可能使用const
- android 获取手机SD卡和手机的内部存储
- LVS学习笔记 3LVS-DR实验 初步试验
- Javascript学习
- 修改ubuntu系统的时间
- Freertos 互斥锁
- 【c++】实现运算符的重载
- 【contentprovider系列7】自定义contentprovider
- Retrofit的使用教程(一)
- Linux 脱机管理问题
- CopyOnWriteArrayList 源码分析
- YUV格式详解
- 《剑指Offer》面试题28:字符串的排列
- oc基础语法