|
scmRTOS (v3) blackfin, переключение контекста + IMASK |
|
|
|
 |
Ответов
|
Feb 27 2008, 19:42
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(yes @ Feb 27 2008, 03:55)  вообще, кто-нибудь пользует этот порт? Я использую. С самого начала.  Цитата(yes @ Feb 27 2008, 03:55)  в переключалке задач
.....
TStackItem* OS_ContextSwitchHook(TStackItem* sp) { return OS::Kernel.ContextSwitchHook(sp); }
// "..\..\scmRTOS\Common\OS_Kernel.cpp" line 87 col 50 link 12;
._P2L2147483646: [FP+ 8] = R0; .LN12: // "..\..\scmRTOS\Common\OS_Kernel.cpp" line 87 col 87 R1 = R0 ; R0.L = _Kernel__2OS; R0.H = _Kernel__2OS; CALL.X _ContextSwitchHook__Q2_2OS7TKernelFPUl;
.........
при этом link 12 и [FP+8] затирают значение IMASK на стеке
стек в блэкфине предекрементный, ну и вообще вроде бы соответствует соглашениям о вызовах (стр 1-255 40_ccblkfin_man.pdf) - там должно быть место для сохранения аргументов Вообще, функция OS_ContextSwitchHook является не более, чем оберткой для функции OS::TKernel::ContextSwitchHook и последняя объявлена как встраиваемая, т.е. ее тело подставляется в внутрь OS_ContextSwitchHook. В норме она и должна встраиваться и я не сталкивался с ситуацией, когда этого бы не происходило. Более того, это обстоятельство является таковым по замыслу - не нужен совершенно еще один лишний вызов и весь связанный с этим оверхед. Очевидно, у вас какие-то другие опции оптимизации, что не происходит встраивания инлайновой функции. У меня оптимизация чаще всего -Ov 80 (но и при -Ov 20 поведение аналогичное - все встраивается). Цитата(yes @ Feb 27 2008, 03:55)  --------------------------------
я вставил декремент стека [--sp] = sp; //dummy stack decrement to prevent IMASK overwrite call _OS_ContextSwitchHook;
после чего мои примерчики заработали Наверное, более правильно было бы SP += -12; В любом случае спасибо за правильное и ценное замечание. Цитата(yes @ Feb 27 2008, 03:55)  но не совсем понятно использование разных масок (то есть может эта сохранненная маска потом не нужна и я просто глючу) ? но без этого исправления вообще нифига не работало... Вы про IMASK, который сохраняется в стеке? Если про него, то тут все просто - с помощью этого запоминается состояние прерываний для каждого процесса. Цитата(yes @ Feb 27 2008, 03:55)  у меня был некий проектик (BF532 без внешней памяти), на котором использовалась scmRTOS v2 в результате разгильдяйства были частично утеряны исходники - при переделывании взял версию 3, но не выходит каменный цветок... v2 тоже не пропала - до нее можно добраться через сайт проекта, там где-то есть ссылка на Old, по которой лежит целиком весь старый (v2) сайт.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 3 2008, 19:37
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Спасибо. при включенной оптимизации (скорее всего interprocedural или как там она называется) не сохраняет аргументы в стек но хочется и подебажить  судя по примерам, включена еще "элиминация" в смысле выбрасывание неиспользуемых меток - в скрипте линкера если не объявлять и элиминация выключена - требует эти метки для линковки libc ldf_heap_length ldf_heap_space даже при условии, что кучей не пользоваться... ========== пропажа v2 - пропали мои исходники - у Вас все в порядке  но если переписывать, то лучше на v3 в работе RTOS никаких непонятностей не заметил. ------------------ а с использованием Scratch памяти в качестве стека задач, какие-нибудь проблемы возможны? по DMA доступ не нужен, байтовый доступ ... можно сделать чтобы не было а я почему-то не встречал использования Scratch ни в каких примерах ldf, а тут проект без внешней памяти - каждый килобайт на счету ... вот описание аномалии: Reads from the scratchpad memory may return incorrect data under some conditions. The problem occurs when reads of scratchpad memory are immediately followed by another read (of any location, including non-scratchpad locations), where the addresses being accessed do not have the same least significant address bit. This means that one of the transfers has to be a byte access. The other access has to be either a byte, 16-bit or 32-bit access on a different byte boundary than the first access. In addition, the instruction immediately before the Scratchpad memory read has to generate a memory stall due to either a dual DAG bank collision, a non-L1 memory data fetch, or a cache-line fill. If an instruction does not perform a read immediately after the scratchpad read, no problems occur. Also, back to back non-byte reads function properly. WORKAROUND: The simplest workaround for assembly programmers is to place any non-read instruction after each scratchpad read. For C programmers, one solution is not to map any data to the scratchpad. Alternatively the VisualDSP++ Blackfin compiler includes a workaround for this hardware anomaly. The compiler will automatically enable the workaround for the appropriate silicon revisions and part numbers, or the workaround can be enabled manually by specifying the compiler flag -workaround scratchpad-read' With the workaround enabled, when a sequence of three load instructions occurs (or occur as parts of a multi-issue instruction), where at least one of (2) and (3) is a byte load, a nop will be inserted between (1) and (2) or (2) and (3): A load instruction (1); A load instruction (2); A load instruction (3);
|
|
|
|
|
Mar 4 2008, 08:40
|

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

