S_U (16.09.2008 16:13, просмотров: 129) ответил Сергей Борщ на Примерно так:
Сергей спасибо, но я наверно не совсем корректно сформулировал вопрос. Речь идет о прерывании с переходом в режим Supervisor - ассемблерная команда SWI. В IAR Compiler reference приводится пример
#pragma swi_number=0x23
__swi __arm int swi_function(int a, int b);
где swi_function судя по всему должен быть сам обработчик а в int a или int b передоваемый параметр (0x23) для идентификации прерывания.
Далее IAR рекомендует:
All interrupt functions and software interrupt handlers must be installed into the vector table.
unsigned int install_handler(unsigned int *vector, unsigned int function)
{
unsigned int vec, old_vec;
vec = ((function - (unsigned int)vector - 8) >> 2);
old_vec = *vector;
vec |= 0xea000000; /* add opcode for B instruction */
*vector = vec;
old_vec &= ~0xea000000;
old_vec = ( old_vec << 2 ) + (unsigned int)vector + 8;
return(old_vec);
}
Но здесь я что то не понимаю
SWITAB Holds the software interrupt vector table.
Причем сегмент SWITAB линкер размещает в CODE.
Что у меня только усугубляет полную разруху в голове.