Jump to content

    

Anatoly74

Участник
  • Content Count

    10
  • Joined

  • Last visited

Community Reputation

0 Обычный

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. Необходимо написать "мягкий" вариант критической секции, когда прерывания разрешены, но заблокирована работа планировщика, чтобы не было переключения процессов. Вопрос. В какой п/программе Оси лучше сделать блокировку планировщика?
  2. Из документации на V4.0 я понял, что scmRTOS_PRIORITY_ORDER задает порядок старшинства приоритетов процессов. Например, если у нас описан процесс: typedef OS::process<OS::pr0, 400> TProc1; Тогда при scmRTOS_PRIORITY_ORDER=0, pr0 - это наивысший приоритет. А при scmRTOS_PRIORITY_ORDER=1, pr0 - это низший приоритет, т.е. в этом случае TProc1 будет иметь наименьший приоритет. Я не правильно понял? Кажется, я разобрался. Приоритет pr0 - это в любом случае всегда самый наивысший приоритет. А значение scmRTOS_PRIORITY_ORDER задает место pr0 (старший или младший бит) во внутренней карте процессов. Я не правильно истолковал смысл фразы на стр. 42: " scmRTOS_PRIORITY_ORDER 0/1 - Задаёт порядок старшинства приоритетов." Я думаю, чтобы не возникало всяких кривотолков надо заменить на стр. 42 фразу "Задаёт порядок старшинства приоритетов" на "задает место pr0 (старший или младший бит) во внутренней карте процессов".
  3. Да, clear_all_VD() гасит все светодиоды. Порядок переключение задач я смотрел по точкам останова с помощью внутрисхемного эмулятора. Осциллографом было бы менее наглядно. Поставил задержки, как вы советовали. Да, стало визуально видно, но проблема осталась. Содержимое scmRTOS_PRIORITY_ORDER не влияет на порядок переключения.
  4. Игрался с китом Discovery STM32F401. Состряпал для порта М4 простейший пример из 3-х процессов. Все они ждут одного события Flag.signal и зажигают один из 3-х светодиодов. Событие Flag.signal формируется каждые 0.5 сек по системному таймеру. Если scmRTOS_PRIORITY_ORDER = 1 все работает нормально и процессы переключаются в порядке их приоритетов: pr0 -> pr1 -> pr2. Устанавливаю scmRTOS_PRIORITY_ORDER = 0 и вижу, что порядок переключения остался тем же: pr0 -> pr1 -> pr2. Он не изменяется. Тогда я взял порт для М3 и прогнал тест на нем. Все то же самое. Объясните дураку, что я делаю не так. Вот тексты: //--------------------------------------------------------------------------- // Process types // typedef OS::process<OS::pr0, 400> TProc1; typedef OS::process<OS::pr1, 400> TProc2; typedef OS::process<OS::pr2, 400> TProc3; TProc1 Proc1; TProc2 Proc2; TProc3 Proc3; OS::TEventFlag Flag; //--------------------------------------------------------------------------- template<> OS_PROCESS void TProc1::exec() { for(;;) { Flag.wait(); clear_all_VD(); SetPORT(GPIOD, VD_ORANGE); } } //--------------------------------------------------------------------------- template<> OS_PROCESS void TProc2::exec() { for(;;) { Flag.wait(); clear_all_VD(); SetPORT(GPIOD, VD_RED); } } //--------------------------------------------------------------------------- template<> OS_PROCESS void TProc3::exec() { for(;;) { Flag.wait(); clear_all_VD(); SetPORT(GPIOD, VD_BLUE); } } //=================================================== void OS::system_timer_user_hook() { static int16U Tics=0, Cnt=0; if (++Tics < 250) return; Tics = 0; // 0.5 сек if (++Cnt >= 4) Cnt = 0; Flag.signal_isr(); }
  5. Большое спасибо за помощь
  6. Пытаюсь перетащить с GCC на IAR порт Cortex-M4. В файле OS_Target_cpp.cpp, в подпрограмме os_start(stack_item_t *sp) есть такой код: asm volatile ( #if (defined __SOFTFP__) // code without FPU " LDR R4, [%[stack], #(4 * 14)] \n" // Load process entry point into R4 " ADD %[stack], #(4 * 16) \n" // emulate context restore #else " LDR R4, [%[stack], #(4 * 15)] \n" // Load process entry point into R4 " ADD %[stack], #(4 * 17) \n" // emulate context restore #endif IAR ругается на %[stack]. Подскажите, плз., как победить это?
  7. Знатоки, поделитесь, плз, портом Cortex-M4 для IAR. Будет ли работать для М4 порт IAR Cortex-M3?
  8. Найдена опечатка в порте AVR, Common/OS_Kernel.h В исходниках: public: INLINE TKernel() : CurProcPriority(pr0) , ReadyProcessMap( (1ul << (PROCESS_COUNT)) - 1) // set all processes ready , ISR_NestCount(0) { } Должно быть: public: INLINE TKernel() : CurProcPriority(pr0) , ReadyProcessMap( (1 << (PROCESS_COUNT)) - 1) // set all processes ready , ISR_NestCount(0) { } Кстати, в версии 3.11 такая же фигня.
  9. scmRTOS + XMEGA

    Что-то тема порта XMega давно не обсуждалась. Какие-нибудь есть подвижки в данном направлении? Уж больно проц. хорош и востребован.