本帖最后由 阿源玩电子 于 2025-7-5 15:08 编辑
MM32F0121移植RTOS
、
#申请原创#1.进入FreeRTOS官网下载源码
2.搬运Free_RTOS文件
- include: 包含 FreeRTOS 的头文件。
- port: 包含与特定硬件平台相关的代码。(在RVDS文件夹中拷贝ARM_CM0文件夹)
- 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.实验现象
|