реклама на сайте
подробности

 
 
> SWI в ST91x, Как вызвать SWI в ST.
Usatyj
сообщение Aug 13 2008, 07:40
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 1-02-07
Пользователь №: 24 931



Есть примеры использования 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 прерывание.

Что я делаю не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
xelax
сообщение Aug 13 2008, 09:12
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(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.
Go to the top of the page
 
+Quote Post
Usatyj
сообщение Aug 13 2008, 12:00
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 1-02-07
Пользователь №: 24 931



Цитата(xelax @ Aug 13 2008, 13:12) *
Укажите в таблице векторов свой обработчик вместо библиотечного SWI_Handler() он и будет выполнятся при вызове команды swi.


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

P.S. Спасибо за ответ.
Go to the top of the page
 
+Quote Post
T2_Dragon
сообщение Aug 14 2008, 05:26
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 2-05-06
Пользователь №: 16 670



в Keil есть хороший пример работы с SWI
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Aug 14 2008, 20:58
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



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

и подменить этим stdlib-овкую функцию SWI_Handler()
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 14 2008, 21:37
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

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

Пример от ARM вместе с asm-handler'ом:
Прикрепленный файл  swi.rar ( 8.33 килобайт ) Кол-во скачиваний: 131
Go to the top of the page
 
+Quote Post
Usatyj
сообщение Aug 18 2008, 13:14
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 1-02-07
Пользователь №: 24 931



Большое спасибо, коллеги, за Ваши ответы. Вы мне очень помогли.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 19:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016