cmsis-rtos Semaphore
2020-09-14 本文已影响0人
骑上我心爱的小蜗牛
- 创建信号量ID,创建os_semaphore_cb结构体指针
osSemaphoreId sync_sem_id;
- 定义osSemaphore引用的信号量对象,声明信号量。
osSemaphoreDef(sync_sem);
- 初始化信号量容器,创建并初始化一个Semaphore对象,该对象用于管理对共享资源的访问。
- 10为初始化给定令牌数。在无osSemaphoreRelease的情况下,令牌数决定了osSemaphoreWait不被阻塞的次数。
sync_sem_id = osSemaphoreCreate(osSemaphore(sync_sem), 10);
- 阻塞等待获取令牌。当sync_sem_id存在令牌数时,向下通行运行一次,令牌数同时-1;反之阻塞等待令牌的出现。return--当前使用的令牌号。
val=osSemaphoreWait(sync_sem_id, osWaitForever);
#define osWaitForever 0xFFFFFFFF ///< wait forever timeout value
int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec);
* 返回值:int32_t ,正常返回当前count数,失败返回-1。
* 如果需要阻塞延时,参数应该设置为CMSIS-RTOS API提供的宏定义 osWaitForever
* millisec等待的时间
- 获取1次令牌,当本函数被运行时,令牌数+1。
osSemaphoreRelease(sync_sem_id);
- 例程
#include "cmsis_os.h"
osSemaphoreId sync_sem_id;
osSemaphoreDef(sync_sem);
int main(void)
{
sync_sem_id = osSemaphoreCreate(osSemaphore(sync_sem), 10);
/* initialize CMSIS-RTOS */
osKernelInitialize(); // initialize CMSIS-RTOS
//CMSIS thread create
TaskTest_Id = osThreadCreate(osThread(test_thread), NULL);
/* start thread execution */
osKernelStart();
while(1)
{
osDelay(3);
val=osSemaphoreWait(sync_sem_id, osWaitForever);
printf("2\r\n");
if(val>0)
{
printf("val=%d\r\n",val);
// osSemaphoreRelease(sync_sem_id);
}
}
}
void test_thread(void const *arg)
{
/* test code begin */
while(1){
// osSemaphoreWait (sync_sem_id, osWaitForever);
// printf("1\r\n");
// osSemaphoreRelease(sync_sem_id);
// osDelay(1000);
}
/* test code end */
}
- 结果
2
val=10
2
val=9
2
val=8
2
val=7
2
val=6
2
val=5
2
val=4
2
val=3
2
val=2
2
val=1