粤嵌鸿蒙 -- 学习笔记
内核篇:(1 2 3篇线程 定时器 事件笔记在上一章)
4.互斥锁
5.信号量
6.消息队列
osMutexId_t osMutexNew(const osMutexAttr_t *attr)
函数osMutexNew创建并初始化一个新的互斥锁对象,并返回指向互斥锁对象标识符的指针,如果出现错误则返回NULL,可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。 注意 :不能在中断服务调用该函数
osMutexId_t mutex_id; //定义全局变量 mutex_id = osMutexNew(NULL); //创建一个新的互斥锁,并返回指向互斥锁对象标识符的指针 if (mutex_id == NULL) //做一个简单的判断,是否创建互斥锁成功 { printf("Falied to create Mutex!\n"); }
osStatus_t osMutexAcquire(osMutexId_t mutex_id,uint32_t timeout)
函数osMutexAcquire一直等待,直到参数mutex_id指定的互斥对象可用为止。如果没有其他线程获得互斥锁,该函数立即返回并阻塞互斥锁对象。 注意 :不能在中断服务调用该函数
osWaitForever -- 一直等待获取互斥锁
// try to acquire mutex osMutexAcquire(mutex_id, osWaitForever);
osStatus_t osMutexRelease(osMutexId_t mutex_id)
函数osMutexRelease释放一个由参数mutex_id指定的互斥量。当前等待这个互斥锁的其他线程将被置于就绪状态。 注意 :不能从中断服务例程调用此函数。
osMutexRelease(mutex_id);
osStatus_t osMutexDelete(osMutexId_t mutex_id)
函数osMutexDelete 删除一个由参数mutex_id指定的互斥量。
osMutexDelete(mid);
osSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr)
函数osMessageQueueNew创建并初始化一个消息队列对象。该函数返回消息队列对象标识符,如果出现错误则返回NULL,可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,也可以在内核初始化 (调用 osKernelInitialize)之前调用该函数。 注意 :不能在中断服务调用该函数
osSemaphoreId_t sem1; sem1 = osSemaphoreNew(4, 0, NULL); if (sem1 == NULL) { printf("Falied to create Semaphore1!\n"); }
osStatus_t osSemaphoreAcquire(osSemaphoreId_t semaphore_id, uint32_t timeout)
阻塞函数osSemaphoreAcquire一直等待,直到由参数semaphore_id指定的信号量对象的标记可用为止。如果一个令牌可用,该函数立即返回并递减令牌计数。 注意 :如果参数timeout设置为0,可以从中断服务例程调用。
//等待sem1信号量 osSemaphoreAcquire(sem1, osWaitForever);
osStatus_t osSemaphoreRelease(osSemaphoreId_t semaphore_id)
函数osSemaphoreRelease释放由参数semaphore_id指定的信号量对象的标记 注意 :该函数可以在中断服务例程调用
osSemaphoreRelease(sem1);
osStatus_t osSemaphoreDelete(osSemaphoreId_t semaphore_id)
函数osSemaphoreDelete 删除由参数semaphore_id指定的信号量
/删除信号量 osSemaphoreDelete(sem1); ----->图片的s_data是申请的信号量ID,这里换成我们创建的信号量ID--->sem1
osMessageQueueId_t osMessageQueueNew(uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr)
函数osMessageQueueNew创建并初始化一个消息队列对象。该函数返回消息队列对象标识符,如果出现错误则返回NULL,可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,也可以在内核初始化 (调用 osKernelInitialize)之前调用该函数。 注意 :不能在中断服务调用该函数
osMessageQueueId_t mid_MsgQueue; //number of Message Queue Objects #define MSGQUEUE_OBJECTS 16 mid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, 100, NULL); if (mid_MsgQueue == NULL) { printf("Falied to create Message Queue!\n"); }
osStatus_t osMessageQueuePut(osMessageQueueId_t mq_id,const void *msg_ptr,uint8_t msg_prio,uint32_t timeout)
函数osMessageQueuePut将msg_ptr指向的消息放入参数mq_id指定的消息队列中。 注意 :如果参数timeout设置为0,可以从中断服务例程调用
typedef struct { //object data type char *Buf; uint8_t Idx; } MSGQUEUE_OBJ_t; MSGQUEUE_OBJ_t msg; void Thread_MsgQueue1(void *argument) //发送消息线程 { (void)argument; //do some work... msg.Buf = "Hello BearPi-HM_Nano!"; msg.Idx = 0U; while (1) { osMessageQueuePut(mid_MsgQueue, &msg, 0U, 0U); //suspend thread osThreadYield(); osDelay(100); } }
osStatus_t osMessageQueueGet(osMessageQueueId_t mq_id,void *msg_ptr,uint8_t *msg_prio,uint32_t timeout)
函数osMessageQueueGet从参数mq_id指定的消息队列中检索消息,并将其保存到参数msg_ptr所指向的缓冲区中。 注意 :如果参数timeout设置为0,可以从中断服务例程调用。
void Thread_MsgQueue2(void *argument) { (void)argument; osStatus_t status; while (1) { //Insert thread code here... //wait for message status = osMessageQueueGet(mid_MsgQueue, &msg, NULL, 0U); if (status == osOK) { printf("Message Queue Get msg:%s\n", msg.Buf); } } }
osStatus_t osMessageQueueDelete(osMessageQueueId_t mq_id)
函数osMessageQueueDelete 删除mq_id指定的消息队列对象
osMessageQueueDelete (mid_MsgQueue ) //图片qid以创建获得的消息队列ID为主