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.

Используйте страницу trunk для получения свежайших версий ОС.

Из микроконтроллеров AVR поддерживаются «обычные» 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 says:

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

    • ReAl says:

      Вопрос терминологический, но я бы не сказал, что на данный момент у 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 says:

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

  3. basil says:

    Начинаю осваивать 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 says:

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

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

      • basil says:

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

        • ReAl says:

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

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

          • basil says:

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

            • basil says:

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

              • ReAl says:

                Зависит от порта.
                Для 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]