63 lines
4.6 KiB
Markdown
63 lines
4.6 KiB
Markdown
# Пример проекта RTOS для Raspberry Pi Pico 2 (Многоядерность)
|
|
|
|
Этот проект демонстрирует гибридную реализацию FreeRTOS и Bare-metal выполнения на Raspberry Pi Pico 2 (RP2350), используя оба ядра процессора.
|
|
|
|
## Описание проекта
|
|
Проект показывает, как запустить операционную систему реального времени (FreeRTOS) на одном ядре, сохраняя при этом высокоточный процесс на базе аппаратных таймеров на втором ядре.
|
|
|
|
### Ядро 0: FreeRTOS
|
|
Ядро 0 запускает планировщик FreeRTOS и управляет несколькими параллельными задачами:
|
|
1. **Задача мигания светодиодом (LED Blink Task)**: Использует пользовательский C++ класс `Pico2LED` для переключения встроенного светодиода каждые 200 мс.
|
|
2. **Задача вывода в USB (USB Print Task)**: Выводит статус системы в USB-консоль каждую секунду, включая счетчики с обоих ядер.
|
|
|
|
### Ядро 1: Bare-metal (Аппаратные таймеры)
|
|
Ядро 1 работает в режиме bare-metal для обеспечения максимальной предсказуемости и точности:
|
|
- Создает выделенный **пул аппаратных прерываний (Alarm Pool)**.
|
|
- Запускает **циклический таймер**, который увеличивает глобальный счетчик каждые 1000 мс через аппаратное прерывание.
|
|
- Ядро находится в режиме низкого энергопотребления (`__wfi`) до наступления следующего прерывания.
|
|
|
|
## Описание алгоритма
|
|
Проект реализует поток синхронизации и выполнения между ядрами:
|
|
|
|
1. **Инициализация (Ядро 0)**:
|
|
- Инициализация стандартного ввода-вывода.
|
|
- Запуск Ядра 1 с помощью `multicore_launch_core1()`.
|
|
2. **Bare-metal выполнение (Ядро 1)**:
|
|
- Инициализация пула аппаратных прерываний специально для Ядра 1.
|
|
- Планирование циклического прерывания таймера.
|
|
- Вход в цикл ожидания прерывания (`__wfi`).
|
|
3. **Выполнение RTOS (Ядро 0)**:
|
|
- Создание задач FreeRTOS для управления LED и логирования в USB.
|
|
- Запуск планировщика через `vTaskStartScheduler()`.
|
|
4. **Межъядерное взаимодействие**:
|
|
- Ядро 0 считывает переменную `core1_counter` (помеченную как `volatile` для предотвращения оптимизации компилятором), чтобы отобразить прогресс аппаратного таймера.
|
|
|
|
## Установка и настройка
|
|
|
|
### 1. Предварительные требования
|
|
Убедитесь, что у вас установлен и настроен Raspberry Pi Pico SDK.
|
|
|
|
### 2. Установка исходников FreeRTOS
|
|
```bash
|
|
mkdir freertos_sources
|
|
cd freertos_sources
|
|
git clone https://github.com/raspberrypi/FreeRTOS-Kernel
|
|
git clone https://github.com/jondurrant/RPIPico2-Exp
|
|
cp -r RPIPico2-Exp/examples/FreeRTOSBlink/port ../port/FreeRTOS-Kernel
|
|
cp RPIPico2-Exp/examples/FreeRTOSBlink/FreeRTOS_Kernel_import.cmake ../FreeRTOS_Kernel_import.cmake
|
|
```
|
|
|
|
### 3. Процесс сборки
|
|
1. `mkdir build && cd build`
|
|
2. `cmake ..`
|
|
3. `make`
|
|
4. Прошейте `.uf2` файл в ваш Raspberry Pi Pico 2.
|
|
|
|
### Структура проекта
|
|
|
|
* 📄 `rtos_sample.cpp` — Основной код приложения (Многоядерная логика) / Main application code (Multi-core logic).
|
|
* ⚙️ `CMakeLists.txt` — Конфигурация сборки проекта / Build configuration.
|
|
* 📁 `port/` — Файлы конфигурации и адаптации (порта) FreeRTOS / FreeRTOS configuration and port files.
|
|
* 📁 `freertos_sources/` — Ядро FreeRTOS и вспомогательные библиотеки / FreeRTOS kernel and support libraries.
|
|
|