|
scmRTOS + XMEGA, порт scmRTOS для XMEGA |
|
|
|
Jan 20 2011, 11:43
|
Группа: Новичок
Сообщений: 6
Регистрация: 25-12-10
Пользователь №: 61 862

|
Пытаюсь запустить scmRTOS на ATxmega128A1. Вопросы к автору: 1. Контроллер имеет многоуровневый контроллер прерываний, какие трудности это повлечет в части работы scmRTOS? 2. Стек :
Цитирую: «Адрес возврата может быть представлен двумя или тремя байтами, что зависит от размера памяти микроконтроллера. У МК с памятью программ 128 кбайт и менее адрес возврата двухбайтный, поэтому, указатель стека декрементируется/инкрементируется на два. У тех же микроконтроллеров, которые оснащены памятью программ размером более 128 кбайт, адрес возврата трехбайтный, а декрементирование/инкрементирование SP выполняется на три.»
Какие необходимо внести изменения в исходный код платформеннозависимой части?
|
|
|
|
|
Jan 20 2011, 16:20
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Я веду AVR/GCC порт и потихоньку подхватываю AVR/IAR. По 2/3 байта - это похоже на то, что нужно для atmega256x (в группе гугла проскочило). Добавить под условную компиляцию запихивание в стек (возвратов) старшего байта в конструкторе TBaseProcess в Os_Target_cpp.cpp Для Xmega кроме этого надо править сохранение/восстановление контекста, так как добавляются RAMPX, RAMPY, RAMPD. Ну и EIND, как и для меги256х.
А вот как раз над контроллером прерываний я ещё не задумывался. Отметил для себя, что место тонкое и требует внимания, но дальше не пошёл.
В ближайшие выходные собирался проверить по-минимуму в железе на atmega2561. До следующих постараюсь опять почитать описание Xmega.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 24 2011, 07:15
|
Группа: Новичок
Сообщений: 6
Регистрация: 25-12-10
Пользователь №: 61 862

|
Спасибо, я так и думал, осталось разобраться, как это сделать -). К концу недели должно прийти железо (ATAVRXPLAIN), на следующей неделе постараюсь на нем отладить …
В файле OS_Target_asm.s90 заботливо описаны RAMP регистры XMEGи но их сохранение в контексте не производится …, интересно, кто позаботился и зачем? -)
С вложенными приоритетными прерываниями пока вопрос открыт. Если я правильно понимаю, вложенные прерывания или не поддерживаются или не должны содержать вызовы системных функций? Очевидно, что системное прерывание должно быть самым низкоприоритетным. Если не прав, поправьте, пожалуйста.
|
|
|
|
|
Jan 24 2011, 16:08
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(SWD @ Jan 24 2011, 09:15)  В файле OS_Target_asm.s90 заботливо описаны RAMP регистры XMEGи но их сохранение в контексте не производится …, интересно, кто позаботился и зачем? -) Они (в IAR-порте) сохраняются/восстанавливаются не в макросах save, а прямым текстом ниже, в коде функций. Код ContextSwitcher_ISR: save_SREG save_SP save_regs
#if HAS_RAMPZ == 1 in r31,RAMPZ st -Y,r31 #endif и так далее. В avr-gcc сохраняются в основных макросах save_context. Это всё «косметика», вохможно, позже сведу к единообразному виду. Для avr-gcc исправления для mega256x я ужен проверил в железе и вбросил в ветку pre-v400. Для IAR ещё не проверял, вброшу позже. Цитата(SWD @ Jan 24 2011, 09:15)  С вложенными приоритетными прерываниями пока вопрос открыт. Если я правильно понимаю, вложенные прерывания или не поддерживаются или не должны содержать вызовы системных функций? Очевидно, что системное прерывание должно быть самым низкоприоритетным. Если не прав, поправьте, пожалуйста. Вложенные прерывания и на обычных AVR могут быть, см class TNestedISRW в scmRTOS_TARGET_CFG.hСистемные вызовы имеют критические секции, котрые делаются через запрет всех прерываний битом I в SREG, так что наличие любых вложенных прерываний не страшно для их работы. Нужно внимательно просмотреть обёртки TISRW/ TISRW_SS, возможно, для xmega ISR_Enter() тоже придётся делать с критической секцией, так как у Xmega бит I не сбрасывается при входе в прерывание. Возможно, в сохраняемый контекст процесса также стоит включить тот регистр, в котором маски разрешённых уровенй прерывания. Собственно, у «более других» процессоров, бывает, прямо в статусном регистре сидит не один бит I, а несколько бит с уровнем приоритета процессора. Пример. Высокоприоритетный процесс. Настолько высоко, что при свой работе запрещает низкоприоритетные прерывания, шоб не мешались. Но если этот процесс засыпает по sleep/wait/..., то у пришедшего ему на смену менее приоритетного процесса те уровни прерываний должны бы быть и разрешены. Просится при старте ОС разрешать все уровни прерываний, а уж там если кто-то что-то запретит, так оно вместе с ним будет из контекста восстанавливаться, а у оcтальных — по умолчанию. И лучше всего это сделать через контекст. Я для Xmega ничего не писал и очень уж внимательно описание не читал, но такая мысль возникла. Ах, да, ещё SYS_TIMER_CRIT_SECT() в OS_Target.h тоже на тему возможности вложенных прерываний без специальных на то разрешений. И это место надо под #ifdef пустить об Xmega-признак. Надо всё внимательно просмотреть.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 25 2011, 04:40
|
Группа: Новичок
Сообщений: 6
Регистрация: 25-12-10
Пользователь №: 61 862

