Привет! А кто мешает сделать таблицу самому ассемблерной вставкой? Адрес PC получаем вызвав функцию, вызывающую стек. А дальше IJMP в помощь с таблицами меток.
Код:
|
//возвращает в переменной адрес PC следующей команды за вызовом функции (он так же остается в R24:R25
void GetAddressPC(unsigned int* add)
{
asm volatile ( "movw r30,r24\n" //адрес переменной
"pop r25\n" //старший разряд
"pop r24\n" //младший разряд
"push r24\n" //возврат в стек для правильного
"push r25\n" //возврата из подпрограммы
"std Z+1, r25\n" //запоминание в переменной PCH
"st Z, r24\n"); //запоминание в переменной PCL
}
#define cmd1 0x30
#define cmd2 0x31
#define cmd14 'A'
#define cmd15 'E'
switch (temp1)
{
unsigned int add;
case cmd14:
//действие
break;
case cmd15:
//действие
break;
default:
if (temp1 ‹ 0x30) // min command
{
goto End;
}
if (temp1 › 0x31) // max command
{
goto End;
}
temp1 -= 0x30;
temp1 *=2;
temp1 += XXXXXX; //смещение к началу таблицы
GetAddressPC(&add);
// вставка ассемблерная с переходами
asm volatile(
.... // temp1+ *add= Z
"IJMP\n"
// сама таблица переходов
"RJMP caseCMD1\n"
"RJMP caseCMD2\n");
caseCMD1:
//действие
goto end;
caseCMD2:
//действие
goto end;
end:
break;
} |
с подобным столкнулся в фирмваре PICKIT2 ну и модифицировал для AVR-ки (правда пишу не полный код т.к. сам не дописал)