美文网首页
cmsis-rtos Semaphore

cmsis-rtos Semaphore

作者: 骑上我心爱的小蜗牛 | 来源:发表于2020-09-14 16:09 被阅读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

相关文章

网友评论

      本文标题:cmsis-rtos Semaphore

      本文链接:https://www.haomeiwen.com/subject/saezektx.html