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

【经验分享】STM32G0学习手册——FreeRTOS信号量

[复制链接]
STMCU小助手 发布时间:2021-11-12 01:00
二值信号量的用法示例
1.创建好带有printf-stdarg.c的FreeRTOS的工程

2.修改main.c文件

  1. /* USER CODE BEGIN Includes */

  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include "queue.h"
  5. #include "semphr.h"
  6. #include <stdio.h>
  7. #include <string.h>

  8. /* USER CODE END Includes */
  9. /* USER CODE BEGIN PV */

  10. static TaskHandle_t AppTaskCreate_Handle = NULL;
  11. static TaskHandle_t KeyTask_Handle = NULL;
  12. static TaskHandle_t Led1Task_Handle = NULL;

  13. /*Create a binary semaphore handle*/
  14. static SemaphoreHandle_t Binary_Handle = NULL;

  15. extern int f_printf(const char *format, ...);

  16. /* USER CODE END PV */
  17. /* USER CODE BEGIN PFP */

  18. /*Create a task function*/
  19. static void AppTaskCreate(void);
  20. static void KeyTaskCreate(void);
  21. static void Led1TaskCreate(void);

  22. /* USER CODE END PFP */

  23. int main()
  24. {
  25.   /*
  26.   *
  27.   */
  28.   /* USER CODE BEGIN WHILE */
  29.   UBaseType_t xReturn = pdPASS;
  30.         
  31.         xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
  32.                               (const char *) "APPTASKCREATE",
  33.                                                   (uint16_t)     128,
  34.                                                   (void *)       NULL,
  35.                                                   (UBaseType_t)  2,
  36.                                                   (TaskHandle_t *)&AppTaskCreate_Handle);
  37.   if(xReturn ==pdPASS)
  38.         {
  39.                 vTaskStartScheduler();
  40.                 f_printf("start..\r\n");
  41.         }
  42.   while (1)
  43.   {
  44.     /* USER CODE END WHILE */

  45.     /* USER CODE BEGIN 3 */
  46.   }
  47.   /* USER CODE END 3 */


  48. }


  49. /* USER CODE BEGIN 4 */
  50. static void AppTaskCreate(void)
  51. {
  52.   UBaseType_t xReturn = pdPASS;


  53.   xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,
  54.                              (const char *)   "KEYTASKCREATE",
  55.                                                  (uint16_t)       128,
  56.                                                  (void *)         NULL,
  57.                                                  (UBaseType_t )   2,
  58.                                                  (TaskHandle_t *) &KeyTask_Handle);

  59.   xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,
  60.                                                 (const char *)   "LED1TASKCREATE",
  61.                                                 (uint16_t)       128,
  62.                                                 (void *)         NULL,
  63.                                                 (UBaseType_t)    1,
  64.                                                 (TaskHandle_t *)&Led1Task_Handle);
  65.         
  66.     /*Create a binary semaphore*/
  67.         Binary_Handle = xSemaphoreCreateBinary();
  68.         if(Binary_Handle !=NULL)
  69.                 f_printf("Create Semph_Binary PASS.\r\n");
  70.         
  71.         if(xReturn == pdPASS)
  72.     vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);               
  73. }

  74. static void KeyTaskCreate(void)
  75. {
  76.   while(1)
  77.         {
  78.                 UBaseType_t xReturn = pdPASS;
  79.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  80.                 {
  81.                         f_printf("KEY TASK PASS.\r\n");
  82.                         vTaskDelay(100);
  83.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  84.                         {
  85.                                 xReturn = xSemaphoreGive(Binary_Handle);
  86.                                 if(xReturn == pdPASS)
  87.                                         f_printf("GIVE BINARY PASS.\r\n");
  88.                                 else if(xReturn == errQUEUE_FULL)
  89.                                         f_printf("QUEUE IS FULL.\r\n");
  90.                         }
  91.                 }
  92.                
  93.     vTaskDelay(100);
  94.         }

  95. }
  96. static void Led1TaskCreate(void)
  97. {
  98.   while(1)
  99.         {
  100.                 UBaseType_t xReturn = pdPASS;
  101.                
  102.                 xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);
  103.                 if(xReturn == pdPASS)
  104.                 {
  105.                         f_printf("TAKE BINARY PASS.\r\n");
  106.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
  107.                 }
  108.                
  109.           vTaskDelay(100);
  110.         }
  111. }

  112. /* USER CODE END 4 */
复制代码

