|
scmRtos для медных чайников |
|
|
|
Feb 12 2012, 09:04
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Добрый день всем! Возникло желание - точнее, необходимось использовать многозадачность в своем проекте - вернее, или надо писать свой диспетчер (в котором я уже успел запутаться), или пользоваться чем-то готовым. Увидел scmRtos - попытался запустить демку. Пример под IAR на MSP430F2617 - у меня на плате MSP430F2410, IAR версия 5.30
Немножко подправил демку под свою плату, чтобы нужный светодиодик моргал, указал иару на MSP430F2410 - и ничего. WDT прерывание случается раза 4 (вроде как это системный таймер?), после чего программа улетает неведомо куда.
Кто-нибудь может на путь истинный наставить - что можно трогать, что нельзя. Может ли на работоспособности версия компилятора сказаться? Или, лучше всего, может у кого готовая рыба завалялась для моргания именно на этом кристалле или похожем?
|
|
|
|
10 страниц
« < 8 9 10
|
 |
Ответов
(135 - 143)
|
Jun 10 2018, 10:39
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Цитата(AHTOXA @ Jun 10 2018, 13:18)  Прерывание вызывается? А приоритет какой у него? Для проверки в прерывание могралку ставлю: CODE static void TIM3_Event() { static uint16_t counter=0; counter++; if(counter>100) { digitalWrite(PC13,!digitalRead(PC13)); counter=0; } OS::system_timer_isr(); } Если процесс выглядит так: CODE namespace OS { template<> void TProc0::exec() { for (;;) { delay(100); } } } все моргает, стоит заменить на CODE namespace OS { template<> void TProc0::exec() { for (;;) { OS::sleep(100); } } } моргание прекращается. Какой приоритет - это надо в ардуиновские исходники лезть смотреть, так что пока не знаю.
Сообщение отредактировал varvar - Jun 10 2018, 10:43
|
|
|
|
|
Jun 10 2018, 13:23
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Цитата(AHTOXA @ Jun 10 2018, 16:58)  Так у вас, получается, само прерывание затыкается?
Может, надо сбрасывать флаг прерывания в обработчике?
Ну и приоритет должен быть ниже всех остальных прерываний в системе (кроме PendSV). Да, затыкается прерывание. Но что его может затыкать? Флаг поначалу сбрасывался, потом убрал - никак не влияет. Если бы и влиял - влиял бы в обоих случаях. А приоритет попробую порыть как в STM32duino изменить.
|
|
|
|
|
Jun 10 2018, 18:29
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
добавил в инициализацию nvic_irq_set_priority(NVIC_TIMER3, (0xFEUL << (8-(CORE_PRIORITY_BITS))) & 0xFF); хорошая новость - прерывания перестали затыкаться. Плохая - система по-прежнему не работает, тут: CODE template<> void TProc0::exec() { for (;;) { digitalWrite(PC13,!digitalRead(PC13)); OS::sleep(100); } } ничего не моргает. Если sleep заменить ардуиновским delay, то светодиод моргает
|
|
|
|
|
Jun 11 2018, 03:53
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Цитата(AHTOXA @ Jun 11 2018, 00:34)  Во-первых, для надёжности лучше пишите в приоритет 0xFF, и без всяких сдвигов.
Во-вторых, убедитесь, что вызывается осёвый обработчик PendSV_Handler. А то кто его знает, что там в недрах mbed-а делается.
Кстати, вы OS:run() не забыли вызвать? OS:run() не забыл. Приоритет, наверно, 0xFE? С 0xFF не работает - прерывние теряется. PendSV_Handler не вызывается
|
|
|
|
|
Jun 11 2018, 08:54
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
почему-то CODE nvic_set_vector_table((uint32_t)&PendSV_Handler, (uint32)VECT_TAB_ADDR+0x38);
не помогает - что я не так делаю?
|
|
|
|
|
Jun 11 2018, 17:20
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Заработало!!! (с) Кот Матроскин По крайней мере на первый взгляд, одна задача мигает светодиодом, вторая в USB что-то гонит. Помогла замена #pragma weak PendSVC_ISR = PendSV_Handler в os_target.cpp на #pragma weak __exc_pendsv = PendSV_Handler Может я и не прав, и надо было по другому сделать - но таки моргает  AHTOXA, спасибо огромное!
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|