打印
[MM32硬件]

【灵动微电子MM32F0121测评】8.移植RTOS

[复制链接]
343|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 阿源玩电子 于 2025-7-5 15:08 编辑

MM32F0121移植RTOS


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


  • 下载软件包



  • 解压目录

2.搬运Free_RTOS文件

  • 新建文件夹(FreeRTOS)



  • include: 包含 FreeRTOS 的头文件。


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


  • src: 包含 FreeRTOS 的源代码文件

  • FreeRTOSConfig.h
    #ifndef FREERTOS_CONFIG_H
    #define FREERTOS_CONFIG_H

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

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

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

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

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

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

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

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

    /***************************** 安全扩展**********************************/
    #define configENABLE_TRUSTZONE           0               // 禁用TrustZone
    #define configENABLE_MPU                 0               // 禁用MPU
    #define configENABLE_FPU                 0               // 禁用FPU
    #define configENABLE_MVE                 0               // 禁用MVE矢量扩展

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

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

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

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

    #endif /* FREERTOS_CONFIG_H */


3.工程目录


4.添加头文件目录


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

6.main.c

#include "main.h"

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

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

int main(void)
{
    /* 硬件初始化 */
    GPIO_Configure();         
    USART1_InitConsole(115200);   
    /* 进入临界区保护任务创建过程 */
    taskENTER_CRITICAL();     
   
    /* 创建任务1 */
    xTaskCreate(
        (TaskFunction_t)Task1,     // 任务入口函数
        (const char*)"task1",      // 任务名称(调试用)
        (uint16_t)128,             // 任务堆栈大小(单位:字)
        (void*)NULL,               // 任务参数
        (UBaseType_t)2,            // 任务优先级(数字越大优先级越高)
        (TaskHandle_t*)&Task1_Handle // 任务句柄指针
    );
   
    /* 创建任务2 */
    xTaskCreate(
        (TaskFunction_t)Task2,     // 任务入口函数
        (const char*)"task2",      // 任务名称
        (uint16_t)128,             // 任务堆栈大小
        (void*)NULL,               // 任务参数
        (UBaseType_t)3,            // 任务优先级
        (TaskHandle_t*)&Task2_Handle // 任务句柄指针
    );
   
    /* 退出临界区 */
    taskEXIT_CRITICAL();     
   
    /* 启动FreeRTOS任务调度器 */
    vTaskStartScheduler();     
}

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

        vTaskDelay(pdMS_TO_TICKS(200));
    }
}

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



MM32F0121C6PV_08RTOS.zip

6.29 MB

工程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

29

帖子

0

粉丝