|
В файле OS_Target_asm.s90 заботливо описаны все RAMP регистры:
#define SREG 0x3F #define SPH 0x3E #define SPL 0x3D #define RAMPX 0x39 #define RAMPY 0x3a #define RAMPZ 0x3b #define EIND 0x3c
Сохранение их в контексте не увидел ).
В uC/OS-II сохраняются RAMPD, RAMPX, RAMPZ, EIND. Интересно, почему не сохраняется RAMPY? Если интересен порт uC/OS-II для XMEGA, готов куда ни будь его выложить.
Из описания ОСи: "ЗАМЕЧАНИЕ. В текущей версии scmRTOS при использовании пере- дачи управления на основе программного прерывания вложенные прерывания не поддерживаются. Точнее, не поддерживаются вло- женные прерывания, где задействуются механизмы ОС – главным образом, касающиеся планировки процессов. Остальные преры- вания могут быть использованы в обычном порядке."
Исходники scmRTOS пока не переварил … )
|
|
|
|
|
Jan 25 2011, 08:40
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(SWD @ Jan 25 2011, 06:40)  В файле OS_Target_asm.s90 заботливо описаны все RAMP регистры: ... Сохранение их в контексте не увидел ). Описать наперёд никто не запрещает :-) RAMPZ сохраняется, цитата выше из исходников v3.10 Цитата(SWD @ Jan 25 2011, 06:40)  В uC/OS-II сохраняются RAMPD, RAMPX, RAMPZ, EIND. Интересно, почему не сохраняется RAMPY? О, кстати, для IAR с RAMPY нужно внимательно, там же Y - укаатель стека данных «намертво». Похоже, придётся для XMEGA менять тип указателя стека процесса.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jan 25 2011, 11:35
|
Группа: Новичок
Сообщений: 6
Регистрация: 25-12-10
Пользователь №: 61 862

|
Цитата И это место надо под #ifdef пустить об Xmega-признак. Может лучше отдельный порт? Цитата RAMPZ сохраняется ... Маловато будет )) Цитата О, кстати, для IAR с RAMPY нужно внимательно, там же Y - укаатель стека данных «намертво». Смотрю на него внимательно ..., не знаю что с ним делать  . Что значит "намертво"? Цитата Похоже, придётся для XMEGA менять тип указателя стека процесса. На какой? )). ( ... Может лучше отдельный порт?) )))
|
|
|
|
|
Jan 25 2011, 20:19
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(SWD @ Jan 25 2011, 13:35)  Может лучше отдельный порт? Зачем? Общего достаточно много. Да, отличия немного больше, чем между мега32 и мега256х, но не такие и большие. Как по мне, то вариант с #ifdef может оказаться проще и в сопровождении, и в использовании. Цитата(SWD @ Jan 25 2011, 13:35)  Маловато будет )) Для ATmega128 этого было достаточно, а Xmega никто и не обещал :-) Цитата(SWD @ Jan 25 2011, 13:35)  Смотрю на него внимательно ..., не знаю что с ним делать  . Что значит "намертво"? На какой? )). ( ... Может лучше отдельный порт?) ))) То, что Y всегда указатель стека данных. В avr-gcc Y - это указатель стековго кадра — тогда, когда это нужно. Туда копируется SP и данные на общем стеке адресуются относительно Y. Что-то похожее на использование регистра BP в x86. Поэтому с точки зрения порта scmRTOS и пара Y, и RAMPY идут на тех же правах, что и X, Z, RAMPX, RAMPZ, за контекст отвечает SP. А у IAR стековдва и «основной» для scmRTOS стек — CSTACK, т.е. RAMPY:YH:YL Соответственно, в состоянии процесса храниться должно такое расширенное состояние. Для простоты можно сохранять uint32_t. Для экономии места и, возможно, времени - 3-байтовую структуру uint8_t page; uint16_t sp; Или считать, что стеки всех процессов всегда в нижних 64К (пока нет Xmega с внутренним ОЗУ больше, это синоним "стеки во внутреннем, быстром, ОЗУ") и думать, что RAMPY всегда 0. p.s. Порт AVR/IAR для mega256x проверен и вброшен в ветку pre-v400 (ревизия 306, дальше могут пойти изменения в других местах scmRTOS).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 8 2011, 15:52
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 23-12-05
Пользователь №: 12 594