计数信号量的用法示例
1.创建好带有printf-stdarg.c的FreeRTOS的工程

2.修改main.c文件

  1. /* USER CODE BEGIN Includes */

  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include "queue.h"
  5. #include "semphr.h"
  6. #include <stdio.h>
  7. #include <string.h>

  8. /* USER CODE END Includes */
  9. /* USER CODE BEGIN PV */
  10. static TaskHandle_t AppTaskCreate_Handle = NULL;
  11. static TaskHandle_t KeyTask_Handle = NULL;
  12. static TaskHandle_t Led1_Handle = NULL;

  13. SemaphoreHandle_t SemaphCount_Handle = NULL;

  14. extern int f_printf(const char *format, ...);

  15. /* USER CODE END PV */

  16. /* USER CODE BEGIN PFP */

  17. static void AppTaskCreate(void);
  18. static void KeyTaskCreate(void);
  19. static void LED1TaskCreate(void);

  20. /* USER CODE END PFP */

  21. int main()
  22. {
  23.   ***

  24.   /* USER CODE BEGIN WHILE */

  25.   UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
  26.                                     (const char *)"APPTASKCREATE",
  27.                                                                         (uint16_t)    128,
  28.                                                                         (void *)      NULL,
  29.                                                                         (UBaseType_t) 2,
  30.                                                                         (TaskHandle_t *)&AppTaskCreate_Handle);
  31.         if(xReturn ==pdPASS)
  32.         {
  33.                 f_printf("TASK START.\r\n");
  34.                 vTaskStartScheduler();
  35.         }
  36.   while (1)
  37.   {
  38.     /* USER CODE END WHILE */

  39.     /* USER CODE BEGIN 3 */
  40.   }
  41.   /* USER CODE END 3 */
  42. }

  43. /* USER CODE BEGIN 4 */
  44. static void AppTaskCreate(void)
  45. {

  46.   UBaseType_t xReturn ;
  47.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
  48.                                     (const char *) "KEYTASKCREATE",
  49.                                     (uint16_t)      128,
  50.                                                                         (void *)       NULL,
  51.                                                                         (UBaseType_t)   2,
  52.                                                                         (TaskHandle_t*)&KeyTask_Handle);
  53.   if(xReturn == pdPASS)
  54.                 f_printf("KEY CREATE PASS.\r\n");

  55.   xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,
  56.                                                 (const char *)  "LED1TASKCREATE",
  57.                                                 (uint16_t)      128,
  58.                                                 (void *)        NULL,
  59.                                                 (UBaseType_t)   1,
  60.                                                 (TaskHandle_t*)&Led1_Handle);

  61.         SemaphCount_Handle = xSemaphoreCreateCounting(3,0);
  62.         if(SemaphCount_Handle != NULL)
  63.                 f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");
  64.         
  65.   if(xReturn == pdPASS)
  66.         {
  67.                 f_printf("LED CREATE PASS.\r\n");        
  68.                 vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);
  69.         }
  70. }


  71. static void KeyTaskCreate(void)
  72. {
  73.   while(1)
  74.         {
  75.                 UBaseType_t xReturn = pdPASS;
  76.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  77.                 {
  78.                         vTaskDelay(100);
  79.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
  80.                         {
  81.                                 f_printf("KEY PRESS.\r\n");
  82.                                 xReturn = xSemaphoreGive(SemaphCount_Handle);
  83.                                 if(xReturn == pdPASS)
  84.                                         f_printf("GIVE COUNTING PASS.\r\n");
  85.                                 else if(xReturn == errQUEUE_FULL)
  86.                                         f_printf("QUEUE IS FULL.\r\n");
  87.                         }
  88.                 }               
  89.                 vTaskDelay(10);
  90.         }
  91. }
  92. static void LED1TaskCreate(void)
  93. {
  94.         while(1)
  95.         {
  96.                 UBaseType_t xReturn = pdPASS;
  97.                
  98.                 xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);
  99.                
  100.                 if(xReturn == pdTRUE)
  101.                 {
  102.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
  103.                         f_printf("Counting Take PASS.\r\n");
  104.                 }
  105.                 else if(xReturn == errQUEUE_EMPTY)
  106.                         f_printf("semaphore is empty.\r\n");
  107.                 vTaskDelay(2000);
  108.         }
  109. }
  110. /* USER CODE END 4 */

复制代码

收藏 评论0 发布时间:2021-11-12 01:00

举报

0个回答

所属标签

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