[活动] 【极海APM32F407IG Tiny Board开发板测评】10.初试FreeRTOS

[复制链接]
 楼主| yuyy1989 发表于 2023-7-15 08:55 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂
10.初试FreeRTOS
还是第一次接触FreeRTOS,慢慢学习
RTOS即Real Time Operating System 实时操作系统,FreeRTOS是一个免费开源并且应用非常广泛的RTOS
平常的裸机编程在初始化完成之后,所有的操作都在while(1)这个大循环里按顺序完成,如果某一个操作比较耗时就会在这里多阻塞一会而影响后面操作的执行,例如下面这段代码

  1. int main(void)
  2. {
  3.     APM_DelayInit();
  4.     APM_TINY_LEDInit(LED2);
  5.     APM_TINY_LEDInit(LED3);
  6.     APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
  7.     APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
  8.     while (1)
  9.     {
  10.         if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
  11.         {
  12.             APM_DelayMs(30);
  13.             if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
  14.             {
  15.                 while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
  16.                 APM_TINY_LEDToggle(LED2);
  17.             }
  18.         }
  19.         if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
  20.         {
  21.             APM_DelayMs(30);
  22.             if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
  23.             {
  24.                 while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
  25.                 APM_TINY_LEDToggle(LED3);
  26.             }
  27.         }
  28.     }
  29. }
在按住KEY1不松开时就会一直卡在while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);这里,后面KEY2的按键状态就没法判断了
而在RTOS下可以为这两个按键单独创建2个任务,2个任务独立执行,类似于电脑操作系统里的多线程
不过既然叫OS运行必定要耗费一定的资源,APM32F407的性能还是可以支持RTOS的运行的,在官方的例程里已经有了FreeRTOS的例程,接下来通过这个例程来了解一下FreeRTOS
这个例程是基于MINI board的,先改一下换成TINY board,修改宏定义
QQ截图20230714105101.png
替换main.c中的MINI为TINY
QQ截图20230714105157.png
QQ截图20230714105333.png
编译运行
WeChat_20230714112341 00_00_00-00_00_30.gif
接下来在这个工程的基础上改一下按键点灯的程序,让两个按键可以独立检测
代码示例

  1. static TaskHandle_t xHandleKey1Task = NULL;
  2. static TaskHandle_t xHandleKey2Task = NULL;
  3. int main(void)
  4. {
  5.     APM_TINY_LEDInit(LED2);
  6.     APM_TINY_LEDInit(LED3);
  7.     APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
  8.     APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);

  9.     /** User create task */
  10.     UserTaskCreate();

  11.     /** Startup FreeRTOS */
  12.     vTaskStartScheduler();

  13.     while(1);
  14. }

  15. void vKey1checkTask(void *pvParameters)
  16. {
  17.     while(1)
  18.     {
  19.         if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
  20.         {
  21.             vTaskDelay(30);
  22.             if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
  23.             {
  24.                 while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
  25.                 APM_TINY_LEDToggle(LED2);
  26.             }
  27.         }
  28.     }
  29. }
  30.    
  31. void vKey2checkTask(void *pvParameters)
  32. {
  33.     while(1)
  34.     {
  35.         if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
  36.         {
  37.             vTaskDelay(30);
  38.             if(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET)
  39.             {
  40.                 while(APM_TINY_PBGetState(BUTTON_KEY2) == BIT_RESET);
  41.                 APM_TINY_LEDToggle(LED3);
  42.             }
  43.         }
  44.     }
  45. }

  46. static void UserTaskCreate(void)
  47. {
  48.     xTaskCreate(vKey1checkTask,"Key1checkTask",128,NULL,0,&xHandleKey1Task);
  49.     xTaskCreate(vKey2checkTask,"Key2checkTask",128,NULL,0,&xHandleKey2Task);
  50. }
运行效果

WeChat_20230714112348 00_00_00-00_00_30.gif
可以看到一个按键保持按下,另一个按键也能正常工作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部