varvar 0 June 10, 2018 Posted June 10, 2018 (edited) · Report post Прерывание вызывается? А приоритет какой у него? Для проверки в прерывание могралку ставлю: 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 June 10, 2018 by varvar Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 June 10, 2018 Posted June 10, 2018 · Report post Так у вас, получается, само прерывание затыкается? Может, надо сбрасывать флаг прерывания в обработчике? Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV). Quote Share this post Link to post Share on other sites More sharing options...
varvar 0 June 10, 2018 Posted June 10, 2018 · Report post Так у вас, получается, само прерывание затыкается? Может, надо сбрасывать флаг прерывания в обработчике? Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV). Да, затыкается прерывание. Но что его может затыкать? Флаг поначалу сбрасывался, потом убрал - никак не влияет. Если бы и влиял - влиял бы в обоих случаях. А приоритет попробую порыть как в STM32duino изменить. Quote Share this post Link to post Share on other sites More sharing options...
varvar 0 June 10, 2018 Posted June 10, 2018 · Report post добавил в инициализацию 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, то светодиод моргает Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 June 10, 2018 Posted June 10, 2018 · Report post Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов. Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается. Кстати, вы OS:run() не забыли вызвать? Quote Share this post Link to post Share on other sites More sharing options...
varvar 0 June 11, 2018 Posted June 11, 2018 · Report post Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов. Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается. Кстати, вы OS:run() не забыли вызвать? OS:run() не забыл. Приоритет, наверно, 0xFE? С 0xFF не работает - прерывние теряется. PendSV_Handler не вызывается :( Quote Share this post Link to post Share on other sites More sharing options...
varvar 0 June 11, 2018 Posted June 11, 2018 · Report post почему-то nvic_set_vector_table((uint32_t)&PendSV_Handler, (uint32)VECT_TAB_ADDR+0x38); не помогает - что я не так делаю? Quote Share this post Link to post Share on other sites More sharing options...
varvar 0 June 11, 2018 Posted June 11, 2018 · Report post Заработало!!! (с) Кот Матроскин По крайней мере на первый взгляд, одна задача мигает светодиодом, вторая в USB что-то гонит. Помогла замена #pragma weak PendSVC_ISR = PendSV_Handler в os_target.cpp на #pragma weak __exc_pendsv = PendSV_Handler Может я и не прав, и надо было по другому сделать - но таки моргает :) AHTOXA, спасибо огромное! Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 June 11, 2018 Posted June 11, 2018 · Report post Ну и отлично :) Quote Share this post Link to post Share on other sites More sharing options...
dvv854 0 January 27, 2019 Posted January 27, 2019 · Report post 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 Спасибо, --Владимир Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 January 27, 2019 Posted January 27, 2019 · Report post Я на гитхабе отписался, продублирую сюда. Поковырялся в platformio, в ардуиновских либах (очень поверхностно), смог запустить мигание светодиодиком и печать в последовательный порт с использованием scmRTOS и ардуиновских библиотек. Не знаю, насколько это полезно, но пусть будет. К сожалению, структуру директорий scmRTOS сохранить не удалось, к тому же пришлось положить файлы конфигурации оси вместе с файлами оси. Насколько я понял, так работает platformio - оно компилирует все библиотеки по отдельности, и уже потом линкует их с приложением. К тому же ардуиновская библиотека использует у себя внутри все таймерные прерывания, так что я не смог сделать custom таймер. Но почему-то заработал sysTick. Я уж не стал разбираться, как так получилось, заработало - и ладно:) Я там на гитхабе приложил тестовый пример. Quote Share this post Link to post Share on other sites More sharing options...