Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SWI в ST91x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Usatyj
Есть примеры использования SWI в LPC.
Это выглядит примерно следующим образом:

Объявление SWI обработчика
#pragma swi_number=0x10
__swi __arm u16 SWI_Func(int a)
{
return 0;
}

Вызов
SWI_Func(1);

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

Но когда я вызываю SWI в ST911, - выполняется инструкция SWI 0x10, после чего меня выкидывает
в SWI_Handler(), файла 91x_it.c из stdlib. Вообщем вместо обработки конкретной функции, у меня
просто возникает SWI прерывание.

Что я делаю не так?
xelax
Цитата(Usatyj @ Aug 13 2008, 11:40) *
Но когда я вызываю SWI в ST911, - выполняется инструкция SWI 0x10, после чего меня выкидывает
в SWI_Handler(), файла 91x_it.c из stdlib. Вообщем вместо обработки конкретной функции, у меня
просто возникает SWI прерывание.


И правильно делает.

swi это программное прерывание. Для того чтобы его использовать необходимр указать адрес обработчика в таблице векторов прерываний. Вызывается это прерывание как раз инструкцией swi.
SWI это не особенность lpc или st, это функционал arm как архитектуры.
Укажите в таблице векторов свой обработчик вместо библиотечного SWI_Handler() он и будет выполнятся при вызове команды swi.
Usatyj
Цитата(xelax @ Aug 13 2008, 13:12) *
Укажите в таблице векторов свой обработчик вместо библиотечного SWI_Handler() он и будет выполнятся при вызове команды swi.


А как его написть? Если бы SWI функции не имели параметров, тогда проблем бы не было. Но насколько я понимаю из за тго что функции могут иметь различные прототимы, придется писать на Assembler-e, нет ли гденибудь уже готового обработчика, нормально работающего?

P.S. Спасибо за ответ.
T2_Dragon
в Keil есть хороший пример работы с SWI
Artem_Petrik
SWI функция только одна, и обработчик у нее один. Вам нужно написать такой обработчик, который будет смотреть на параметр, с которым была вызвана SWI, и в зависимости от его значения вызывать ту или иную функцию
типа
switch(parameter)
{
...
case 10: SWI_10_handler();
...
}

и подменить этим stdlib-овкую функцию SWI_Handler()
aaarrr
Цитата(Artem_Petrik @ Aug 15 2008, 00:58) *
Вам нужно написать такой обработчик, который будет смотреть на параметр, с которым была вызвана SWI, и в зависимости от его значения вызывать ту или иную функцию

Только это не параметр, а содержимое comment field SWI. А у SWI-функции могут быть и настоящие параметры, типа: __swi(0) int func(int, int);

Пример от ARM вместе с asm-handler'ом:
Нажмите для просмотра прикрепленного файла
Usatyj
Большое спасибо, коллеги, за Ваши ответы. Вы мне очень помогли.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.