Нажмите для просмотра прикрепленного файла
Реализовано только
#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));
//---------------------------------------------------------------------------
//
// 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
#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.