适用于 Raspberry Pi Pico 开发板的 SMP 演示
简介
这些演示使用 FreeRTOS 对称多处理 (SMP) 版本的
内核。演示面向
Raspberry Pi Pico 开发板,该板使用
配备双核 ARM Cortex M0+ 处理器的 RP2040 微控制器
(RP2040 微控制器由 Raspberry Pi 提供)
。
这些演示应用程序使用
GNU ARM 嵌入式工具链构建 FreeRTOS
Raspberry Pi Pico 移植。演示了
FreeRTOS 内核中的对称多处理 (SMP) 支持 。
源代码组织
此演示的项目文件位于 FreeRTOS/Demo/CORTEX_M0+_RP2040
目录,
该目录位于 FreeRTOS SMP Demo Git 存储库。
位于 FreeRTOS/Source/portable/ThirdParty/GCC/RP2040FreeRTOS 目录。
演示应用程序
该项目包括以下演示:
- Blinky 演示。
- 综合演示。
- 多核演示。
Blinky 演示
Blinky 演示使用两个任务和一个队列。
-
队列发送任务:
队列发送任务由 prvQueueSendTask()
函数实现。该
任务每 1000 毫秒将值 100 发送
到队列。
-
队列接收任务:
队列接收任务由 prvQueueReceiveTask()
函数实现。
该任务位于一个循环中,
该循环会阻塞读取队列的尝试(任务被阻塞时不会消耗 CPU 周期),
队列接收任务每次接收到值 100 时都会切换一次 LED。由于队列发送任务
每 1000 毫秒向队列写一次,
队列接收任务每 1000 毫秒切换一次 LED。
综合演示
综合演示可实现全面的测试和演示应用程序,
除此之外,用于演示和/或测试以下功能:
创建的任务来自标准演示集,
所有 FreeRTOS 移植演示应用程序都使用这些任务。这些任务
没有特定的功能,之所以创建,只是为了演示如何
使用 FreeRTOS API,并测试 RTOS 移植。
创建“检查”任务,定期检查标准演示任务(包含自监控代码),
以确保所有任务
都按预期运行。检查任务在每次执行时都会切换 LED。这直观地反映出了系统的
运行状况。如果 LED 每 3 秒切换一次,
则表示检查任务未发现任何问题。如果 LED
每 200 毫秒切换一次,则表明检查任务
在一个或多个任务中发现潜在问题。
多核演示
多核演示应用程序在一个内核上运行 FreeRTOS 任务,
该任务使用 Raspberry Pico SDK 同步基元与另一个内核上运行的代码
进行交互。同一演示有两个版本:一个版本在内核 0 上运行 FreeRTOS,
另一个版本在内核 1 上运行 FreeRTOS。
构建和运行RTOS演示应用程序
构建
按照以下说明设置 Raspberry Pi Pico SDK 构建环境:
Pico 入门。
确保在您的环境中设置了 PICO_SDK_PATH
,或通过
CMake 命令行上的 -DPICO_SDK_PATH=xxx
进行传递。
运行以下命令:
$ cd FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040
$ mkdir build
$ cd build
$ cmake ..
$ make
这将为每个演示应用程序生成 .uf2
文件:
运行
- 按住
Bootsel
按钮,将 Raspberry Pi Pico 连接到
计算机。这将强制开发板进入 USB 大容量存储模式。
- 将要运行的演示的
.uf2
文件拖放到
大容量存储设备上。
RTOS 配置和使用详情
- Blinky 演示和全面演示的特定配置项目位于
FreeRTOS/Demo/ThirdParty/Community-Supported-Demos/CORTEX_M0+_RP2040/Standard_smp/FreeRTOSConfig.h
文件以及
多核演示的特定配置项目位于 FreeRTOS/Demo/CORTEX_M0+_RP2040/OnEitherCore/FreeRTOSConfig.h
文件。
可根据应用程序的需要,编辑本文件中定义的常量
。以下配置选项仅适用于 FreeRTOS 内核中对 SMP 的支持:
configNUM_CORES
- 设置内核数量。
configRUN_MULTIPLE_PRIORITIES
- 启用/禁用同时运行具有多个优先级的任务。
configUSE_CORE_AFFINITY
- 启用/禁用设置任务对某些内核的关联。
- 项目中包含
Source/Portable/MemMang/heap_4.c
,
旨在提供 RTOS 内核所需的内存。具体请参阅
API 文档的内存管理部分,
获取完整信息。
- vPortEndScheduler() 尚未实现。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.