Jump to content
    

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);
   }
 }
}

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

 

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

Edited by varvar

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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, то светодиод моргает

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

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

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

Share this post


Link to post
Share on other sites

почему-то

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

#pragma weak PendSVC_ISR = PendSV_Handler

 

в os_target.cpp на

 

#pragma weak __exc_pendsv = PendSV_Handler

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

Спасибо,

--Владимир

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...