scmRTOS

scmRTOS – це компактна проста ОСРЧ для мікроконтроллерів, створена Гарі Журовим (Harry Zhurov). Поточна версія — 4.00.
Існують порти scmRTOS для наступних серій мікроконтролерів:

  • ARM7 — GCC;
  • AVR (Atmel) — GCC, IAR;
  • Blackfin (Analog Devices) — VDSP;
  • Cortex-M3 — GCC, IAR;
  • Cortex-M0 — GCC (на даний момент розміщено в гілці pre-v400);
  • MSP430 (Texas Instruments) — GCC, IAR;
  • STM8 (ST Microelectronics) — IAR.

Використовуйте лінк Download GNU tarball в нижній частині сторінки для вибраного мікроконтролера або завантажуйте архів зі сторінки scmRTOS на sourceforge
Використовуйте сторінку trunk для отримання найсвіжіших версій.

З мікроконтролерів AVR підтримуютьcя «звичайні» megaAVR включно з ATmega256x.

Опис scmRTOS v4.00 російською та англійською мовами.
Сторінка проекту на sourceforge.net.
scmRTOS Wiki (англійською)
Група google для обговорння проекту (російською, краще підписатися на розсилку поштою, бо через web-інтерфейс половина листів не читається).
Розділ, присвячений scmRTOS, на форумі electronix.

scmRTOS може бути використано з Arduino, дивіться тему на форумі Arduino, сховище git та статтю про це російською мовою.

Тут я пропоную увазі детальне пояснення одного з поширюваних з системою прикладів 1-EventFlag.

Пояснення призначене для тих, хто ще не надто знайомий з роботою ОС з витісненням і «на ніжках» показує, що відбувається в системі. Для демонстрації процесів в приклад було внесено деякі зміни, в основному, додано індикацію стану системи на виводах мікроконтроллера для спостереження осцилографом/логічним аналізатором. Команди для індикації стану було додано також в процедуру перемикання контекстів (встановлення виводу першою командою макросу save_context та скидання останньою командою макросу restore_context в файлі OS_Target_asm.S). З розміщеного в репозиторії коду ці команди видалено.

