[MM32硬件] 【灵动微电子MM32F0121测评】8.移植RTOS

[复制链接]
4133|1
 楼主| 阿源玩电子 发表于 2025-7-5 15:02 | 显示全部楼层 |阅读模式
本帖最后由 阿源玩电子 于 2025-7-5 15:08 编辑

MM32F0121移植RTOS


#申请原创#1.进入FreeRTOS官网下载源码
  • FreeRTOS™ - FreeRTOS™

官网.jpg

  • 下载软件包

下载软件包.jpg


  • 解压目录
解压目录.jpg

2.搬运Free_RTOS文件

  • 新建文件夹(FreeRTOS)
新建文件夹.jpg



  • include: 包含 FreeRTOS 的头文件。

include.jpg

  • port: 包含与特定硬件平台相关的代码。(在RVDS文件夹中拷贝ARM_CM0文件夹)

拷贝源文件.jpg

  • src: 包含 FreeRTOS 的源代码文件
拷贝C文件.jpg

  • FreeRTOSConfig.h
    1. #ifndef FREERTOS_CONFIG_H
    2. #define FREERTOS_CONFIG_H

    3. /***************************** 硬件相关配置 *****************************/
    4. #define configCPU_CLOCK_HZ                (72000000)      // 必须与SystemCoreClock实际值一致
    5. #define configSYSTICK_CLOCK_HZ            configCPU_CLOCK_HZ // 直接使用CPU主频

    6. /***************************** 调度核心配置 *****************************/
    7. #define configUSE_PREEMPTION              1               // 启用抢占式调度
    8. #define configUSE_TIME_SLICING            0               // 禁用同优先级时间片轮转
    9. #define configUSE_IDLE_HOOK               0               // 禁用空闲任务钩子
    10. #define configUSE_TICK_HOOK               0               // 禁用Tick钩子
    11. #define configTICK_RATE_HZ                1000           // 1ms系统节拍(1000Hz)
    12. #define configMAX_PRIORITIES              (4)             // 任务优先级数(0-4)
    13. #define configMINIMAL_STACK_SIZE          (128)           // 空闲任务栈
    14. #define configMAX_TASK_NAME_LEN           (16)            // 任务名长度
    15. #define configUSE_TRACE_FACILITY          1               // 启用调试追踪
    16. #define configUSE_16_BIT_TICKS            0               // 使用32位Tick计数器
    17. #define configIDLE_SHOULD_YIELD           1               // 空闲任务主动让出CPU
    18. #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0         // 禁用硬件加速任务选择

    19. /***************************** 中断配置(关键新增) **********************/
    20. #define configKERNEL_INTERRUPT_PRIORITY         (15 << 4) // 内核中断最低优先级
    21. #define configMAX_SYSCALL_INTERRUPT_PRIORITY    (5 << 4)  // 可调用API的最高中断优先级
    22. #define configMAX_API_CALL_INTERRUPT_PRIORITY   configMAX_SYSCALL_INTERRUPT_PRIORITY // 别名

    23. /***************************** 内存管理配置 *****************************/
    24. #define configTOTAL_HEAP_SIZE            ( (size_t)(6*1024) ) // 堆大小(6KB)
    25. #define configSUPPORT_STATIC_ALLOCATION  0               // 禁用静态内存分配
    26. #define configSUPPORT_DYNAMIC_ALLOCATION 1               // 启用动态内存分配
    27. #define configAPPLICATION_ALLOCATED_HEAP 0               // 由链接器自动分配堆
    28. #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0      // 任务栈从主堆分配
    29. #define configHEAP_CLEAR_MEMORY_ON_FREE  1               // 释放内存时清零
    30. #define configENABLE_HEAP_PROTECTOR      0               // 禁用堆保护
    31. #define configUSE_MALLOC_FAILED_HOOK     0               // 禁用内存失败钩子

    32. /***************************** 任务通信配置 *****************************/
    33. #define configUSE_MUTEXES                1               // 启用互斥锁
    34. #define configUSE_RECURSIVE_MUTEXES      1               // 启用递归互斥锁
    35. #define configUSE_COUNTING_SEMAPHORES    1               // 启用计数信号量
    36. #define configUSE_QUEUE_SETS             0               // 禁用队列集合
    37. #define configQUEUE_REGISTRY_SIZE        8               // 队列注册表大小
    38. #define configUSE_MINI_LIST_ITEM         1               // 启用精简列表项
    39. #define configTASK_NOTIFICATION_ARRAY_ENTRIES 1          // 每个任务1个通知

    40. /***************************** 调试与统计 *******************************/
    41. #define configCHECK_FOR_STACK_OVERFLOW    0               // 启用栈溢出检测
    42. #define configGENERATE_RUN_TIME_STATS     0               // 禁用运行时统计
    43. #define configUSE_STATS_FORMATTING_FUNCTIONS 0           // 禁用统计格式化
    44. #define configSTATS_BUFFER_MAX_LENGTH     0xFFFF          // 统计缓冲区长度

    45. /***************************** 软件定时器(保持禁用) ********************/
    46. #define configUSE_TIMERS                 0               // 禁用软件定时器
    47. #define configTIMER_TASK_PRIORITY        (configMAX_PRIORITIES-1) // 定时器任务优先级
    48. #define configTIMER_QUEUE_LENGTH         5               // 定时器队列长度
    49. #define configTIMER_TASK_STACK_DEPTH     configMINIMAL_STACK_SIZE // 定时器任务栈

    50. /***************************** 其他功能 *******************************/
    51. #define configUSE_CO_ROUTINES            0               // 禁用协程
    52. #define configMAX_CO_ROUTINE_PRIORITIES  (2)             // 协程优先级数
    53. #define configUSE_EVENT_GROUPS           1               // 启用事件组
    54. #define configUSE_STREAM_BUFFERS         1               // 启用流缓冲区
    55. #define configUSE_TICKLESS_IDLE          0               // 禁用Tickless低功耗
    56. #define configUSE_APPLICATION_TASK_TAG   0               // 禁用任务标签

    57. /***************************** 安全扩展**********************************/
    58. #define configENABLE_TRUSTZONE           0               // 禁用TrustZone
    59. #define configENABLE_MPU                 0               // 禁用MPU
    60. #define configENABLE_FPU                 0               // 禁用FPU
    61. #define configENABLE_MVE                 0               // 禁用MVE矢量扩展

    62. /***************************** API控制(严格匹配需求) ******************/
    63. #define INCLUDE_vTaskPrioritySet         1               // 动态优先级设置
    64. #define INCLUDE_uxTaskPriorityGet        1               // 获取任务优先级
    65. #define INCLUDE_vTaskDelete              1               // 删除任务
    66. #define INCLUDE_vTaskSuspend             1               // 挂起任务
    67. #define INCLUDE_xResumeFromISR           1               // 中断中恢复任务
    68. #define INCLUDE_vTaskDelayUntil          1               // 绝对延时
    69. #define INCLUDE_vTaskDelay               1               // 相对延时
    70. #define INCLUDE_xTaskGetSchedulerState   1               // 获取调度器状态
    71. #define INCLUDE_xTaskGetCurrentTaskHandle 1              // 获取当前任务句柄
    72. #define INCLUDE_xEventGroupSetBitFromISR 1               // 中断中设置事件位
    73. #define INCLUDE_xTaskResumeFromISR       1               // 中断中恢复任务

    74. /* 明确禁用的API */
    75. #define INCLUDE_uxTaskGetStackHighWaterMark 0            // 禁用栈高水位检测
    76. #define INCLUDE_xTaskGetIdleTaskHandle     0             // 禁用获取空闲任务句柄
    77. #define INCLUDE_eTaskGetState              0             // 禁用获取任务状态
    78. #define INCLUDE_xTimerPendFunctionCall     0             // 禁用定时器回调
    79. #define INCLUDE_xTaskAbortDelay            0             // 禁用中止延时
    80. #define INCLUDE_xTaskGetHandle             0             // 禁用通过名获取句柄

    81. /***************************** 中断处理程序映射 *************************/
    82. #define xPortPendSVHandler     PendSV_Handler            // PendSV中断映射
    83. #define xPortSysTickHandler    SysTick_Handler           // SysTick中断映射
    84. #define vPortSVCHandler        SVC_Handler               // SVC中断映射

    85. /***************************** 断言配置 ********************************/
    86. #define configASSERT(x) if((x)==0) { taskDISABLE_INTERRUPTS(); for(;;); }

    87. #endif /* FREERTOS_CONFIG_H */