|
Может быть вопрос немного не в тему, но не хочется создавать товый топик. Как scmRTOS относится к записи данных в EEPROM? Ведь для корректной записи в EEPROM необходимо отключать прерывания на несколько милисекунд. Я использую специально для этих целей файл eeprom.s90 Не окажет ли это влияние на работу операционки?
Сообщение отредактировал quarter2 - Feb 8 2011, 15:53
Прикрепленные файлы
eeprom.rar ( 3.25 килобайт )
Кол-во скачиваний: 24
|
|
|
|
|
Feb 9 2011, 07:48
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 23-12-05
Пользователь №: 12 594

|
Цитата(ReAl @ Feb 9 2011, 00:06)  Зачем ??? проблема есть реально, если на время записи в еепром не запрещать прерывание - данные могут записаться некорректно. после того как начал использовать вышеприведённый файл - проблема устранилась. вот здесь этот вопрос обсуждается http://electronix.ru/forum/lofiversion/index.php/t16140.htmlhttp://electronix.ru/forum/index.php?showt...amp;#entry71028Вот пример записи в еепром из даташита на Atmega128: Assembly Code Examplein r16, SREG ; store SREG value cli ; disable interrupts during timed sequence sbi EECR, EEMWE ; start EEPROM write sbi EECR, EEWE out SREG, r16 ; restore SREG value (I-bit) C Code Examplechar cSREG; cSREG = SREG; /* store SREG value */ /* disable interrupts during timed sequence */ __disable_interrupt(); EECR |= (1<<EEMWE); /* start EEPROM write */ EECR |= (1<<EEWE); SREG = cSREG; /* restore SREG value (I-bit) */
Сообщение отредактировал quarter2 - Feb 9 2011, 08:17
|
|
|
|
|
Feb 9 2011, 08:34
|

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

|
QUOTE (quarter2 @ Feb 9 2011, 09:48)  проблема есть реально, если на время записи в еепром не запрещать прерывание - данные могут записаться некорректно. Неверно. Прерывания во время записи не мешают. QUOTE (quarter2 @ Feb 9 2011, 09:48)  Вот пример записи в еепром из даташита на Atmega128: Покажите, где тут запрещение прерываний на время записи, где тут миллисекунды запрещенных прерываний? QUOTE (quarter2 @ Feb 9 2011, 09:48)  после того как начал использовать вышеприведённый файл - проблема устранилась. Все вменяемые компиляторы имеют встроенные инструменты делать то же самое без этого файла.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 9 2011, 09:00
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 23-12-05
Пользователь №: 12 594

|
Цитата(Сергей Борщ @ Feb 9 2011, 10:34)  Неверно. Прерывания во время записи не мешают. Покажите, где тут запрещение прерываний на время записи The following example shows how this can be used to avoid interrupts during the timed EEPROM write sequence /* disable interrupts during timed sequence */ __disable_interrupt(); EECR |= (1<<EEMWE); /* start EEPROM write */ EECR |= (1<<EEWE); SREG = cSREG; /* restore SREG value (I-bit) */Есть ни что иное, как запрещение прерываний на время окончания записи в ЕЕПРОМ Время записи в ЕЕПРОМ в Atmega128 согласно тому же даташиту: Цитата(Сергей Борщ @ Feb 9 2011, 10:34)  где тут миллисекунды запрещенных прерываний? Table 2. EEPROM Programming TimeEEPROM Write (from CPU) = 8.5 ms Цитата(Сергей Борщ @ Feb 9 2011, 10:34)  Все вменяемые компиляторы имеют встроенные инструменты делать то же самое без этого файла. В IAR EWAVR 5.50 в файле eeprom.s90 нет запрещений прерываний на время ожидания окончания записи в ЕЕПРОМ
Сообщение отредактировал quarter2 - Feb 9 2011, 09:06
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|