[APM32F4] 【APM32F402R Micro-EVB开发板测评】APM32F402移植μC/OS-III详细教程

[复制链接]
 楼主| hbzjt2011 发表于 2025-7-24 21:12 | 显示全部楼层 |阅读模式
本帖最后由 hbzjt2011 于 2025-7-24 21:26 编辑

#申请原创# @21小跑堂
1. 前言
APM32F402是极海半导体推出的32位ARM Cortex-M4内核微控制器,与STM32F4系列高度兼容。μC/OS-III是Micrium公司开发的抢占式实时操作系统内核,支持无限制的任务数量和优先级。本教程将详细介绍如何将μC/OS-III移植到APM32F402平台。

2. 准备工作2.1 所需软件工具
  • Keil MDK-ARM 开发环境
  • APM32F402 开发板及相关驱动
  • μC/OS-III源码 (从GitHub或Micrium官网获取)
  • APM32F402 HAL库 或标准外设库
2.2 获取μC/OS-III源码
μC/OS-III需要以下三个组件:
  • μC/OS-III: 操作系统内核
  • μC/CPU: CPU相关的代码
  • μC/LIB: Micrium公司提供的通用库
可以从以下途径获取:

3. μC/OS-III源码结构分析3.1 目录结构
  1. μC/OS-III/
  2. ├── Source/           # 内核源码文件
  3. ├── Ports/            # 各种CPU架构的移植文件
  4. │   └── ARM-Cortex-M4/
  5. │       └── Generic/
  6. │           └── RealView/  # ARM编译器相关文件
  7. ├── Template/         # 配置模板文件
  8. └── Cfg/             # 配置文件
3.2 核心文件说明
  • os_core.c: 系统核心功能
  • os_task.c: 任务管理
  • os_time.c: 时间管理
  • os_cfg_app.h: 应用配置头文件
  • os_cfg.h: 系统配置头文件
4. 移植步骤详解
4.1 第一步:下载所需源码文件
在官方SDK文件夹中的..\APM32F402_403_SDK_V1.0.1\Middlewares目录下新建uCOSIII文件夹,并从github下载所需的uC-OS3、uC-CPU以及uC-LIB三个组件:
496846882011a5a34c.png
37904688201646fcd0.png
4.2 第二步:建立基础工程
复制SDK中..\APM32F402_403_SDK_V1.0.1\Examples\Board_APM32F402_Tiny文件夹中的SysTick文件夹并重新命名为uCOSIII,同时更新工程文件名字为uCOSIII_APM32:
106876882026938f72.png
111416882030ac559e.png
4.3 第三步:添加μC/OS-III源码
在工程中创建以下分组并添加对应文件:
uCOS-III/Source 分组
添加以下源文件:
  1. os_cfg_app.c
  2. os_core.c
  3. os_dbg.c
  4. os_flag.c
  5. os_int.c
  6. os_mem.c
  7. os_msg.c
  8. os_mutex.c
  9. os_pend_multi.c
  10. os_prio.c
  11. os_q.c
  12. os_sem.c
  13. os_stat.c
  14. os_task.c
  15. os_tick.c
  16. os_time.c
  17. os_tmr.c
  18. os_var.c

89757688204aa3bf50.png
2502268821ef32423f.png
uCOS-III/Ports 分组
添加Cortex-M4相关的移植文件:
  1. os_cpu_a.s          # 汇编文件,包含上下文切换代码  
  2. os_cpu_c.c          # C语言实现的CPU相关函数
  3. os_cpu.h            # CPU相关头文件
22172688206e800cf7.png
uC-CPU 分组
  1. cpu_core.c
7643668820809dd351.png
uC-LIB 分组
  1. lib_ascii.c
  2. lib_math.c
  3. lib_mem.c
  4. lib_str.c
449316882087fed25f.png
uC-MISC 分组
  1. bsp_cpu.c
55082688209568a0fc.png
4.4 第四步:配置包含路径
在工程选项中添加以下包含路径:
  1. .\μCOS-III\Source
  2. .\μCOS-III\Ports\ARM-Cortex-M4\Generic\RealView
  3. .\μC-CPU
  4. .\μC-CPU\ARM-Cortex-M4\RealView
  5. .\μC-LIB