3.工程目录

工程目录.jpg

4.添加头文件目录

目录.jpg

5.注释掉mm32f0120_it.c中的SVC_Handler、PendSV_Handler、SysTick_Handler中断函数
注释.jpg

6.main.c

  1. #include "main.h"

  2. /* 任务控制块句柄 */
  3. TaskHandle_t Task1_Handle;  // 任务1的句柄
  4. TaskHandle_t Task2_Handle;  // 任务2的句柄

  5. /* 任务函数声明 */
  6. void Task1(void* pvParameters);  // 任务1函数原型
  7. void Task2(void* pvParameters);  // 任务2函数原型

  8. int main(void)
  9. {
  10.     /* 硬件初始化 */
  11.     GPIO_Configure();         
  12.     USART1_InitConsole(115200);   
  13.     /* 进入临界区保护任务创建过程 */
  14.     taskENTER_CRITICAL();     
  15.    
  16.     /* 创建任务1 */
  17.     xTaskCreate(
  18.         (TaskFunction_t)Task1,     // 任务入口函数
  19.         (const char*)"task1",      // 任务名称(调试用)
  20.         (uint16_t)128,             // 任务堆栈大小(单位:字)
  21.         (void*)NULL,               // 任务参数
  22.         (UBaseType_t)2,            // 任务优先级(数字越大优先级越高)
  23.         (TaskHandle_t*)&Task1_Handle // 任务句柄指针
  24.     );
  25.    
  26.     /* 创建任务2 */
  27.     xTaskCreate(
  28.         (TaskFunction_t)Task2,     // 任务入口函数
  29.         (const char*)"task2",      // 任务名称
  30.         (uint16_t)128,             // 任务堆栈大小
  31.         (void*)NULL,               // 任务参数
  32.         (UBaseType_t)3,            // 任务优先级
  33.         (TaskHandle_t*)&Task2_Handle // 任务句柄指针
  34.     );
  35.    
  36.     /* 退出临界区 */
  37.     taskEXIT_CRITICAL();     
  38.    
  39.     /* 启动FreeRTOS任务调度器 */
  40.     vTaskStartScheduler();     
  41. }

  42. /* 任务1: LED闪烁任务 */
  43. void Task1(void* parameter)
  44. {   
  45.     while (1)  
  46.     {
  47. //        /* 翻转GPIOB的14和15引脚状态(控制LED) */
  48.         GPIOB->ODR ^= GPIO_Pin_14 | GPIO_Pin_15;
  49.       

  50.         vTaskDelay(pdMS_TO_TICKS(200));
  51.     }
  52. }

  53. /* 任务2: 串口打印任务 */
  54. void Task2(void* pvParameters)
  55. {   
  56.     while (1)  
  57.     {
  58.         vTaskDelay(pdMS_TO_TICKS(250));
  59.         
  60.         /* 通过串口1输出信息 */
  61.         printf("Hello 21ic, HelloMM32F0121 \r\n"); // 打印信息并换行
  62.     }
  63. }
7.实验现象

打印.jpg

闪烁.gif

MM32F0121C6PV_08RTOS.zip

6.29 MB, 下载次数: 0

工程

AdaMaYun 发表于 2025-7-31 17:43 | 显示全部楼层
移植RTOS非常不错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

35

帖子

0

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