varvar 0 10 июня, 2018 Опубликовано 10 июня, 2018 (изменено) · Жалоба Прерывание вызывается? А приоритет какой у него? Для проверки в прерывание могралку ставлю: 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); } } } моргание прекращается. Какой приоритет - это надо в ардуиновские исходники лезть смотреть, так что пока не знаю. Изменено 10 июня, 2018 пользователем varvar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 10 июня, 2018 Опубликовано 10 июня, 2018 · Жалоба Так у вас, получается, само прерывание затыкается? Может, надо сбрасывать флаг прерывания в обработчике? Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
varvar 0 10 июня, 2018 Опубликовано 10 июня, 2018 · Жалоба Так у вас, получается, само прерывание затыкается? Может, надо сбрасывать флаг прерывания в обработчике? Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV). Да, затыкается прерывание. Но что его может затыкать? Флаг поначалу сбрасывался, потом убрал - никак не влияет. Если бы и влиял - влиял бы в обоих случаях. А приоритет попробую порыть как в STM32duino изменить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
varvar 0 10 июня, 2018 Опубликовано 10 июня, 2018 · Жалоба добавил в инициализацию 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, то светодиод моргает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 10 июня, 2018 Опубликовано 10 июня, 2018 · Жалоба Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов. Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается. Кстати, вы OS:run() не забыли вызвать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
varvar 0 11 июня, 2018 Опубликовано 11 июня, 2018 · Жалоба Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов. Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается. Кстати, вы OS:run() не забыли вызвать? OS:run() не забыл. Приоритет, наверно, 0xFE? С 0xFF не работает - прерывние теряется. PendSV_Handler не вызывается :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
varvar 0 11 июня, 2018 Опубликовано 11 июня, 2018 · Жалоба почему-то nvic_set_vector_table((uint32_t)&PendSV_Handler, (uint32)VECT_TAB_ADDR+0x38); не помогает - что я не так делаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
varvar 0 11 июня, 2018 Опубликовано 11 июня, 2018 · Жалоба Заработало!!! (с) Кот Матроскин По крайней мере на первый взгляд, одна задача мигает светодиодом, вторая в USB что-то гонит. Помогла замена #pragma weak PendSVC_ISR = PendSV_Handler в os_target.cpp на #pragma weak __exc_pendsv = PendSV_Handler Может я и не прав, и надо было по другому сделать - но таки моргает :) AHTOXA, спасибо огромное! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 11 июня, 2018 Опубликовано 11 июня, 2018 · Жалоба Ну и отлично :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvv854 0 27 января, 2019 Опубликовано 27 января, 2019 · Жалоба 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 Спасибо, --Владимир Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 27 января, 2019 Опубликовано 27 января, 2019 · Жалоба Я на гитхабе отписался, продублирую сюда. Поковырялся в platformio, в ардуиновских либах (очень поверхностно), смог запустить мигание светодиодиком и печать в последовательный порт с использованием scmRTOS и ардуиновских библиотек. Не знаю, насколько это полезно, но пусть будет. К сожалению, структуру директорий scmRTOS сохранить не удалось, к тому же пришлось положить файлы конфигурации оси вместе с файлами оси. Насколько я понял, так работает platformio - оно компилирует все библиотеки по отдельности, и уже потом линкует их с приложением. К тому же ардуиновская библиотека использует у себя внутри все таймерные прерывания, так что я не смог сделать custom таймер. Но почему-то заработал sysTick. Я уж не стал разбираться, как так получилось, заработало - и ладно:) Я там на гитхабе приложил тестовый пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться