1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/EDI-Systems-M5P1_MuProkaron

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

RMP Real-time Kernel

logo

RMP Real-Time Kernel

Github release Github commits Discord

language Build OpenSSF Best Practices Codacy Badge

Кликните здесь (README_CN.md), чтобы посмотреть китайскую версию.

RMP — это небольшая операционная система реального времени, разработанная для обеспечения формальной надёжности и простоты. Надёжность достигается за счёт применения формальных методов (ещё не завершены; проведено только тестирование методом белого ящика со 100% покрытием ветвей). Ядро можно рассматривать как предварительно сертифицированное IEC 61508 SIL2 или EAL 4. Предоставляются все основные функции, необходимые для ОСРВ, но не более того. Это гарантирует, что система представляет собой минимально возможное ядро и также подходит для использования в качестве гостевой операционной системы при размещении на мониторах виртуальных машин.

Эта операционная система намного компактнее, чем любые другие ОСРВ, особенно по сравнению с FreeRTOS или RT-Thread, и её понимание должно быть достаточно простым. Тем не менее она предоставляет полный набор функций, которые могут вам понадобиться при разработке микроконтроллеров с ограниченными ресурсами, таких как эффективное управление памятью, антиалиасинг графики и различные вспомогательные функции. Все эти функции представлены в одном файле .C и не требуют дополнительного потребления оперативной памяти!

Руководство по операционной системе можно найти здесь (/Document/Public).

Ознакомьтесь с разделами «Внесение вклада» (CONTRIBUTING.md) и «Кодекс поведения» (CODE_OF_CONDUCT.md), если хотите внести свой вклад, и с шаблоном запроса на вытягивание (PULL_REQUEST_TEMPLATE.md), когда делаете запросы на вытягивание. Это программное обеспечение является официальной работой EDI и, таким образом, принадлежит общественному достоянию. Все авторские права, принадлежащие EDI, предоставляются всем субъектам в соответствии со всеми применимыми законами в максимальной степени.

