Raspberry Pi RP2040 ОС в реальном времени
Учебный проект для создания превентивной поддержки ОС в реальном времени для RP2040. Код планировщика записан в C, чтобы обеспечить легкие эксперименты. Текущие возможности включают:
Упреждающий
Приоритет потока
Ожидает/задержки
Кооперативная доходность
Мутекс
Проверки стека (выпуски точки останова)
Время переключения контекста на пико 125 МГц с четырьмя потоками:
Нет оптимизации
| Контекст времени |
|---|
| Коллекция без статистики: | 5.8 США |
| С статистикой Colleon: | 9.3 США |
| С проверкой статистики/стека: | 9,9 США |
Пример кода имеет простой «топ», подобный выводу, каждые две секунды до последовательного порта. Значения CTX = - это процент времени, проведенного в контекстном переключении. Util = это процент времени, проведенного в потоке, и простоя = процент, потраченного в одном из темных потоков ядра.
Индикатор S или статуса просто: w waiting, r-running, z-zombied или нить возвращен.
Время стены 0:56:38
CPU0 CTX = 0,095%, UTIL = 1,229%.
CPU1 CTX = 0,074%, UTIL = 0,081%.
Thrd Name S PRI CPU LASTCPU
0 красного светодиода W 100 0,001% 1
1 зеленый светодиод W 100 0,011% 0
2 отчет R 255 1,115% 0
3 Spinner z 150 0,000% 0
Текущая реализация состоит из трех файлов и основного примера:
RP2040OS.H ОС
rp2040os.c реализация в c
Функция реализации func.s в сборке
main.c пример
Простой вариант использования, чтобы начать два потока:
#include "rp2040.h"
static uint32_t blink1stack [128];
void blink1 () {
while (true) {
setGpio (led_pin1);
задержки (300);
clrgpio (led_pin1);
задержки (300);
}
}
static uint32_t blink2stack [128];
void blink2 () {
while (true) {
setGpio (led_pin2);
задержки (300);
clrgpio (led_pin2);
задержки (300);
}
}
int main () {
stdio_init_all ();
gpio_init (led_pin1);
gpio_set_dir (led_pin1, gpio_out);
gpio_init (led_pin2);
gpio_set_dir (led_pin2, gpio_out);
AddThread («Красный светодиод», Blink1, Blink1stack, Sizeof (Blink1stack), 100);
addthread («зеленый светодиод», Blink2, Blink2stack, Sizeof (Blink2stack), 100);
setupsched (); // нет возврата
}
### размеры стека
Имейте в виду, что чем больше библиотечных функций вы называете, тем больше места для стека вам может потребоваться. Например, использование функции printf потребует более 256 32 -битных значений в стеке для обработки требований памяти функций. Если тестируемый подразделение подключается к отладчику, можно включить stack_watch и запустит BKPT (точка останова) в отладчике, если какое -либо из значений Guard Sack будет изменено, что указывает на возможное условие переполнения.
### osconfig.h
Этот файл позволяет настроить, как работает планировщик. По умолчанию он установлен на спецификации RP2040 или два ядра. Установка user_tasks на правильную сумму для вашего приложения сведет к минимуму объем используемой памяти. Дополнительная информация о потоке, такую как именование, статистика и мониторинг стека, также потребляют немного больше памяти, но может быть очень полезно при отладке.
Contextsw_pin можно использовать с осциллографом, чтобы увидеть переключатели контекста в режиме реального времени.
Здание
Экспорт PICO_SDK_PATH = PATH TO YOU PICO-SDK
Скопируйте $ pico_sdk_path/external/pico_sdk_import.cmake в основной каталог.
$> Mkdir Build
$> CD Build
$> cmake .. -dcmake_build_type = Debug
$> сделать