核心内容摘要
处理字体图标资源
为什么要在RP2040上跑FreeRTOS树莓派Pico搭载的RP2040芯片有两个Cortex-M0核心主频133MHz这在微控制器领域算是相当不错的配置。
但问题来了单靠裸机编程很难充分发挥双核优势任务调度、资源管理都会变得复杂。
这时候FreeRTOS的价值就体现出来了。
我刚开始玩Pico时也纠结过要不要上RTOS实测下来发现几个明显优势首先是任务管理变得轻松不用自己写复杂的调度逻辑其次是双核利用率大幅提升两个核心可以各司其职最重要的是FreeRTOS有成熟的SMP对称多处理支持这是很多其他RTOS不具备的。
环境搭建避坑指南
1 工具链选择官方推荐的环境是Windows/WSL2ARM-GCC但我实测Mac和Linux原生环境也完全OK。
关键是要确保ARM工具链版本≥
1
3建议用最新的
1
2CMake≥
13Python3用于工程生成注意千万别用Windows自带的cmd建议用VS Code终端或WSL2路径处理会更规范。
2 SDK准备需要三个核心组件pico-sdk必须pico-project-generator可选但推荐FreeRTOS-Kernel建议用
2
01 LTS版# 快速获取组件 git clone https://github.com/raspberrypi/pico-sdk.git git clone https://github.com/raspberrypi/pico-project-generator.git wget https://github.com/FreeRTOS/FreeRTOS-LTS/releases/download/
2
01-LTS/FreeRTOSv
2
01-LTS.zip
工程配置实战
1 基础工程生成用pico-project-generator创建模板工程./pico_project.py --name RtosDemo这会生成包含CMakeLists.txt和基础代码的工程目录。
重点检查能否正常编译空白工程UF2生成是否成功串口输出是否正常
2 FreeRTOS集成关键步骤目录结构调整RtosDemo/ ├── FreeRTOS-Kernel/ # 从zip解压得来 ├── CMakeLists.txt # 需要修改 └── src/ └── main.c # 示例代码CMakeLists.txt修改要点# 在project()后添加 add_subdirectory(FreeRTOS-Kernel) include_directories(FreeRTOS-Kernel/include) # 在target_link_libraries中添加 target_link_libraries(${PROJECT_NAME} pico_stdlib freertos_kernel # 新增 )FreeRTOSConfig.h配置#define configNUM_CORES 2 // 关键启用双核 #define configUSE_CORE_AFFINITY 1 // 允许任务绑定核心 #define configTICK_RATE_HZ 1000 // 系统时钟1kHz #define configTOTAL_HEAP_SIZE (50*
// 根据需求调整
双核任务开发技巧
1 基础任务创建void core0_task(void *pv) { while(
{ gpio_put(LED_PIN,
; vTaskDelay(
; // FreeRTOS延时 } } void core1_task(void *pv) { while(
{ gpio_put(LED_PIN,
; vTaskDelay(
; } } int main() { xTaskCreate(core0_task, Core0, 256, NULL, 1, NULL); xTaskCreateAffinitySet(core1_task, Core1, 256, NULL, 1, 11, NULL); // 绑定核心1 vTaskStartScheduler(); }
2 核心间通信推荐几种方式队列(Queue)最通用的IPC方式QueueHandle_t xQueue xQueueCreate(5, sizeof(int)); // 核心0发送 int val 42; xQueueSend(xQueue, val, portMAX_DELAY); // 核心1接收 int received; xQueueReceive(xQueue, received, portMAX_DELAY);信号量(Semaphore)适合事件通知直接内存访问通过共享内存原子操作
3 性能优化建议为每个核心设置独立堆栈#define configAPPLICATION_ALLOCATED_HEAP 1 uint8_t ucHeap0[configTOTAL_HEAP_SIZE/2] __attribute__((aligned(
)); uint8_t ucHeap1[configTOTAL_HEAP_SIZE/2] __attribute__((aligned(
));合理设置任务优先级系统关键任务≥3普通任务
空闲任务0使用Tickless模式省电#define configUSE_TICKLESS_IDLE
15.
常见问题排查问题1任务无法调度检查vTaskStartScheduler()是否调用确认堆空间足够至少≥20KB查看FreeRTOSConfig.h中的configMAX_PRIORITIES设置问题2双核不同步确保configNUM_CORES2检查硬件初始化是否在main()中完成使用vTaskDelay()而非忙等待问题3内存不足// 添加内存监控代码 printf(Free heap: %d\n, xPortGetFreeHeapSize());我在实际项目中发现RP2040运行FreeRTOS时最吃内存的是TCP/IP栈如果要用网络功能建议将堆空间设置为≥100KB。
另外双核调试可以用SWD接口同时监控两个核心的状态这个在排查死锁问题时特别有用。