|
Цитата(yes @ Mar 3 2008, 22:37)  .. а с использованием Scratch памяти в качестве стека задач, какие-нибудь проблемы возможны? по DMA доступ не нужен, байтовый доступ ... можно сделать чтобы не было а я почему-то не встречал использования Scratch ни в каких примерах ldf, а тут проект без внешней памяти - каждый килобайт на счету ... Используется, посмотрите исходники ROM загрузчиков от analog. Еще используется для сохранения стека при прерываниях - порт bfin для RTEMS (cpu_asm.S).
|
|
|
|
|
Mar 4 2008, 16:14
|
Гуру
     
Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640

|
Цитата(bmf @ Mar 4 2008, 11:40)  Используется, посмотрите исходники ROM загрузчиков от analog. Еще используется для сохранения стека при прерываниях - порт bfin для RTEMS (cpu_asm.S). спасибо за информацию Цитата(dxp @ Mar 4 2008, 09:33)  Вот именно из-за оной аномалии и не пробовал никогда туда ничего класть. На асме, видимо, можно пользоваться, но у меня почти весь код на С++. Память сильно не жмет, хотя проект тоже весь живет внутри процессора, поэтому не искал проблем. Можно посмотреть на новые ревизии, может в них уже пофиксили баг. есть вопрос по С++ применительно к scmRTOS: как правильнее вызывать Sleep из некоторой иерархии сишных функций внутри проекта? TProc1::Exec() -> foo() -> boo() -> moo() и внутри moo() я хочу передать управление могу написать TProc1::Sleep(10); или Proc1.Sleep(3); как правильнее? я что-то смутно помню про статические члены и т.п. но С++ не настолько мне родной язык, чтобы такие тонкости различать  ------------------------------------------- видимо я понял "танцы с бубном" для прерываний BF - при сохранении контекста [--sp] = reti; разрешаются вложенные прерывания (GLBLDIS в IPEND очищается) поэтому нужно замаскировать все прерывания выше 14 так? вроде бы если изменить порядок регистров в контексте [--sp] = r0; r0=reti; [--sp] = r0; то прерывания разрешаться не будут но с другой стороны - если работает существующий механизм, то лучше не трогать  ------------------------------------ ну и еще  чего мне нехватает в сервисах scmRTOS - это секции на запрет шедулера, то есть, чтоб прерывания были разрешены (критическая секция нехорошо из-за увеличения латенси обработчика прерывания) может это можно сделать какими-то простыми юзерскими средствами (без изменения кода scmRTOS)? и наверно, "вращения приоритетов" тоже  дедлочится у меня код изредка... вроде стандартная конструкция - работало в VDSP и eCOS пока не могу понять почему - решил вот отвлечься - пописать в форум
|
|
|
|
Сообщений в этой теме
yes scmRTOS (v3) blackfin Feb 26 2008, 21:55  dxp Цитата(yes @ Mar 4 2008, 01:37) а с испол... Mar 4 2008, 06:33    dxp Цитата(yes @ Mar 4 2008, 22:14) есть вопр... Mar 5 2008, 06:18     yes спасибо еще раз за детальный ответ :
по поводу пр... Mar 5 2008, 14:35      dxp Цитата(yes @ Mar 5 2008, 20:35) теоретиче... Mar 6 2008, 15:36       yes Цитата(dxp @ Mar 6 2008, 18:36) Каналы жи... Mar 6 2008, 17:33        yes Обнаружил конкретную проблему:
для передачи управ... Mar 7 2008, 11:51         dxp Цитата(yes @ Mar 7 2008, 17:51) EX_INTERR... Mar 7 2008, 12:22          yes Цитата(dxp @ Mar 7 2008, 15:22) Я понял, ... Mar 7 2008, 13:20           Сергей Борщ Цитата(yes @ Mar 7 2008, 15:20) сяду сейч... Mar 7 2008, 13:28            dxp Цитата(Сергей Борщ @ Mar 7 2008, 19:28) А... Mar 7 2008, 13:50            yes Цитата(Сергей Борщ @ Mar 7 2008, 16:28) А... Mar 7 2008, 13:57             Сергей Борщ Цитата(yes @ Mar 7 2008, 15:57) А обсужде... Mar 7 2008, 14:03              dxp Цитата(Сергей Борщ @ Mar 7 2008, 20:03) Е... Mar 7 2008, 14:28            yes Цитата(Сергей Борщ @ Mar 7 2008, 16:28) А... Mar 7 2008, 14:34             dxp Цитата(yes @ Mar 7 2008, 20:34) если есть... Mar 9 2008, 06:44 dxp Проблема, с которой началась ветка, пофиксена. Взя... Mar 9 2008, 13:50 yes Цитата(dxp @ Mar 9 2008, 16:50) Проблема,... Mar 9 2008, 20:44  dxp Цитата(yes @ Mar 10 2008, 02:44) если ест... Mar 10 2008, 13:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|