|
|
  |
scmRTOS и MSP430F5xxx, не работает ОСь |
|
|
|
Mar 13 2012, 11:42
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011

|
Здравствуйте! Не получается запустить scmRTOS на процессоре msp430f5529. Застревает в DUMMY_INSTR(). Я так понимаю, нужно переписать ассемблерный код переключения контекста, т.к. архитектуры F1xxx и F5xxx процессоров отличаются? Нет ли у кого порта под F5xxx? Сам я вряд ли смогу его сделать. OS_Kernel.cpp Код void TKernel::sched() { uint_fast8_t NextPrty = highest_priority(ReadyProcessMap); if(NextPrty != CurProcPriority) { SchedProcPriority = NextPrty; raise_context_switch(); do { enable_context_switch(); DUMMY_INSTR(); disable_context_switch(); } while(CurProcPriority != SchedProcPriority); // until context switch done } }
Сообщение отредактировал Slash - Mar 13 2012, 11:42
|
|
|
|
|
Mar 14 2012, 07:29
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Slash @ Mar 13 2012, 13:42)  Застревает в DUMMY_INSTR(). Не вызывается прерывание переключения контекста или оно не переключает контекст. Учитывая, что программа продоллжает работать - скорее первое. QUOTE (Slash @ Mar 13 2012, 13:42)  Я так понимаю, нужно переписать ассемблерный код переключения контекста, т.к. архитектуры F1xxx и F5xxx процессоров отличаются? В ассемблерном коде встречаются строчки "#elif __CORE__ == __430X_CORE__", т.е. он должен работать на ядре 430X. Там даже есть набор примеров для ядра 430X.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 14 2012, 10:38
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011

|
Спасибо. Я немного поторопился, нужно было поразбираться глубже. Для переключения контекста я использовал Компаратор B. Но, в отличие от Компратора А (на основе которого сделано переключение в примерах scmRTOS), запрос прерывания не сбрасывается автоматически при входе в обработчик прерывания. Для сброса запроса прерывания нужно прочитать регистр CBIV, что заодно и сбросит флаг CBIFG в регистре CBINT. Я добавил строчку Код mov.w &CBIV,&CBIV в файл OS_Target_asm.s43 и программа заработала: Код #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
// extern OS_ContextSwitchStackData extern os_context_switch_hook
public context_switcher_isr
common INTVEC(1) org CONTEXT_SWITCH_ISR_VECTOR dc16 context_switcher_isr
rseg ISR_CODE(1)
context_switcher_isr: save_regs mov.w SP,r12 xcall #os_context_switch_hook mov.w r12,SP l_restore_context: restore_regs mov.w &CBIV,&CBIV // добавил reti
#endif // scmRTOS_CONTEXT_SWITCH_SCHEME Можно ли добавить какую-то обертку (например в файл scmRTOS_TARGET_CFG.h) для добавления кода сброса запроса прерывания?
|
|
|
|
|
Mar 14 2012, 11:51
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Slash @ Mar 14 2012, 12:38)  Можно ли добавить какую-то обертку (например в файл scmRTOS_TARGET_CFG.h) для добавления кода сброса запроса прерывания? Вы можете вставить эту команду в функцию OS::context_switch_user_hook(), предварительно разрешив ее использование в scmRTOS_CONFIG.h строкой CODE #define scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 1 Саму функцию можно сделать встраиваемой и поместить в scmRTOS_TARGET_CONFIG.h: CODE namespace OS { INLINE void context_switch_user_hook() { CBIV = CBIV; } }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 22 2012, 14:29
|

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

|
Цитата(Slash @ Mar 14 2012, 13:38)  и программа заработала: А не могли бы все изменения кратенько описать? Там их, вроде, немного. Вроде как все относящееся к компараторному регистру поменял, но пока ничего не получилось, компилятор то ли сам по себе глючит, то ли я его недопонимаю. Как у Вас компилятор отнесся к DEFCW( ADC10CTL0 , ADC10CTL0_)? У меня компилятор на эту строку изругался (файл msp430f5510.h) при компиляции OS_Target_asm.s43. Что ассемблеру тут не нравится (определение из msp430f5510.h)? Код #define DEFCW(name, address) __no_init union \ { \ struct \ { \ volatile unsigned char name##_L; \ volatile unsigned char name##_H; \ }; \ volatile unsigned short name; \ } @ address;
|
|
|
|
|
May 22 2012, 16:11
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (varvar @ May 22 2012, 17:29)  У меня компилятор на эту строку изругался  Предлагаете нам догадаться, как именно он изругался - предлагаем вам догадаться, что именно ему не понравилось. QUOTE (varvar @ May 22 2012, 17:29)  Что ассемблеру тут не нравится Наверное ключевые слова совершенно другого языка программирования (Си) union, struct, volatile, unsigned, char, short, @?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 29 2012, 13:08
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011

|
Цитата(varvar @ May 22 2012, 23:23)  А наличие готового примера работающего с F5xx все-таки значительно облегчило бы участь. Выкладываю проект, который у меня заработал.
|
|
|
|
|
Jun 2 2012, 19:45
|

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

|
Цитата(Slash @ May 29 2012, 16:08)  Выкладываю проект, который у меня заработал. Спасибо, у меня тоже по мотивам Ваших сообщений заработало. Но выглядит аляповато. Может, авторы со временем добавят сами в scmRTOS F5xx - все-таки и сами процессоры дешевле, и отлаживать их можно SBW - программатор тексас шлет за около 5 долларов с доставкой. И просто через USB можно загружать код.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|