基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】
三、cmsis_os2的API互斥锁(Mutex)接口简介
struct osMutexAttr_t //互斥锁的属性结构体
宏定义:
#define osMutexRecursive 0x00000001U //递归互斥锁
#define osMutexPrioInherit 0x00000002U //优先级继承协议
#define osMutexRobust 0x00000008U //强健的互斥锁
函数:
osMutexId_t osMutexNew (const osMutexAttr_t *attr) //创建并初始化一个互斥锁对象。
const char * osMutexGetName (osMutexId_t mutex_id) //获取互斥锁对象的名称。
osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) //如果它被锁定,则获取互斥锁或超时值。
osStatus_t osMutexRelease (osMutexId_t mutex_id) //释放由 osMutexAcquire 获取的互斥锁。
osThreadId_t osMutexGetOwner (osMutexId_t mutex_id) //获取拥有互斥锁对象的线程。
osStatus_t osMutexDelete (osMutexId_t mutex_id) //删除互斥锁对象。
互斥锁作用:相互排斥(广为人知的互斥锁)在各种操作系统中用于资源管理。
单片机器件中的许多资源可以重复使用,但一次只能使用一个线程(例如通信通道,内存和文件)。
互斥锁用于保护对共享资源的访问。互斥体被创建并在线程之间传递(它们可以获取并释放互斥锁)
不能从中断服务程序(ISR)调用互斥锁管理函数,这与可以从 ISR 释放的二进制信号不同。有关 RTX5 配置选项,请参阅互斥锁配置。
同一个线程可以多次使用互斥锁,而不会自行锁定。每当拥有的线程获取互斥锁时,锁定计数就会增加。互斥锁必须多次释放,
直到锁计数达到零。在达到零时,互斥锁实际上被释放并且可以被其他线程获取。
案例代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
osMutexId_t mutex_id;
void HighPrioThread(void)
{
// wait 1s until start actual work
osDelay(100U);
while (1)
{
// try to acquire mutex
osMutexAcquire(mutex_id, osWaitForever);
printf("HighPrioThread is runing.\r\n");
osDelay(300U);
osMutexRelease(mutex_id);
}
}
void MidPrioThread(void)
{
// wait 1s until start actual work
osDelay(100U);
while (1)
{
printf("MidPrioThread is runing.\r\n");
osDelay(100);
}
}
void LowPrioThread(void)
{
while (1)
{
osMutexAcquire(mutex_id, osWaitForever);
printf("LowPrioThread is runing.\r\n");
// block mutex for 3s
osDelay(300U);
osMutexRelease(mutex_id);
}
}
void Mutex_example(void)
{
osThreadAttr_t attr;
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024 * 4;
attr.name = "HighPrioThread";
attr.priority = 24;
if (osThreadNew((osThreadFunc_t)HighPrioThread, NULL, &attr) == NULL)
{
printf("Falied to create HighPrioThread!\n");
}
attr.name = "MidPrioThread";
attr.priority = 25;
if (osThreadNew((osThreadFunc_t)MidPrioThread, NULL, &attr) == NULL)
{
printf("Falied to create MidPrioThread!\n");
}
attr.name = "LowPrioThread";
attr.priority = 26;
if (osThreadNew((osThreadFunc_t)LowPrioThread, NULL, &attr) == NULL)
{
printf("Falied to create LowPrioThread!\n");
}
mutex_id = osMutexNew(NULL);
if (mutex_id == NULL)
{
printf("Falied to create Mutex!\n");
}
}
APP_FEATURE_INIT(Mutex_example);