6148168820af54f16f.png
4.5 第五步:添加app_cfg.h配置文件
2875468820c61f3314.png

  1. #ifndef  APP_CFG_MODULE_PRESENT
  2. #define  APP_CFG_MODULE_PRESENT


  3. /*
  4. *********************************************************************************************************
  5. *                                       MODULE ENABLE / DISABLE
  6. *********************************************************************************************************
  7. */

  8. #define  APP_CFG_SERIAL_EN                      DEF_ENABLED


  9. /*
  10. *********************************************************************************************************
  11. *                                            TASK PRIORITIES
  12. *********************************************************************************************************
  13. */

  14. #define  APP_CFG_TASK_START_PRIO                2u
  15. #define  APP_CFG_TASK_OBJ_PRIO                  3u
  16. #define  APP_HIGH_PRIORITY                      (APP_CFG_TASK_START_PRIO+1)
  17. /*
  18. *********************************************************************************************************
  19. *                                            TASK STACK SIZES
  20. *                             Size of the task stacks (# of OS_STK entries)
  21. *********************************************************************************************************
  22. */

  23. #define  APP_CFG_TASK_START_STK_SIZE            512u
  24. #define  APP_CFG_TASK_OBJ_STK_SIZE              512u


  25. /*
  26. *********************************************************************************************************
  27. *                                     TRACE / DEBUG CONFIGURATION
  28. *********************************************************************************************************
  29. */

  30. #ifndef  TRACE_LEVEL_OFF
  31. #define  TRACE_LEVEL_OFF                        0u
  32. #endif

  33. #ifndef  TRACE_LEVEL_INFO
  34. #define  TRACE_LEVEL_INFO                       1u
  35. #endif

  36. #ifndef  TRACE_LEVEL_DBG
  37. #define  TRACE_LEVEL_DBG                        2u
  38. #endif


  39. #if (APP_CFG_SERIAL_EN == DEF_ENABLED)
  40. #define  APP_TRACE_LEVEL                        TRACE_LEVEL_DBG
  41. #else
  42. #define  APP_TRACE_LEVEL                        TRACE_LEVEL_OFF
  43. #endif
  44. #define  APP_TRACE                              printf

  45. #define  APP_TRACE_INFO(x)               ((APP_TRACE_LEVEL >= TRACE_LEVEL_INFO)  ? (void)(APP_TRACE x) : (void)0)
  46. #define  APP_TRACE_DBG(x)                ((APP_TRACE_LEVEL >= TRACE_LEVEL_DBG)   ? (void)(APP_TRACE x) : (void)0)

  47. #endif
