基于AT32F403A芯片移植的FreeRTOS
·
第一步:准备 FreeRTOS 源码:(FreeRTOS 202406.04 LTS)
https://www.freertos.org/

第二步:将文件添加到 Keil 工程中
1.在项目工程中FreeRTOS文件夹下创建portable和include文件夹,portable用来存放源文件,include存放头文件。

2.源文件准备

1.核心源码:
croutine.c, event_groups.c, list.c, queue.c, tasks.c, timers.c, stream_buffer.c,点进 FreeRTOS-Kernel 后,直接在这一层就能看到。
头文件:对应在 FreeRTOS-Kernel/include 目录里。

2.内存管理 (Heap):


heap_4.c 带有内存碎片合并功能,是嵌入式开发中最常用、最稳妥的内存分配方案。
3.底层接口 (Port)

因为 AT32F403A 是 Cortex-M4F 内核,且使用 Keil。将源码 portable/RVDS/ARM_CM4F 目录下的 port.c 和 portmacro.h 拷贝到你的 portable 和 include 文件夹中。
第三步:Keil 工程中添加分组
添加freertos源码文件和头文件路径添加

第四步:配置 FreeRTOSConfig.h
#define configUSE_PREEMPTION 1 //启用抢占式调度
#define configUSE_IDLE_HOOK 0 // 如果不需要低功耗和tick钩子,可以禁用
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) system_core_clock ) //系统时钟配置
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) // 1ms 系统节拍
#define configMAX_PRIORITIES ( 5 ) // 最多5个优先级
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) // 空闲任务栈大小 根据 AT32F403A 的 RAM 大小(224KB)可以适当增加
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) ) // 8KB 堆
#define configMAX_TASK_NAME_LEN ( 16 ) //任务名称长度,影响每个任务的内存占用
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1 //当空闲任务与另一个优先级为 0 的用户任务 同时就绪时,是否主动让出 CPU。
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 1
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetCurrentTaskHandle 1
/* Cortex-M specific definitions. /
#ifdef __NVIC_PRIO_BITS
/ __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 4 //4位优先级 = 16个优先级 ,数值越低,优先级越高(0 最高,15 最低)
#endif
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0x0f // 最低优先级 15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x01 //最高可调用API优先级 1
//将优先级(0-15)左移到寄存器的正确位置
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
第五步:打通底层中断
at32f403a_407_int.c (中断服务函数文件) 中,必须把这三个默认的空函数注释掉或删掉,否则会和 FreeRTOS 发生“重复定义”的报错:
-
void SVC_Handler(void) -
void PendSV_Handler(void) -
void SysTick_Handler(void)

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)