你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32FreeRTOS二值信号量的基本介绍和操作

[复制链接]
STMCU小助手 发布时间:2022-5-20 18:57
前言
本文主要介绍什么是二值信号量和二值信号量的基本操作。

一、什么是二值信号量
信号量名副其实就是一个信号可以进行任务之前信息的交互,二值信号量通常用于互斥访问或同步。二值信号量就是一个只能保存一个数据的队列,这个队列要么是空要么是有他就只有两种状态。

二、cubeMX配置
1.选择添加一个二值信号量
CQ(67IOWE9146%C~)Z2Q$YF.png

2.设置二值信号量
这里比较简单我们只需要设置一下二值信号量的名字即可。

SWRDE$R(7UKEESIG4O15})1.png

三、代码编写
1.创建二值信号量
这部分代码cubeMX会帮我们书写好

  1. /* definition and creation of myBinarySem01 */
  2.   osSemaphoreDef(myBinarySem01);
  3.   myBinarySem01Handle = osSemaphoreCreate(osSemaphore(myBinarySem01), 1);

  4.   /* USER CODE BEGIN RTOS_SEMAPHORES */
复制代码

2.产生二值信号量函数
本函数cubeMX对其进行了封装,其本质还是调用了xSemaphoreGiveFromISR和xSemaphoreGive两个函数。

  1. /**
  2. * @brief Release a Semaphore token
  3. * @param  semaphore_id  semaphore object referenced with \ref osSemaphore.
  4. * @retval  status code that indicates the execution status of the function.
  5. * @note   MUST REMAIN UNCHANGED: \b osSemaphoreRelease shall be consistent in every CMSIS-RTOS.
  6. */
  7. osStatus osSemaphoreRelease (osSemaphoreId semaphore_id)
  8. {
  9.   osStatus result = osOK;
  10.   portBASE_TYPE taskWoken = pdFALSE;


  11.   if (inHandlerMode()) {
  12.     if (xSemaphoreGiveFromISR(semaphore_id, &taskWoken) != pdTRUE) {
  13.       return osErrorOS;
  14.     }
  15.     portEND_SWITCHING_ISR(taskWoken);
  16.   }
  17.   else {
  18.     if (xSemaphoreGive(semaphore_id) != pdTRUE) {
  19.       result = osErrorOS;
  20.     }
  21.   }

  22.   return result;
  23. }
复制代码

3.接收二值信号量函数
本函数cubeMX也对其进行了封装,其本质还是调用了xSemaphoreTakeFromISR和xSemaphoreTake两个函数。

当二值信号量接收成功的时候会返回osOK。

  1. /**
  2. * @brief Wait until a Semaphore token becomes available
  3. * @param  semaphore_id  semaphore object referenced with \ref osSemaphore.
  4. * @param  millisec      timeout value or 0 in case of no time-out.
  5. * @retval  number of available tokens, or -1 in case of incorrect parameters.
  6. * @note   MUST REMAIN UNCHANGED: \b osSemaphoreWait shall be consistent in every CMSIS-RTOS.
  7. */
  8. int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec)
  9. {
  10.   TickType_t ticks;
  11.   portBASE_TYPE taskWoken = pdFALSE;  


  12.   if (semaphore_id == NULL) {
  13.     return osErrorParameter;
  14.   }

  15.   ticks = 0;
  16.   if (millisec == osWaitForever) {
  17.     ticks = portMAX_DELAY;
  18.   }
  19.   else if (millisec != 0) {
  20.     ticks = millisec / portTICK_PERIOD_MS;
  21.     if (ticks == 0) {
  22.       ticks = 1;
  23.     }
  24.   }

  25.   if (inHandlerMode()) {
  26.     if (xSemaphoreTakeFromISR(semaphore_id, &taskWoken) != pdTRUE) {
  27.       return osErrorOS;
  28.     }
  29.         portEND_SWITCHING_ISR(taskWoken);
  30.   }  
  31.   else if (xSemaphoreTake(semaphore_id, ticks) != pdTRUE) {
  32.     return osErrorOS;
  33.   }

  34.   return osOK;
  35. }
复制代码

四、二值信号量具体操作
  1. osThreadId Task1TaskHandle;
  2. osThreadId Task2TaskHandle;

  3. void Task1Task(void const * argument);
  4. void Task2Task(void const * argument);

  5. osThreadDef(Task1TaskName, Task1Task, osPriorityNormal, 0, 128);
  6. Task1TaskHandle = osThreadCreate(osThread(Task1TaskName), NULL);

  7. osThreadDef(Task2TaskName, Task2Task, osPriorityNormal, 0, 128);
  8. Task2TaskHandle = osThreadCreate(osThread(Task2TaskName), NULL);

  9. //产生二值信号量任务
  10. void Task1Task(void const * argument)
  11. {
  12.         static u8 i=0;
  13.         for(;;)
  14.         {
  15.                 //调用10次再产生二值信号量
  16.                 if(++i==10)
  17.                 {
  18.                         osSemaphoreRelease(myBinarySem01Handle);//产生二值信号量               
  19.                 }
  20.                 osDelay(5);//调用延时才会释放资源
  21.         }
  22. }


  23. //接收二值信号量任务
  24. void Task2Task(void const * argument)
  25. {
  26.         for(;;)
  27.         {
  28.                 if(osOK==osSemaphoreWait(myBinarySem01Handle,portMAX_DELAY))//等待二值信号量采用死等的方式
  29.             {
  30.                       //等待二值信号量成功
  31.                    }
  32.                 osDelay(5);//调用延时才会释放资源
  33.         }
  34. }
复制代码
总结
二值信号量的大致操作和介绍就是这样了。



收藏 评论0 发布时间:2022-5-20 18:57

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版