4.6 第六步:修改启动文件修改 startup_apm32f402.s将PendSV_Handler 和 SysTick_Handler 分别改为OS_CPU_PendSVHandler 和OS_CPU_SysTickHandler
7389368822f08d65f6.png 6471468822f21b32e4.png
4.7 第七步:编写应用程序main.c 示例代码
  1. /**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]        main.c
  3. *
  4. * [url=home.php?mod=space&uid=247401]@brief[/url]       Main program body
  5. *
  6. * [url=home.php?mod=space&uid=895143]@version[/url]     V1.0.0
  7. *
  8. * [url=home.php?mod=space&uid=212281]@date[/url]        2024-12-01
  9. *
  10. * @attention
  11. *
  12. *  Copyright (C) 2024-2025 Geehy Semiconductor
  13. *
  14. *  You may not use this file except in compliance with the
  15. *  GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. *  The program is only for reference, which is distributed in the hope
  18. *  that it will be useful and instructional for customers to develop
  19. *  their software. Unless required by applicable law or agreed to in
  20. *  writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. *  ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. *  See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. *  and limitations under the License.
  24. */

  25. /* Includes ***************************************************************/
  26. #include "main.h"
  27. #include "board_apm32f402_403_tiny.h"
  28. #include <stdio.h>
  29. #include "os.h"
  30. #include "app_cfg.h"

  31. /* Private includes *******************************************************/

  32. /* Private macro **********************************************************/

  33. /* Private typedef ********************************************************/
  34. #define DEBUG_USART USART1


  35. /* Private variables ******************************************************/
  36. // 任务控制块
  37. static OS_TCB AppTaskStartTCB;
  38. static OS_TCB AppTask1TCB;
  39. static OS_TCB AppTask2TCB;

  40. // 任务堆栈
  41. static CPU_STK AppTaskStartStk[128];
  42. static CPU_STK AppTask1Stk[128];
  43. static CPU_STK AppTask2Stk[128];

  44. // 任务函数声明
  45. static void AppTaskStart(void *p_arg);
  46. static void AppTask1(void *p_arg);
  47. static void AppTask2(void *p_arg);

  48. /* Private function prototypes ********************************************/

  49. /* External variables *****************************************************/

  50. /* External functions *****************************************************/

  51. /**
  52. * [url=home.php?mod=space&uid=247401]@brief[/url]   Main program
  53. *
  54. * @param   None
  55. *
  56. * @retval  None
  57. */
  58. int main(void)
  59. {
  60.                 USART_Config_T usartConfigStruct;

  61.                 usartConfigStruct.baudRate = 115200;
  62.                 usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  63.                 usartConfigStruct.mode = USART_MODE_TX;
  64.                 usartConfigStruct.parity = USART_PARITY_NONE;
  65.                 usartConfigStruct.stopBits = USART_STOP_BIT_1;
  66.                 usartConfigStruct.wordLength = USART_WORD_LEN_8B;

  67.                 BOARD_COM_Config(COM1, &usartConfigStruct);
  68.                
  69.     BOARD_LED_Config(LED2);
  70.     BOARD_LED_Config(LED3);
  71.     SysTick_Config(RCM_ReadSYSCLKFreq() / 1000);
  72.         
  73.                 printf("ucOSIII RTOS on APM32F402R Micro-EVB Board\r\n");
  74.         
  75.                 OS_ERR err;
  76.                         
  77.                         // 初始化μC/OS-III
  78.                         OSInit(&err);
  79.                         
  80.                         // 创建启动任务
  81.                         OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,
  82.                                                                          (CPU_CHAR     *)"App Task Start",
  83.                                                                          (OS_TASK_PTR   )AppTaskStart,
  84.                                                                          (void         *)0,
  85.                                                                          (OS_PRIO       )4,
  86.                                                                          (CPU_STK      *)&AppTaskStartStk[0],
  87.                                                                          (CPU_STK_SIZE  )128/10,
  88.                                                                          (CPU_STK_SIZE  )128,
  89.                                                                          (OS_MSG_QTY    )0,
  90.                                                                          (OS_TICK       )0,
  91.                                                                          (void         *)0,
  92.                                                                          (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  93.                                                                          (OS_ERR       *)&err);
  94.                         
  95.                         // 启动多任务调度
  96.                         OSStart(&err);
  97.    

  98.     /* Infinite loop */
  99.     while (1)
  100.     {
  101.                                 
  102.     }
  103. }

  104. static void AppTaskStart(void *p_arg)
  105. {
  106.     OS_ERR err;
  107.    
  108.     // 创建其他任务
  109.     OSTaskCreate((OS_TCB       *)&AppTask1TCB,
  110.                  (CPU_CHAR     *)"App Task 1",
  111.                  (OS_TASK_PTR   )AppTask1,
  112.                  (void         *)0,
  113.                  (OS_PRIO       )5,
  114.                  (CPU_STK      *)&AppTask1Stk[0],
  115.                  (CPU_STK_SIZE  )128/10,
  116.                  (CPU_STK_SIZE  )128,
  117.                  (OS_MSG_QTY    )0,
  118.                  (OS_TICK       )0,
  119.                  (void         *)0,
  120.                  (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  121.                  (OS_ERR       *)&err);
  122.    
  123.     OSTaskCreate((OS_TCB       *)&AppTask2TCB,
  124.                  (CPU_CHAR     *)"App Task 2",
  125.                  (OS_TASK_PTR   )AppTask2,
  126.                  (void         *)0,
  127.                  (OS_PRIO       )6,
  128.                  (CPU_STK      *)&AppTask2Stk[0],
  129.                  (CPU_STK_SIZE  )128/10,
  130.                  (CPU_STK_SIZE  )128,
  131.                  (OS_MSG_QTY    )0,
  132.                  (OS_TICK       )0,
  133.                  (void         *)0,
  134.                  (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  135.                  (OS_ERR       *)&err);
  136.    
  137.     while(1)
  138.     {
  139.         // 启动任务主循环
  140.         OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, &err);
  141.     }
  142. }

  143. static void AppTask1(void *p_arg)
  144. {
  145.     OS_ERR err;
  146.    
  147.     while(1)
  148.     {
  149.         // 任务1的功能代码
  150.         // LED2闪烁
  151.         BOARD_LED_Toggle(LED2);
  152.         OSTimeDlyHMSM(0, 0, 0, 800, OS_OPT_TIME_HMSM_STRICT, &err);
  153.                                 printf("LED2 toggled\r\n");
  154.     }
  155. }

  156. static void AppTask2(void *p_arg)
  157. {
  158.     OS_ERR err;
  159.    
  160.     while(1)
  161.     {
  162.         // 任务2的功能代码  
  163.         // LED3闪烁
  164.         BOARD_LED_Toggle(LED3);
  165.         OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_HMSM_STRICT, &err);
  166.                                 printf("LED3 toggled\r\n");
  167.     }
  168. }


  169. /*!

  170. * Redirect C Library function printf to serial port.

  171. * After Redirection, you can use printf function.

  172. *

  173. * @param ch: The characters that need to be send.

  174. *

  175. * @param *f: pointer to a FILE that can recording all information

  176. * needed to control a stream

  177. *

  178. * @retval The characters that need to be send.

  179. */

  180. int fputc(int ch, FILE *f)

  181. {

  182. /** send a byte of data to the serial port */

  183.         USART_TxData(DEBUG_USART, (uint8_t)ch);

  184. /** wait for the data to be send */

  185. while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);

  186. return (ch);

  187. }