Что касается пакетов, предоставляемых поставщиками, и библиотек абстракции оборудования, пожалуйста, обратитесь к репозиторию M0A00_Library (https://github.com/EDI-Systems/M0A00_Library), чтобы загрузить и использовать их должным образом.

Зачем нужна новая хоббистская система?

Существующие ОСРВ можно разделить на три категории: корпоративные, хоббистские и обучающие. Корпоративные системы обычно разрабатываются для реального развёртывания и являются отличными универсальными решениями, но они, по крайней мере, помещают все верификационные документы и методы за платный доступ, если сам код бесплатен. Хоббистских систем много, новые репозитории создаются почти каждый день, но им не хватает долгосрочной приверженности, и они часто заброшены через некоторое время. Обучающие системы созданы для студентов колледжей и не обладают глубиной, когда речь заходит о продвинутых темах, таких как верификация.

С этой целью RMP стремится создать полностью открытую, способную и понятную систему, сертифицированную до зубов. Вы можете использовать репозиторий тремя способами: (1) модифицировать и развернуть его в реальных условиях, (2) следовать его коду и документам, чтобы получить полное представление обо всех деталях задействованных технологий, и (3) отказаться от системы и… Реализуйте проект, опираясь на знания, полученные в рамках этой работы.

Разработка системы будет проходить в три этапа. На первом этапе мы не будем заранее писать формальную спецификацию, а разработаем систему как любую другую любительскую систему. Мы перенесём систему на максимальное количество архитектур, чтобы проверить гибкость её абстракции, и запустим как можно больше классов приложений, чтобы гарантировать удобство использования её интерфейса.

На втором этапе мы используем первую реализацию в качестве руководства для создания формальной спецификации системы и докажем, что модель системы обладает определёнными желаемыми свойствами. На последнем этапе мы разработаем формальную семантику выбранного подмножества C и перепишем всё ядро в соответствии с формальной моделью, создавая при этом необходимые документы для функциональной безопасности (в частности, IEC 61508 SIL 4 и ISO 26262 ASIL D, возможно, EAL, и сначала сосредоточимся на первых), и разместим весь процесс (за исключением тех, на которые у нас нет авторских прав, то есть стандартов) в открытом доступе.

Конкретные сроки разработки системы не установлены. В настоящее время первый этап считается завершённым, а второй этап продолжается. Если вы заинтересованы в проекте, присоединяйтесь; в отличие от других проектов, здесь приветствуются новички.

Quick Demo

Linux Minimal Runnable Binary

Скомпилируйте 32-битный двоичный файл Linux здесь и посмотрите результаты тестов!

NES (FAMICOM) Minimal Runnable Binary

Скачайте предварительно скомпилированную игру здесь, загрузите её в свой любимый эмулятор (или карту памяти Namco 163 и подключите её к реальной консоли) и посмотрите результаты тестов!

FAMICOM

Карта памяти Namco 163 обязательна, так как система использует её для обеспечения таймеров IRQ для измерения производительности. Namco 163 — единственный картовод, который имеет читаемый счётчик отметок времени и может быть найден на картриджах, которые также содержат такие известные игры, как «Звёздные войны» и «Sangokushi II: Hanou no Tairiku (三国志II 覇王の大陸)». Чип иногда называют Namcot 163 или iNES mapper 019.

Встроенная графика: виджеты, пример и FXAA антиалиасинг

Controls Calculator FXAA

Основные операции с потоками

Создать поток

    RMP_Thd_Crt(&Thd_1            /* Блок управления потоком */,
                Func_1            /* Функция входа */,
                &Stack_1          /* Адрес стека */,
                sizeof(Stack_1),  /* Размер стека */,
                (void*)0x12345678 /* Параметр */,
                1                 /* Приоритет */, 
                5                 /* Временные интервалы */);

Удалить поток

    RMP_Thd_Del(&Thd_1            /* Блок управления потоком */);

Приостановить поток

    RMP_Thd_Suspend(&Thd_1        /* Блок управления потоком */);

Возобновить поток

    RMP_Thd_Resume(&Thd_1         /* Блок управления потоком */);

Задержка потока

Delay

    void Func_1(void* Param)
    {
        RMP_LOG_S("Переданный параметр ");
        RMP_LOG_H((ptr_t)Param);
        RMP_LOG_S("\r\n");
        while(1)
        {
            RMP_Thd_Delay(30000);
            RMP_LOG_S("Задержка 30000 циклов\r\n\r\n");
        };
    }

    void RMP_Init_Hook(void)
    {
        RMP_Thd_Crt(&Thd_1, Func_1, &Stack_1, sizeof(Stack_1), (void*)0x12345678, 1, 5);
    }

Отправка данных из одного потока в другой

Send

    void Func_1(void* Param)
    {
        ptr_t Time=0;
        while(1)
        {
            RMP_Thd_Delay(30000);
            RMP_Thd_Snd(&Thd_2, Time, RMP_SLICE_MAX);
            Time++;
        };
    }

    void Func_2(void* Param)
    {
        ptr_t Data;
        while(1)
        {
            RMP-Thd-Rcv(&Data, RMP_SLICE_MAX);
``` **Перевод текста на русский язык:**

### Counting Semaphores

```C
    void Func_1(void* Param)
    {
        while(1)
        {
            RMP_Thd_Delay(30000);
            RMP_Sem_Post(&Sem_1, 1);
        };
    }

    void Func_2(void* Param)
    {
        ptr_t Data;
        while(1)
        {
            RMP_Sem_Pend(&Sem_1, RMP_SLICE_MAX);
            RMP_LOG_S("Semaphore successfully acquired!\r\n\r\n");
        };
    }

    void RMP_Init_Hook(void)
    {
        RMP_Sem_Crt(&Sem_1,0);
        RMP_Thd_Crt(&Thd_1, Func_1, &Stack_1, sizeof(Stack_1), (void*)0x12345678, 1, 5);
        RMP_Thd_Cрт(&Thd_2, Func_2, &Stack_2, sizeof(Stack_2), (void*)0x87654321, 1, 5);
    }

Операции с пулом памяти

    /* Инициализация пула памяти */
    RMP_Mem_Init(Pool, Pool_Size);

    /* Выделение из пула */
    Mem=RMP_Malloc(Pool, Alloc_Size);

    /* Освобождение выделенной памяти */
    RMP_Free(Pool, Mem);

Производительность на всех поддерживаемых архитектурах

  Абсолютный минимум для RMP составляет примерно 1.6k ROM и 432 байта RAM, что достигается на порту STM32F030F4 (Cortex-M0). Это число включает в себя 60-байтовый блок управления потоком и 256-байтовый стек первого потока, а также 64-байтовый стековый блок ядра для обработки прерываний. Ядро ОС и урезанный HAL потребляют вместе 52 байта памяти. Если вы хотите ещё больше уменьшить этот объём, то HAL от производителя вам не подойдёт, и вы можете создать свой собственный.

  Текущая минимальная реализация концепции, которая может завершить тестовый бенчмарк, достигнута на ATMEGA328P. Она имеет всего лишь скудные 32k Flash и 2k SRAM.

  Производительность ядра в реальных условиях показана следующим образом. Все параметры компилятора установлены на максимальную оптимизацию (обычно -O3 с LTO, если доступно) и оптимизированы по времени, все значения являются средними в циклах процессора; WCET, зарегистрированный в заголовочных файлах тестов, примерно эквивалентен этому значению плюс помехи от прерывания таймера тиков.

  • Yield : Передача управления от одного потока к другому.
  • Mail : Обмен данными между двумя потоками через почтовый ящик.
  • Sem : Обмен данными через семафор между двумя потоками.
  • FIFO : Пара операций чтения/записи FIFO в пределах одного потока.
  • Msgq : Обмен данными через очередь сообщений между двумя потоками.
  • Bmq : Блокирующий обмен данными через очередь сообщений между двумя потоками.
  • Mail/I : Отправка данных в почтовый ящик из прерывания.
  • Sem/I : Публикация данных через семафор из прерывания.
  • Msgq/I : Отправка данных в очередь сообщений из прерывания.
  • Bmq/I : Отправка данных в блокирующую очередь сообщений из прерывания.
  • Mem : Пара операций malloc/free в пуле памяти.
  • Alrm : Среднее время обработки пяти периодических сигналов тревоги, срабатывающих каждые 1/2/3/5/7 тиков.

  Разница между Msgq и Bmq заключается в том, что в Msgq только получатель может блокироваться, тогда как в Bmq оба могут блокироваться.

Монументальные порты

Чип Платформа Сборка Yield Mail Sem FIFO Msgq Bmq Mail/I Sem/I Msgq/I Bmq/I Mem Alrm
RP2A03/FC-84 MOS6502 CC65 4073 5435 5435 2028 7726 10445 4831 5180 7220 8350 7484 TBD
RP2A03/MESEN ... ... 4060 5439 5424 2040 7728 10443 4836 5185 7227 8355 7446 TBD
SPCE061A unSP GCC 694 1732 1548 927 2671 3709 1619 1475 2242 2889 3518 TBD
PIC32MZ2048 MIPS XC32 190 345 305 150 475 620 295 260 370 465 365 TBD
... MIPS-FR64 . 475 630 585 160 775 935 400 360 490 585 371 TBD

Полезные порты

| Чип |

В тексте запроса присутствуют фрагменты кода на языке C, но они не содержат ошибок или опечаток, поэтому перевод выполнен корректно. | Платформа | Сборка | Производительность | Почта | Семафор | FIFO | Очередь сообщений | Буфер сообщений | Виртуальные порты (V) | Виртуальные порты при прерывании (V/I) | Память | Аварийный сигнал | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--:| | ATMEGA328P | AVR | GCC | 408 | 719 | 686 | 313 | 1065 | — | — | N/A | TBD | | ATMEGA1284P | ... | ... | 437 | 751 | 717 | 314 | 1098 | — | — | 1680 | TBD | | ATMEGA2560 | ... | ... | 449 | 774 | 736 | 326 | 1131 | — | — | 1686 | TBD | | R5F104PJ | RL78 | CCRL | 261 | 565 | 520 | 308 | 924 | — | — | 1854 | TBD | | PIC24FJ128 | PIC24F | XC16 | 152 | 334 | 271 | 168 | 468 | — | — | 379 | TBD | | DSPIC33EP512 | DSPIC33E | ... | 214 | 447 | 353 | 219 | 608 | — | — | 448 | TBD | | MSP430F149 | MSP430 | CCS | 312 | 641 | 573 | 312 | 985 | — | — | N/A | TBD | | MSP430FR5994 | MSP430X | ... | 468 | 1054 | 891 | 492 | 1573 | — | — | 3291 | TBD | | STM32F030F4 | Cortex-M0 | Keil | 362 | 763 | 666 | 379 | 1196 | — | — | N/A | TBD | | HC32L136K8 | Cortex-M0+ | Keil | 211 | 422 | 370 | 219 | 646 | — | — | 542 | TBD | | STM32L071CB | Cortex-M0+ | Keil | 335 | 581 | 532 | 253 | 892 | — | — | N/A | TBD | | ... | ... | GCC | 337 | 656 | 600 | 284 | 947 | — | — | N/A | TBD | | STM32F103RE | Cortex-M3 | Keil | 203 | 438 | 385 | 226 | 684 | — | — | 518 | TBD | | ... | ... | GCC | TBD | TBD | TBD | TBD | TBD | — | — | TBD | TBD | | STM32F405RG | Cortex-M4F | Keil | 180 | 345 | 321 | 180 | 667 | 40 % | — | 455 | TBD | | ... | ... | GCC | 196 | 388 | 345 | 192 | 677 | 59 % | — | 411 | TBD | | STM32F767IG | Cortex-M7F | Keil | 176 | 329 | 277 | 174 | 510 | — | — | 334 | TBD | | ... | ... | GCC | 182 | 335 | 288 | 156 | 473 | — | — | 332 | TBD | | TMS570LS0432 | Cortex-R4 | CCS | 306 | 493 | 460 | 193 | 686 | — | — | 533 | TBD | | TMS570LC4357 | Cortex-R5 | ... | 275 | 479 | 467 | 216 | 746 | — | — | 482 | TBD | | TMS320F2812 | C28x | CCS | 217 | 493 | 407 | 229 | 706 | — | — | 939 | TBD | | TMS320F28335 | C28x/FPU32 | ... | 246 | 513 | 440 | 235 | 751 | — | — | 946 | TBD | | CH32V307VC | RV32IMAC | GCC | 209 | 386 | 336 | 172 | 538 | — | — | 433 | TBD | | ... | RV32IMAFC | ... | 217 | 398 | 341 | 172 | 557 | — | — | 433 | TBD | | Xeon 6326 | X86-LINUX | ... | 24k | 24k | 24k | 46 | 24k | — | — | 159 | TBD | ### Компиляция

Проекты Makefile, Keil, CCS и MPLAB для различных микроконтроллеров доступны в папке Project. Подробные инструкции по их запуску можно найти в файлах readme в каждой папке. Однако следует иметь в виду, что некоторым примерам могут потребоваться библиотеки, специфичные для поставщика, такие как STMicroelectronics HAL. Также могут потребоваться дополнительные драйверы. Их можно найти в репозитории M0A00_Library.

Запуск тестов

Чтобы запустить примеры программ, просто загрузите их на плату разработки и начните пошаговую отладку. В некоторых примерах будет использоваться один или два светодиода для индикации состояния системы. В этом случае необходимо заполнить функции оболочки мигания светодиодов.

Для использования графической библиотеки и других расширенных функций обратитесь к руководству пользователя.

Развёртывание

При развёртывании этого решения в производственной системе рекомендуется внимательно прочитать руководство в папке Document, чтобы правильно настроить все макросы.

Поддерживаемые наборы инструментов

  • GCC/Clang-LLVM;
  • Keil uVision (ARMCC/ARMCLANG);
  • Code Composer Studio;
  • MPLAB X XC16/XC32.

Другие наборы инструментов на данный момент не рекомендуются и не поддерживаются, хотя в будущем их поддержка может быть реализована.

Вклад в проект

Подробности о нашем кодексе поведения и процессе отправки запросов на вытягивание можно узнать, прочитав CONTRIBUTING.md.

Информация о проекте EDI

M5P01 R6T1.

Основные участники

  • Лейфенг Сонг — порт сборки ARM Cortex-M3/4/7.
  • Руншэн Хоу — порт RVM ARM Cortex-M4/7 и демонстрация lwIP.
  • Ихе Ван — стабильный порт x86/linux/ptrace.
  • Ран Чжан — порт DSP C28x.
  • Кай Чжан — тестирование «белого ящика».
  • Хаотянь Лю — порт RL78.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Unlicense
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/EDI-Systems-M5P1_MuProkaron.git
git@api.gitlife.ru:oschina-mirror/EDI-Systems-M5P1_MuProkaron.git
oschina-mirror
EDI-Systems-M5P1_MuProkaron
EDI-Systems-M5P1_MuProkaron
main