Перейти к содержанию
    

scmRTOS 4.0 порт SoC CC2510 (MCU 8051)

Эта версия еще не проверенна полностью. В ней могут содержаться ошибки.

 

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.

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел идеального кандидата на программное прерывание.

 

Это прерывание WDT таймера. Его можно вызвать программно когда WDT выключен или включен. При этом настройки WDT никак на него не влияют, если не используется режим таймера.

 

Один минус. У этого прерывание низший приоритет. И порой приходится ждать ну очень долго. Насколько нужно повысить приоритет?? У программного прерывания должен быть высший приоритет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько нужно повысить приоритет?? У программного прерывания должен быть высший приоритет ?

Приоритет прерывания переключения контекста должен иметь самый низкий приоритет, из прерываний использующих сервисы Оси.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел причину почему не работает TISRW_SS. IAR активно игнорит

#define INLINE _Pragma("inline=forced")

 

Даже если включить оптимизацию, то он все равно иногда игнорирует эту директиву.

 

Переписал все под дефайны. Так получилось сделать TISRW_SS гарантированно инлайновым. Но IAR подкинул еще одну свинку. Перед тем как выполнить конструктор TISRW_SS, даже при условии что он инлайновый, в софтварный стек сохраняются регистры. В конструкторе переключаются стеки. И на выходе начинается восстановление регистров из софтварного стека, но софтварный стек уже переключили. Поэтому востанавливается мусор.

 

В документации не нашел ни слова как запретить такое пповидение.

 

В TISRW_SS удается максимум переключить хардварный стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IAR.zip

 

Переделал сохранение и восстановление контекста. Теперь это происходит более правильно.

Доделал TISRW_SS.

Реализовал переключение контекста с помощью прерывания.

 

 

Должно работать на CC2510,CC2511,CC1110,CC1111.

В будущем думаю еще доделать CC2530,CC2531,CC2540.

 

Особенности.

TISRW_SS - переключает только хардварный стек.

 

В качестве программного прерывания используется прерывание таймера WDT_VECTOR. Для определения текущего стека в прерывании добавил хук os_context_current_get. По другому узнать адрес текущего контекста просто невозможно.

 

При использовании программного прерывания, в контексте сохраняются все регистры. Также процедуры сохранения/восстановления более увесистые.

 

 

Начать с прямой передачи управления было верным решением. Так хоть узнал как все должно работать. Программная передача мне попила много крови благодаря особенностям архитектуры и оптимизации кода в IAR.

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Release

__2510.zip

 

Не портирован только пример Debug. Я этим функционалом не пользуюсь.

 

 

Порт проверен на CC2510F32 и CC2530F256.

 

Должен работать на всех mcu 8051 c code model: Large & Banked.

Микроконтроллеров 8051 с расширенной адресацией у меня нет. Но в теории там только DPTR 24битный.

 

Можно использовать только один банк регистров и до 16ти(включительно) виртуальных регистров.

 

Я думаю еще раз переписать код. Пришла идея как сделать код более стандартным. Ведь можно выделить нужного размера стек а после от него оттяпать кусок.

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__2510.zip

 

Последний релиз. Портированы все примеры.

 

 

Поддерживаются все MCU 8051 только с code model: Near и Banked.

 

Для использование нужно:

1) В настройках проекта указать количество виртуальных регистров

2) Выбрать стек XStack

3) Указать максимальный размер istack. Т.е. 0xFF - 0x21.

4) В файле конфигурации проекта указать количество виртуальных регистров, смещение на регистр VB, адрес расположения istack (смотрим в даташите на микроконтроллер)

 

PS Порт совсем свежий, мог что-то и упустить. Не забываем учитывать риски.

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...