scmRTOS
scmRTOS is a small simple RTOS OS for microcontrollers designed by Harry Zhurov. Current release — 4.00
There are scmRTOS ports for the next microcontroller series:
- ARM7 — GCC;
- AVR (Atmel) — GCC, IAR;
- Blackfin (Analog Devices) — VDSP;
- Cortex-M3 — GCC, IAR;
- Cortex-M0 — GCC (in branch pre-v400 now);
- MSP430 (Texas Instruments) — GCC, IAR;
- STM8 (ST Microelectronics) — IAR.
Use “Download GNU tarball” link at bottom of page for selected microcontroller and compiler or download archive from sourceforge scmRTOS page
Use trunk page for latest versions.
megaAVR including ATmega256x are supported for for AVR micros.
scmRTOS v4.00 documentation.
Project page on sourceforge.net.
scmRTOS google group.
scmRTOS Wiki
scmRTOS section, on electronix forum. The forum is mostly in Russian but you will free to ask a question in English here or in the forum.
scmRTOS can be used in Arduino environment, see topic in Arduino forum and git repository.
Here i offer you the detailed explanation of 1-EventFlag – one of the examples, distributed with the system.
Большое Вам спасибо за такой подробный ответ, но все-таки интересно с чем это связано, случайно не с тем ли, что использование системы предполагается с основном в тактируемом режиме?
Вопрос терминологический, но я бы не сказал, что на данный момент у scmRTOS есть тактируемый режим. Я это слово воспринимаю как насильное переключение процессов по таймеру, round robin для процессов с одинаковым приоритетом. Такая возможность в пожеланиях к scmRTOS озвучивалась, но пока активных действий не предпринято.
Просто в scmRTOS считается, что необходима постоянно работающая «служба времени». Без постоянно работающего таймера, например, не будут работать таймауты. Хотя в системе с управлением только по событиям с ожиданием «до упора» (упором для конкретной периферии может быть отдельный канал COMPARE таймера, настраиваемый на защитный интервал) можно обойтись без системного тика.
Иногда постоянно работающий таймер даже вреден, например, когда нужно спать.
При необходимости можно останавливать и опять запускать таймер вызовами lock_system_timer() / lock_system_timer() (OS_Kernel.h), для этого в scmRTOS_TARGET_CFG.h помимо вектора должны быть определены соответствующие макросы, например:
#define UNLOCK_SYSTEM_TIMER() (TIMER0_IE_REG |= (1 << TOIE0))
Для Cortex-M3 можно заменить по умолчанию используемый NVIC SysTick timer, подменив функцию __init_system_timer (она в OS_Targte_asm.S помечена как .weak, поэтому достаточно просто завести в проекте свою с таким именем). Возможность появилась, насколько я помню, именно в ответ на пожелание замены таймера для более гибкого управления в режимах пониженного потребления.
Ксть обсуждения упомятутого на electronix.ru, но что-то форум сейчас не отвечает, я не могу найти темы, чтобы дать линки.
Форум проснулся, пусть линки полежат и тут, сам бысрее найду, если понадобится.
Обсуждение необходимости/возможности карусели процессов с «уравненным» приоритетом. Там, правда, постороннего флуда много.
А закончилось пока это обсуждение банальной нехваткой времени.
Аргументация за необходимость замены системного таймера в scmRTOS/Cortex-M3 Ниже того сообщения небольшое обсуждение и рекомендации по использованию.
Спасибо огромное, сейчас как раз перелезаю на кортесы-)
Да, варнинги дает авр студия 4.18 и 4.19 прошу прощения не уточнил сразу.
Начинаю осваивать 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() функциями а то что-то никак ))
Странно.
Откуда там вообще атрибут packed? Его же вроде нигде в исходниках нет.
В любом случае для AVR это несущественно, ядро 8-битное и всё и так упакованно выходит. Независимо от наличия атрибута и его игнорирования.
С terminate() и start() пока помочь не могу, сам ещё не использовал.
Больое спасибо что нашли время для ответа, сидел ждал емейла пока дошло посмотреть здесь ))) Вы не в курсе может быть кто-нибудь на электрониксе тестировал эти функции? Спасибо.
Ну раз они попали в релиз системы, то кто-то как-то их тестировал 🙂
Я в портах AVR их не проверял, но они должны бы заработать сразу.
На электрониксе, думаю, самое представительное собрание разработчиков scmRTOS, так что спросить действительно лучше там.
По поводу предупреждений с атрибутом packed смотреть буду позже, я сейчас в отпуске с плохим интернетом и хорошей природой 🙂
Да, большое спасибо все заработало -))) я просто жостко тупил))) и слабо плюсы знаю , ээ собственно только начал их изучать )), и в мануале для начинающего про них немного непонятно(про функции), но разработчики были столь любезны и доброжелательны, что все с этм растолковали )), за что им и Вам большое спасибо.
Извините, я правильно понимаю что в scm rtos прерывание системного (младшего) таймера исходно всегда включено, и для того чтобы он начал работать и
и уходить по вектору прерывания надо самому только включить делитель,причем тики и хуки при этом включать необязательно?
Зависит от порта.
Для 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 нужно будет написать
а в main() разрешить работу TIMER3, записать нужное значение в OCR3C и поднять бит OCIE3C в ETIMSK.
Пользовательский хук system_timer_user_hook(), естественно, нужно определять (и включать его использование установкой scmRTOS_SYSTIMER_HOOK_ENABLE в 1 в файле scmRTOS_CONFIG.h) только при его использовании. Вот в приведенном выше примере он как раз нужен — чтобы в нём передвигать точку прерывания, добавляя к OCR3C число, соответствующее периоду системного тика.