串口输出及LED灯交替闪烁 7868068822fe4cb4aa.png

469506882313f5868f.gif

5. 常见问题及解决方案5.1 编译错误处理
  • 包含路径错误: 确保所有必要的头文件路径都已添加到工程中
  • 宏定义冲突: 检查os_cfg.h和os_cfg_app.h中的配置是否正确
  • 链接错误: 确保所有必要的源文件都已添加到工程中
5.2 运行时问题
  • 系统无法启动: 检查堆栈大小是否足够,建议初始堆栈至少128字节
  • 任务切换异常: 确保PendSV和SysTick中断优先级设置正确
  • 系统卡死: 检查是否有任务没有延时或阻塞,导致低优先级任务无法运行
5.3 FPU支持(如果使用浮点运算)
APM32F402支持硬件浮点单元,如果应用中需要使用浮点运算:
  • 在编译选项中启用FPU支持
  • 修改os_cpu_a.s文件中的上下文切换代码,保存和恢复浮点寄存器
  • 在任务堆栈计算中考虑浮点寄存器的空间需求


6. 性能优化建议6.1 任务优先级分配
  • 中断服务任务:优先级0-3
  • 实时性要求高的任务:优先级4-15
  • 一般应用任务:优先级16-31
6.2 堆栈大小配置
  • 简单任务:128-256字节
  • 复杂任务:512-1024字节
  • 中断堆栈:256-512字节
6.3 系统配置优化
  • 根据实际需求配置OS_CFG_PRIO_MAX,减少内存占用
  • 合理配置消息池大小
  • 启用必要的功能选项,关闭不需要的功能

7. 调试技巧7.1 使用μC/OS-III内置调试功能
  1. #define OS_CFG_DBG_EN    1u    // 使能调试功能

7.2 任务运行状态监控
使用OSTaskStkChk()函数检查任务堆栈使用情况:
  1. OS_STK_DATA stk_data;
  2. OSTaskStkChk(&AppTask1TCB, &stk_data, &err);

7.3 系统统计信息
启用系统统计功能查看CPU使用率:
  1. #define OS_CFG_STAT_TASK_EN    1u

8. 总结
通过本教程,您应该能够成功将μC/OS-III移植到APM32F402平台。关键要点包括:
  • 正确配置编译环境和包含路径
  • 添加必要的源文件和移植文件
  • 修改配置文件以适应具体应用需求
  • 正确处理中断向量表
  • 合理分配任务优先级和堆栈大小
移植完成后,建议从简单的多任务程序开始测试,逐步增加复杂功能,确保系统稳定运行。

9. 参考资料
  • μC/OS-III官方文档
  • APM32F402用户手册
  • ARM Cortex-M4技术参考手册
  • 《μC/OS-III内核实现与应用开发实战指南》




  
Gfan 发表于 2025-7-25 16:45 | 显示全部楼层
支持支持,大佬的移植测评非常详细,有心啦~希望这块板子能带来更多惊喜
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎参与LabVIEW版块的讨论学习! 点我一键即达

256

主题

2827

帖子

44

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