互斥信号量可以在资源保护的时候很有帮助。用于控制在两个或多个任务间访问共享资源。任务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);
以下参考:
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