a9d 0 11 ноября, 2012 Опубликовано 11 ноября, 2012 (изменено) · Жалоба Эта версия еще не проверенна полностью. В ней могут содержаться ошибки. IAR.zip Реализовано только #define scmRTOS_ISRW_TYPE TISRW #define scmRTOS_CONTEXT_SWITCH_SCHEME 0 Версия IAR 8.10.4 Конфиги Debug (Release в конечном продукте доделаю) Device: CC2510F32 Code model: Near Data model: Large XData Stack Stack Idata size 0x10 Stack Xdata size 0x01F4 (можно меньше, один фиг после старта системы эта секция не используется) Основной проблемой при портировании был стек. Здесь он поистине паскуден. Указатель 8битный, можно использовать только первые 256 байт и то первые 0x21(по умолчанию) байт используются в служебных целях. Итого доступно 223 байта. Да еще он растет в неправильную сторону. За основу был взят порт для AVR. Т.к. он ближе всех по духу. Используется раздельный стек. Ввиду специфичности стека пришлось изменить шаблон процесса. Создание процесса выглядит так //--------------------------------------------------------------------------- // // Process types // typedef OS::process<OS::pr0, 120> TProc1; typedef OS::process<OS::pr1, 160> TProc2; typedef OS::process<OS::pr2, 120> TProc3; template<> void TProc1::exec(); template<> void TProc2::exec(); template<> void TProc3::exec(); //--------------------------------------------------------------------------- // // Process objects // __idata uint8_t r_stack0[32]; __idata uint8_t r_stack1[32]; __idata uint8_t r_stack2[32]; TProc1 Proc1((uint8_t)(&r_stack0)); TProc2 Proc2((uint8_t)(&r_stack1)); TProc3 Proc3((uint8_t)(&r_stack2)); //--------------------------------------------------------------------------- По другому я не знаю как выделить место в секции ISTACK. Это можно переделать? Вторая проблема это адреса виртуальных регистров и их количество. А также количество банков. #define SPXH 0x11 #define SPXL 0x10 #define VB 0x20 //see lnk51ew_cc2510F32.xcl #define V0 0x08 #define V1 0x09 #define V2 0x0A #define V3 0x0B #define V4 0x0C #define V5 0x0D #define V6 0x0E #define V7 0x0F Я не знаю как выдрать нужные дефайны из файла линковщика перед сборкой. Знаю только как заполучить нужную информацию во время работы. В контексте сохраняются следующие регистры: IEN0,SPX,VB,V0..V7,R0,R1,R6,R7,PSW,B,SP,A,DPTR Сохранение контекста нужно переделать. Только, что дошло как сохранить A и DPTR без использование стека. Указатель SPX (софтварный стек iar) указывает на свободное место сразу за контекстом процесса. Это правильно ? Потестил на функциях с большим количество параметров и ничего не портилось. ЗЫ: Походу для 8051 есть только две RTOS. Это FreeRTOS и ScmRTOS. Изменено 11 ноября, 2012 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 11 ноября, 2012 Опубликовано 11 ноября, 2012 · Жалоба Нашел идеального кандидата на программное прерывание. Это прерывание WDT таймера. Его можно вызвать программно когда WDT выключен или включен. При этом настройки WDT никак на него не влияют, если не используется режим таймера. Один минус. У этого прерывание низший приоритет. И порой приходится ждать ну очень долго. Насколько нужно повысить приоритет?? У программного прерывания должен быть высший приоритет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 11 ноября, 2012 Опубликовано 11 ноября, 2012 · Жалоба Насколько нужно повысить приоритет?? У программного прерывания должен быть высший приоритет ? Приоритет прерывания переключения контекста должен иметь самый низкий приоритет, из прерываний использующих сервисы Оси. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 12 ноября, 2012 Опубликовано 12 ноября, 2012 · Жалоба Нашел причину почему не работает TISRW_SS. IAR активно игнорит #define INLINE _Pragma("inline=forced") Даже если включить оптимизацию, то он все равно иногда игнорирует эту директиву. Переписал все под дефайны. Так получилось сделать TISRW_SS гарантированно инлайновым. Но IAR подкинул еще одну свинку. Перед тем как выполнить конструктор TISRW_SS, даже при условии что он инлайновый, в софтварный стек сохраняются регистры. В конструкторе переключаются стеки. И на выходе начинается восстановление регистров из софтварного стека, но софтварный стек уже переключили. Поэтому востанавливается мусор. В документации не нашел ни слова как запретить такое пповидение. В TISRW_SS удается максимум переключить хардварный стек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 13 ноября, 2012 Опубликовано 13 ноября, 2012 (изменено) · Жалоба IAR.zip Переделал сохранение и восстановление контекста. Теперь это происходит более правильно. Доделал TISRW_SS. Реализовал переключение контекста с помощью прерывания. Должно работать на CC2510,CC2511,CC1110,CC1111. В будущем думаю еще доделать CC2530,CC2531,CC2540. Особенности. TISRW_SS - переключает только хардварный стек. В качестве программного прерывания используется прерывание таймера WDT_VECTOR. Для определения текущего стека в прерывании добавил хук os_context_current_get. По другому узнать адрес текущего контекста просто невозможно. При использовании программного прерывания, в контексте сохраняются все регистры. Также процедуры сохранения/восстановления более увесистые. Начать с прямой передачи управления было верным решением. Так хоть узнал как все должно работать. Программная передача мне попила много крови благодаря особенностям архитектуры и оптимизации кода в IAR. Изменено 13 ноября, 2012 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 17 ноября, 2012 Опубликовано 17 ноября, 2012 (изменено) · Жалоба Release __2510.zip Не портирован только пример Debug. Я этим функционалом не пользуюсь. Порт проверен на CC2510F32 и CC2530F256. Должен работать на всех mcu 8051 c code model: Large & Banked. Микроконтроллеров 8051 с расширенной адресацией у меня нет. Но в теории там только DPTR 24битный. Можно использовать только один банк регистров и до 16ти(включительно) виртуальных регистров. Я думаю еще раз переписать код. Пришла идея как сделать код более стандартным. Ведь можно выделить нужного размера стек а после от него оттяпать кусок. Изменено 17 ноября, 2012 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a9d 0 19 ноября, 2012 Опубликовано 19 ноября, 2012 (изменено) · Жалоба __2510.zip Последний релиз. Портированы все примеры. Поддерживаются все MCU 8051 только с code model: Near и Banked. Для использование нужно: 1) В настройках проекта указать количество виртуальных регистров 2) Выбрать стек XStack 3) Указать максимальный размер istack. Т.е. 0xFF - 0x21. 4) В файле конфигурации проекта указать количество виртуальных регистров, смещение на регистр VB, адрес расположения istack (смотрим в даташите на микроконтроллер) PS Порт совсем свежий, мог что-то и упустить. Не забываем учитывать риски. Изменено 19 ноября, 2012 пользователем a9d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться