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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопрос по прерываниям, __int во время __swi Подскажите !!!
Paramon
сообщение Mar 19 2007, 13:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



У меня вопрос:
1) при выполнении __swi возможна ли работа простых __int ?
2) Если невозможна, то как сбросить влаг программного прерывания (__swi), не выходя из самой функции __swi, чтобы разрешить INTы во время её выполнения ? Или что можно ещё сделать.
/проверять флаги __INTов нежелательно/
/ __fiq не предлагать, он уже занят /

(ADuC7024 и AT91SAM7S256)

с уважением PARAMON !

Сообщение отредактировал Paramon - Mar 19 2007, 14:24
Go to the top of the page
 
+Quote Post
kichkine
сообщение Mar 19 2007, 14:39
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-11-06
Из: Kiev
Пользователь №: 21 933



Цитата
1) при выполнении __swi возможна ли работа простых __int ?

Из ARM Architecture Reference Manual, инструкция SWI:

if CondidtionPassed(<cond>) then
R14_svc = address of SWI instruction + 4
SPSR_svc = CPSR
CPSR[5:0] = 0b010011; enter Supervisor mode
CPSR[7] = 1; disable IRQ -- прерывания запрещены
PC = 0x08

Цитата
2) Если невозможна, то как сбросить влаг программного прерывания (__swi), не выходя из самой функции __swi, чтобы разрешить INTы во время её выполнения ? Или что можно ещё сделать.


Прерывания запрещены и процессор в режиме Supervisor. Но ведь ничто не мешает нам разрешить прерывания в рег. CPSR (бит I).

Сообщение отредактировал kichkine - Mar 19 2007, 14:40
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 19 2007, 15:00
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(kichkine @ Mar 19 2007, 14:39) *
Из ARM Architecture Reference Manual, инструкция SWI:

if CondidtionPassed(<cond>) then
R14_svc = address of SWI instruction + 4
SPSR_svc = CPSR
CPSR[5:0] = 0b010011; enter Supervisor mode
CPSR[7] = 1; disable IRQ -- прерывания запрещены
PC = 0x08
Прерывания запрещены и процессор в режиме Supervisor. Но ведь ничто не мешает нам разрешить прерывания в рег. CPSR (бит I).


Спасибо огромное kichkine! Хорошо бы ещё незапутаться с вызовом __SWI из разных мест (приложение под ARTX) /будем смотреть и ставить флаг выполнения самого __swi/
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Mar 20 2007, 16:15
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(kichkine @ Mar 19 2007, 14:39) *
Из ARM Architecture Reference Manual, инструкция SWI:
Прерывания запрещены и процессор в режиме Supervisor. Но ведь ничто не мешает нам разрешить прерывания в рег. CPSR (бит I).


А как бы красиво оформить обратную ситуацию - в прерывании возникает необходимость запустить при выходе из прерывания "фоновую задачу"? Фоновой задаче назначить какой-нибудь вектор и выставлять соответствующий бит в VICSoftInt?
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 20 2007, 17:03
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(abcdefg @ Mar 20 2007, 16:15) *
А как бы красиво оформить обратную ситуацию - в прерывании возникает необходимость запустить при выходе из прерывания "фоновую задачу"? Фоновой задаче назначить какой-нибудь вектор и выставлять соответствующий бит в VICSoftInt?



Извините не понял высказывания.

Мне требуется такая ситуация:
__swi может быть очень длинным с ветвлением, при его выполнении итак должны работать фоновые задачи (функции). При этом должны работать таймеры!!! и другие устр-ва по прерываниям т.е __int - работает,а __fiq - работает всегда(выбор из таблицы в ШИМ). (Из супервизора НАДО выйти, но непрекращая __swi). из __swi(он у меня вектор) выходить как из обычной вызываемой ф-и.
вход в __swi(он содержит набор своих векторов на каждую процедуру), из любого(даже загружаемого модуля), ну почти как в BIOS
/вот было бы здорово/

С уважением PARAMON!
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Mar 20 2007, 17:14
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(Paramon @ Mar 20 2007, 17:03) *
Извините не понял высказывания.

С уважением PARAMON!


Да это не относится к вашему вопросу, просто в тему вложенных прерываний.
В упрощенном варианте - хочу из обработчика прерывания irq при выходе попадать в обработчик софтового прерывания (который разрешает вложенность прерываний)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 20 2007, 21:52
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(abcdefg @ Mar 20 2007, 16:14) *
В упрощенном варианте - хочу из обработчика прерывания irq при выходе попадать в обработчик софтового прерывания (который разрешает вложенность прерываний)


Код
#define CONTEXT_SWITCH_INT      VIC_SW

#define    RaiseContextSwitch()                        \
    do                                              \
    {                                               \
        VICSoftInt = (1<<CONTEXT_SWITCH_INT);       \
        VICIntEnable = (1<<CONTEXT_SWITCH_INT);     \
    }                                               \
    while (0) // set flag and enable interrupt
#endif
Оно?

Цитата(Paramon @ Mar 20 2007, 16:03) *
(Из супервизора НАДО выйти, но непрекращая __swi).
Вы путаетесь в понятиях. Вам нужно переключить режим процессора из Supervisor в System. Как это сделать - трудно посоветовать, не зная каким компилятором вы пользуетесь. При этом можно одновременно разрешить прерывания.
Цитата(Paramon @ Mar 20 2007, 16:03) *
вход в __swi(он содержит набор своих векторов на каждую процедуру), из любого(даже загружаемого модуля), ну почти как в BIOS
В IAR это примерно так и реализовано. Ветвление по номеру swi компилятор выполняет сам. Ищите в описании компилятора по ключевому слову swiю


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
bzx
сообщение Mar 20 2007, 23:02
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(abcdefg @ Mar 20 2007, 17:14) *
Да это не относится к вашему вопросу, просто в тему вложенных прерываний.
В упрощенном варианте - хочу из обработчика прерывания irq при выходе попадать в обработчик софтового прерывания (который разрешает вложенность прерываний)

Компилятор не важен. Это делается через стек. При выходе из irq в стек заносишь указатель, на который хочешь попасть.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 21 2007, 07:57
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(Сергей Борщ @ Mar 20 2007, 21:52) *
Код
#define CONTEXT_SWITCH_INT      VIC_SW

#define    RaiseContextSwitch()                        \
    do                                              \
    {                                               \
        VICSoftInt = (1<<CONTEXT_SWITCH_INT);       \
        VICIntEnable = (1<<CONTEXT_SWITCH_INT);     \
    }                                               \
    while (0) // set flag and enable interrupt
#endif
Оно?

Вы путаетесь в понятиях. Вам нужно переключить режим процессора из Supervisor в System. Как это сделать - трудно посоветовать, не зная каким компилятором вы пользуетесь. При этом можно одновременно разрешить прерывания.
В IAR это примерно так и реализовано. Ветвление по номеру swi компилятор выполняет сам. Ищите в описании компилятора по ключевому слову swiю


(Из супервизора НАДО выйти, но непрекращая __swi). - это просто неправильная фраза, никто никуда сейчас не выходит - мы еще работаем. Извините.
/работаю с Keil uVision3 V3.20a с родным комполятором/
Надо испытать под ARTX:

/ARTX config/ (кусок)
/*--------------------------- os_switch_tasks -------------------------------*/

void os_switch_tasks (P_TCB p_new) __swi (0) {
/* Switch to next task (identified by "p_new"). Saving old and restoring */
/* new context is written in assembly (module: Swi_ARTX.s) */

/////// тут что-то типа:
t_Command=os_tsk_create(Command,0); //что-то нужное
///////


os_runtask->full_ctx = FALSE;
os_runtask = p_new;
p_new->state = RUNNING;
#if (OS_ROBIN == 1)
os_tsk_robin = p_new;
#endif
/* Tsk_Unlock */
OS_UNLOCK();
} /* end of os_switch_tasks */

//то самое нужное
void Command(void) __task
{
.... //какой - то код
}

при этом не трогать никакие переключения режимов ядра.
и про разрешение прерывания забыь?
сработает?

А как бы красиво оформить обратную ситуацию - в прерывании возникает необходимость запустить при выходе из прерывания "фоновую задачу"? -вы наверное это имели ввиду?

Извините если что не так! с уважением PARAMON!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 21 2007, 11:00
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Paramon @ Mar 21 2007, 06:57) *
Надо испытать под ARTX:
...
при этом не трогать никакие переключения режимов ядра.
и про разрешение прерывания забыь?
сработает?
Так и не понял чего вы хотели выразить этими фразами и причем тут приведенный вами кусок кода.

Цитата(Paramon @ Mar 21 2007, 06:57) *
А как бы красиво оформить обратную ситуацию - в прерывании возникает необходимость запустить при выходе из прерывания "фоновую задачу"? -вы наверное это имели ввиду?
Что я имел ввиду, то я и отцитировал:
Цитата
В упрощенном варианте - хочу из обработчика прерывания irq при выходе попадать в обработчик софтового прерывания (который разрешает вложенность прерываний)

P.S. Давайте вы попробуете спокойно, обстоятельно, подробно (как для первокласника) и без восклицаний изложить: что вы хотите получить, что вы для этого пытаетесь (если) сделать и что не получается/не понятно.

P.P.S. Старайтесь оставлять в цитатах только самое необходимое для понимания ваших ответов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 21 2007, 13:48
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(Сергей Борщ @ Mar 21 2007, 11:00) *
Так и не понял чего вы хотели выразить этими фразами и причем тут приведенный вами кусок кода.

Что я имел ввиду, то я и отцитировал:
P.S. Давайте вы попробуете спокойно, обстоятельно, подробно (как для первокласника) и без восклицаний изложить: что вы хотите получить, что вы для этого пытаетесь (если) сделать и что не получается/не понятно.

P.P.S. Старайтесь оставлять в цитатах только самое необходимое для понимания ваших ответов.


требуется собрать макет устройства, пока на базе макеток:
A) AT91SAM7256 (USB,COM,SD/MMC)
cool.gif ADuC7024 (ADC,PWM)
с ADuC всё решено.
с AT91SAM7 сделать возможным загрузку короткого кода из SD/MMC в RAM и его запуск.
Проблемы:
1) работа с SD/MMS (файловая система) - решаю сейчас.(нужно компактное решение)
2) организация вызова необходимых функций из флеш AT91SAM7,запущенным в RAM кодом.
При всём этом обмен между AT91 и ADuC должен быть стабильным.
За основу выбран ARTX/Keil/
Буду рад советам.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 21 2007, 15:39
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Ага, теперь понятнее.
Цитата(Paramon @ Mar 21 2007, 12:48) *
1) работа с SD/MMS (файловая система) - решаю сейчас.(нужно компактное решение)
Поищите по форуму. Я искал недавно и понял что вариантов немного: EFSL, uC/FS. Я смотрел еще вот это: FAT File System Module. С виду довольно компактно, но функции нижнего уровня придется писать самому. Мне за день удалось прикрутить к AT45DB321, вроде даже заработало, но глубоко не проверял. Можете посмотреть как вариант (там есть один баг, должно быть ST_WORD(tbl+510, 0xAA55); вместо *(WORD*)(tbl+510) = 0xAA55;, автору я уже отписал).
Цитата(Paramon @ Mar 21 2007, 12:48) *
2) организация вызова необходимых функций из флеш AT91SAM7,запущенным в RAM кодом.
При всём этом обмен между AT91 и ADuC должен быть стабильным.
Тут видятся два пути: первый - swi, но каждая swi-функция в самом начале должна переключать процессор обратно в system mode и разрешать прерывания, а в самом конце делать обратное переключение. Как оформляются swi в Кейле я не знаю (пользую IAR), но в документации должно быть.
второй путь: зачем swi? Почему бы в фиксированной области флеш не разместить таблицу указателей на функции и вызывать функции через эту таблицу? прерывания запрещаться не будут вообще.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 21 2007, 16:43
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(Сергей Борщ @ Mar 21 2007, 15:39) *
Ага, теперь понятнее.
Поищите по форуму. Я искал недавно и понял что вариантов немного: EFSL, uC/FS. Я смотрел еще вот это: FAT File System Module. С виду довольно компактно, но функции нижнего уровня придется писать самому. Мне за день удалось прикрутить к AT45DB321, вроде даже заработало, но глубоко не проверял. Можете посмотреть как вариант (там есть один баг, должно быть ST_WORD(tbl+510, 0xAA55); вместо *(WORD*)(tbl+510) = 0xAA55;, автору я уже отписал).
Тут видятся два пути: первый - swi, но каждая swi-функция в самом начале должна переключать процессор обратно в system mode и разрешать прерывания, а в самом конце делать обратное переключение. Как оформляются swi в Кейле я не знаю (пользую IAR), но в документации должно быть.
второй путь: зачем swi? Почему бы в фиксированной области флеш не разместить таблицу указателей на функции и вызывать функции через эту таблицу? прерывания запрещаться не будут вообще.


По поводу файловой системы - понятно. Сейчас уже реализую.
Я был по этой ссылке. Баг на определение системных секторов? Незнал ! Большое спасибо!
По поводу __swi - мне казалось удобнее и универсальнее. Код который приведён мной - НЕВЕРНЫЙ!
Наткнулся на пример, правда для LPC21xx. Там есть формирование записей таблиц для этого.
Пока непонятно.Вечером буду разбираться.
Если это будет то,что надо - выложу, иначе последую вашему примеру!

С уважением PARAMON!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 21 2007, 18:35
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Paramon @ Mar 21 2007, 15:43) *
Я был по этой ссылке. Баг на определение системных секторов? Незнал ! Большое спасибо!
В функции mkfs. Он проявляется только на процессорах которые умеют обращаться по указателю только на выровненные адреса (ARM в частности).


Цитата(Paramon @ Mar 21 2007, 15:43) *
По поводу __swi - мне казалось удобнее и универсальнее.
Но учтите, что на ветвление по номеру swi тоже расходуется время и еще неизвестно что будет быстрее - доступ через таблицу или swi. А с учетом разрешения вложенных прерываний в режиме supervisor - точно быстрее будет через таблицу.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Paramon
сообщение Mar 22 2007, 08:13
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Цитата(Сергей Борщ @ Mar 21 2007, 18:35) *
В функции mkfs. Он проявляется только на процессорах которые умеют обращаться по указателю только на выровненные адреса (ARM в частности).
Но учтите, что на ветвление по номеру swi тоже расходуется время и еще неизвестно что будет быстрее - доступ через таблицу или swi. А с учетом разрешения вложенных прерываний в режиме supervisor - точно быстрее будет через таблицу.


вчера испытывал пример с таблицами - не вышло.
получилось следующее:
//пример. даже не пример а проба
#include <ARTX.H>
OS_TID t_Func1; //
OS_TID t_Func2; //
OS_TID t_Func3;
unsigned int counter;
int par1;
int par2;
void Func2 (void) __task;
void Func3 (void) __task;

void SWI_Handler(int set) __swi(8) //set - потом будет номером ф-ии
//__swi работает короткое время, только для вызова
{
if(set==1) par1++;
if((par1 > par2))
{
t_Func2 = os_tsk_create (Func3,2); // start task 2
}
else if(par1==0xFFFFFFFF)
{
par1=0;
par2=0;
};
}
//
void Func3(void) __task
{
if(par2>=par1) os_tsk_delete_self(); //удаление ф-ии "Func3"
while(1)
{
os_itv_set(50);
os_itv_wait();
};
}
// * Task 1
void Func1 (void) __task {
t_Func1 = os_tsk_self ();
t_Func2 = os_tsk_create (Func2,2);

while (1) {
SWI_Handler(1);
os_dly_wait (1);
};
}
// * Task 2
void Func2 (void) __task {
while (1) {
SWI_Handler(2);
os_dly_wait (5);
}
}

void init(void) __task
{
t_Func1=os_tsk_create(Func1,0);
os_itv_set(5);
os_itv_wait();
os_tsk_delete_self(); //удаление модуля инициализации "init"
}
void main(void)
{
os_sys_init(init); //инициализация модулей
}

через SWI_Handler(2); вызывается ф-я Func3, причём много раз.
после свего исполнения каждый экземпляр удаляется.
Думаю то, что мне надо. Можно с любой точки вызвать свой экземпляр.
под ARTX они работают параллельно.
Пока незнаю как быть с передачей параметров, без глобальных описаний???????
Спасибо вам всем огромное, особенноо вам Сергей Борщ !!!
Пока я это всё непереварю, навряд ли осмелюсь задавать вопросы.

С уважением PARAMON!!!

Сообщение отредактировал Paramon - Mar 22 2007, 08:18
Go to the top of the page
 
+Quote Post

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

 


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


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