12 Responses to “scmRTOS”

  1. basil коментує:

    Большое Вам спасибо за такой подробный ответ, но все-таки интересно с чем это связано, случайно не с тем ли, что использование системы предполагается с основном в тактируемом режиме?

    • ReAl коментує:

      Вопрос терминологический, но я бы не сказал, что на данный момент у scmRTOS есть тактируемый режим. Я это слово воспринимаю как насильное переключение процессов по таймеру, round robin для процессов с одинаковым приоритетом. Такая возможность в пожеланиях к scmRTOS озвучивалась, но пока активных действий не предпринято.

      Просто в scmRTOS считается, что необходима постоянно работающая «служба времени». Без постоянно работающего таймера, например, не будут работать таймауты. Хотя в системе с управлением только по событиям с ожиданием «до упора» (упором для конкретной периферии может быть отдельный канал COMPARE таймера, настраиваемый на защитный интервал) можно обойтись без системного тика.
      Иногда постоянно работающий таймер даже вреден, например, когда нужно спать.

      При необходимости можно останавливать и опять запускать таймер вызовами lock_system_timer() / lock_system_timer() (OS_Kernel.h), для этого в scmRTOS_TARGET_CFG.h помимо вектора должны быть определены соответствующие макросы, например:

      #define LOCK_SYSTEM_TIMER()    (TIMER0_IE_REG &= ~(1 << TOIE0))
      #define UNLOCK_SYSTEM_TIMER()  (TIMER0_IE_REG |=  (1 << TOIE0))

      Для Cortex-M3 можно заменить по умолчанию используемый NVIC SysTick timer, подменив функцию __init_system_timer (она в OS_Targte_asm.S помечена как .weak, поэтому достаточно просто завести в проекте свою с таким именем). Возможность появилась, насколько я помню, именно в ответ на пожелание замены таймера для более гибкого управления в режимах пониженного потребления.

      Ксть обсуждения упомятутого на electronix.ru, но что-то форум сейчас не отвечает, я не могу найти темы, чтобы дать линки.

  2. basil коментує:

    Да, варнинги дает авр студия 4.18 и 4.19 прошу прощения не уточнил сразу.

  3. basil коментує:

    Начинаю осваивать SCM RTOS под AVR, пользуясь случаем хочу выразить благодарность всей команде разработчиков за Ваш труд по развитию и поддержанию проекта. Я не большой знаток плюсов ) но система интересная и хотелось бы если можно спросить – почему-то в порте под меги при компилляции вылазит warning – Common/OS_Services.h:261: warning: ignoring packed attribute because of unpacked non-POD field ‘OS::TMutex& OS::TMutexLocker::Mutex’ хотя все работает даже с мьютексами, и еще, нельзя ли привести примеры с terminate() и start() функциями а то что-то никак ))

    • ReAl коментує:

      Странно.
      Откуда там вообще атрибут packed? Его же вроде нигде в исходниках нет.
      В любом случае для AVR это несущественно, ядро 8-битное и всё и так упакованно выходит. Независимо от наличия атрибута и его игнорирования.

      С terminate() и start() пока помочь не могу, сам ещё не использовал.

      • basil коментує:

        Больое спасибо что нашли время для ответа, сидел ждал емейла пока дошло посмотреть здесь ))) Вы не в курсе может быть кто-нибудь на электрониксе тестировал эти функции? Спасибо.

        • ReAl коментує:

          Ну раз они попали в релиз системы, то кто-то как-то их тестировал :-)
          Я в портах AVR их не проверял, но они должны бы заработать сразу.
          На электрониксе, думаю, самое представительное собрание разработчиков scmRTOS, так что спросить действительно лучше там.

          По поводу предупреждений с атрибутом packed смотреть буду позже, я сейчас в отпуске с плохим интернетом и хорошей природой :-)

          • basil коментує:

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

            • basil коментує:

              Извините, я правильно понимаю что в scm rtos прерывание системного (младшего) таймера исходно всегда включено, и для того чтобы он начал работать и
              и уходить по вектору прерывания надо самому только включить делитель,причем тики и хуки при этом включать необязательно?

              • ReAl коментує:

                Зависит от порта.
                Для Cortex-M3 можно вообще ничего не надо делать, по умолчанию подключится таймер, специально выделенный в кортексах под системный тик. Но можно его переопределить.

                Обработчик прерывания системного таймера находится в файле порта OS_Target_cpp.cpp
                Для большинства портов в проекте нужно сделать следующее:

                1. Определить макрос SYSTEM_TIMER_VECTOR, дам ему имя вектора выбранного вектора (файл scmRTOS_TARGET_CFG.h)

                2. До вызова OS::run(), т.е. где-то в начале функции main(), настроить аппаратуру таймера и разрешить его прерывания (глобально прерывания будут разрешены при старте первого процесса).

                В примерах AVR используется TIMER0, так как он есть у всех :-)
                Но никто не мешает, к примеру, в ATmega128 использовать компаратор C третьего таймера, при этом таймер будет свободно бежать, а два других компаратора использоваться для других целей.
                В таком случае в scmRTOS_TARGET_CFG.h нужно будет написать

                #define SYSTEM_TIMER_VECTOR TIMER3_COMPC_vect

                а в main() разрешить работу TIMER3, записать нужное значение в OCR3C и поднять бит OCIE3C в ETIMSK.

                Пользовательский хук system_timer_user_hook(), естественно, нужно определять (и включать его использование установкой scmRTOS_SYSTIMER_HOOK_ENABLE в 1 в файле scmRTOS_CONFIG.h) только при его использовании. Вот в приведенном выше примере он как раз нужен — чтобы в нём передвигать точку прерывания, добавляя к OCR3C число, соответствующее периоду системного тика.

Leave a Reply

[flagcounter image]