Перейти к содержанию
    

scmRtos для медных чайников

Прерывание вызывается?

А приоритет какой у него?

Для проверки в прерывание могралку ставлю:

static void TIM3_Event()
{
 static uint16_t counter=0;
 counter++;
 if(counter>100)
 {
   digitalWrite(PC13,!digitalRead(PC13));
   counter=0;
 }
 OS::system_timer_isr();
}

 

Если процесс выглядит так:

namespace OS
{
 template<> void TProc0::exec()
 {
   for (;;)
   {
        delay(100);
   }
 }
}

все моргает, стоит заменить на

namespace OS
{
 template<> void TProc0::exec()
 {
   for (;;)
   {
       OS::sleep(100);
   }
 }
}

моргание прекращается.

 

Какой приоритет - это надо в ардуиновские исходники лезть смотреть, так что пока не знаю.

Изменено пользователем varvar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так у вас, получается, само прерывание затыкается?

 

Может, надо сбрасывать флаг прерывания в обработчике?

 

Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV).

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так у вас, получается, само прерывание затыкается?

 

Может, надо сбрасывать флаг прерывания в обработчике?

 

Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV).

Да, затыкается прерывание. Но что его может затыкать?

Флаг поначалу сбрасывался, потом убрал - никак не влияет.

Если бы и влиял - влиял бы в обоих случаях.

А приоритет попробую порыть как в STM32duino изменить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

добавил в инициализацию

 

nvic_irq_set_priority(NVIC_TIMER3, (0xFEUL << (8-(CORE_PRIORITY_BITS))) & 0xFF);

 

хорошая новость - прерывания перестали затыкаться.

Плохая - система по-прежнему не работает, тут:

  template<> void TProc0::exec()
 {
   for (;;)
  {
     digitalWrite(PC13,!digitalRead(PC13));
     OS::sleep(100);
  }
 }

ничего не моргает.

Если sleep заменить ардуиновским delay, то светодиод моргает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов.

 

Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается.

 

Кстати, вы OS:run() не забыли вызвать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов.

 

Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается.

 

Кстати, вы OS:run() не забыли вызвать?

OS:run() не забыл.

Приоритет, наверно, 0xFE? С 0xFF не работает - прерывние теряется.

PendSV_Handler не вызывается :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

почему-то

nvic_set_vector_table((uint32_t)&PendSV_Handler,   (uint32)VECT_TAB_ADDR+0x38);

не помогает - что я не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заработало!!! (с) Кот Матроскин

 

По крайней мере на первый взгляд, одна задача мигает светодиодом, вторая в USB что-то гонит.

Помогла замена

 

#pragma weak PendSVC_ISR = PendSV_Handler

 

в os_target.cpp на

 

#pragma weak __exc_pendsv = PendSV_Handler

 

Может я и не прав, и надо было по другому сделать - но таки моргает :)

 

AHTOXA, спасибо огромное!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/11/2018 at 8:20 PM, varvar said:

Помогла замена

 

#pragma weak PendSVC_ISR = PendSV_Handler

 

в os_target.cpp на

 

#pragma weak __exc_pendsv = PendSV_Handler

 

В os_target.cpp нет упоминания о PendSV_Handler.

Могли бы вы выложить код целиком? https://github.com/scmrtos/scmrtos-sample-projects/issues/4

Спасибо,

--Владимир

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я на гитхабе отписался, продублирую сюда.

Поковырялся в platformio, в ардуиновских либах (очень поверхностно), смог запустить мигание светодиодиком и печать в последовательный порт с использованием scmRTOS и ардуиновских библиотек. Не знаю, насколько это полезно, но пусть будет.

К сожалению, структуру директорий scmRTOS сохранить не удалось, к тому же пришлось положить файлы конфигурации оси вместе с файлами оси. Насколько я понял, так работает platformio - оно компилирует все библиотеки по отдельности, и уже потом линкует их с приложением.

К тому же ардуиновская библиотека использует у себя внутри все таймерные прерывания, так что я не смог сделать custom таймер. Но почему-то заработал sysTick. Я уж не стал разбираться, как так получилось, заработало - и ладно:)

Я там на гитхабе приложил тестовый пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...