[APM32F4] 【极海APM32F402 Micro-EVB开发板】--FreeRTOS移植与运行

[复制链接]
726|10
 楼主| dirty123 发表于 2025-7-26 19:31 | 显示全部楼层 |阅读模式
本帖最后由 dirty123 于 2025-7-26 22:49 编辑

      本篇讲述极海APM32F402 Micro-EVB开发板移植FreeRTOS与运行。      
      开发板MCU APM32F402RBT6有128KB Flash,32KB RAM,32 位 Arm® Cortex®-M4F 内核,是可以移植使用FreeRTOS系统的。
一.代码准备
      虽然官方APM32F402_403_SDK_V1.0.2\Examples\Board_APM32F402_Tiny\RTOS\CMSIS_FreeRTOS已经有移植好的FreeRTOS Demo,这里还是温故下,以下是一直步骤,可供参考。
1.下载FreeRTOS源代码。一直会用到其中的文件。
2.系统时钟
      一般要实现SysTick_Handler滴答定时函数,PendSV_Handler中断函数,这里查了下Geehy使用了CMSIS-FreeRTOS中间件,具体实现在APM32F402_403_SDK_V1.0.2\Middlewares\CMSIS-FreeRTOS\CMSIS\RTOS2\FreeRTOS\Source\cmsis_os2.c和os_systick.c
3.FreeRTOS源文件工程添加。
      这部分包括系统的任务、消息队列、定时器、事件等的库源代码及Port接入口及内存操作源文件。具体在工程中体现如下
1_RTOS源文件工程.png
4.系统配置
      在Examples\Board_APM32F403_Tiny\RTOS\CMSIS_FreeRTOS\Include\FreeRTOSConfig.h是系统配置文件,可对系统进行配置与裁剪。
      下面框图可以看到配置的系统堆栈大小(可影响到编译后的RAM与Flash使用情况)及系统定时器频率。右侧部分则是使能/失能了系统功能及系统中断的接入。
2_系统配置文件.png
5.main函数代码
      这里主要是初始化系统调度器后,创建了两个任务,Led_Thread任务实现500ms间隔LED2闪烁,在Usart_TestThread任务实现间隔1s串口打印测试。两个任务都分配了512字节大小,优先级24.
main函数
  1. int main(void)
  2. {
  3.     USART_Config_T USART_ConfigStruct;

  4.     /* USART config */
  5.     USART_ConfigStructInit(&USART_ConfigStruct);
  6.     USART_ConfigStruct.baudRate = 115200;
  7.     USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  8.     USART_ConfigStruct.mode = USART_MODE_TX;
  9.     USART_ConfigStruct.parity = USART_PARITY_NONE;
  10.     USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
  11.     USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
  12.     BOARD_COM_Config(COM1, &USART_ConfigStruct);

  13.     /* Configures LED 2,3 */
  14.     BOARD_LED_Config(LED2);
  15.     BOARD_LED_Config(LED3);
  16.                 printf("Welcome to use Geehy RTOS\r\n");
  17.     /* Initialize the RTOS scheduler */
  18.     osKernelInitialize();

  19.     /* Create the thread */
  20.     ledThreadID = osThreadNew(Led_Thread, NULL, &ledThreadattr);
  21.     if (ledThreadID == NULL)
  22.     {
  23.         printf("Create led thread failed!\r\n");
  24.     }

  25.     usartThreadID = osThreadNew(Usart_TestThread, NULL, &usartThreadattr);
  26.     if (usartThreadID == NULL)
  27.     {
  28.         printf("Create usart thread failed!\r\n");
  29.     }

  30.     /* Start the RTOS scheduler */
  31.     osKernelStart();

  32.     /* Infinite loop */
  33.     while (1);
  34. }

Led_Thread任务
  1. void Led_Thread(void *argument)
  2. {
  3.     UNUSED(argument);

  4.     while (1)
  5.     {
  6.         /* Toggle LED2 */
  7.         BOARD_LED_Toggle(LED2);
  8.         osDelay(500);
  9.     }
  10. }

Usart_TestThread任务
  1. void Usart_TestThread(void *argument)
  2. {
  3.     UNUSED(argument);

  4.     while (1)
  5.     {
  6.         /* Print message */
  7.         printf("Hello, world!\r\n");
  8.         osDelay(1000);
  9.     }
  10. }
6.代码编译
      编译后可以看到资源使用情况。Flash约10KB,RAM 约5KB。
3_资源使用情况.png

二.测验
      编译烧录后,可以看到LED2闪烁,系统正常运行串口日志如下
4_系统运行日志.png





星辰伴梦 发表于 2025-7-28 09:37 | 显示全部楼层
非常详细的FreeRTOS移植教程,感谢分享!我正准备在APM32F402上使用FreeRTOS,这篇文章帮了大忙。
银河漫步 发表于 2025-7-28 22:41 | 显示全部楼层
还是搭载 RTOS之后这项目看着舒服
雾里闲逛 发表于 2025-7-29 07:21 | 显示全部楼层
还是使用RTOS方便。
话说,楼主这是对FreeRTOS做了一层封装吗?
 楼主| dirty123 发表于 2025-7-30 00:01 | 显示全部楼层
雾里闲逛 发表于 2025-7-29 07:21
还是使用RTOS方便。
话说,楼主这是对FreeRTOS做了一层封装吗?

万变不离其宗
发光的梦 发表于 2025-9-9 08:54 | 显示全部楼层
现在为什么要使用这个CMSIS_V2的API接口。
FreeRTOS的接口不好吗?
分形梦想家 发表于 2025-9-10 19:34 | 显示全部楼层
都是M4的内核了,跑RTOS就很平常了
彩虹捕手 发表于 2025-9-12 10:37 | 显示全部楼层
Flash和RAM占用都很合理
梦塑者 发表于 2025-9-12 15:56 | 显示全部楼层
SRAM 方面楼主打开了静态和动态的malloc方式。我一直以为这个只能两选一呢
GalaxyStroll 发表于 2025-9-13 10:26 | 显示全部楼层
当时觉得FreeRTOSConfig.h文件就非常厉害的一个设计。
现在我自己也这样设计了,跟上了大佬们的步伐
FrostShimmer 发表于 2025-9-14 19:56 | 显示全部楼层
移植FreeRTOS的步骤还是挺简单的。
用了RTOS之后,一定要有全局设计思想了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

138

帖子

1

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