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

 
 
> Вопрос по прерываниям, __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
 
Start new topic
Ответов
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
abcdefg
сообщение Mar 20 2007, 16:15
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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
Paramon
сообщение Mar 21 2007, 07:57
Сообщение #7


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

Группа: Участник
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #9


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

Группа: Участник
Сообщений: 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
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 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
Сообщение #11


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

Группа: Участник
Сообщений: 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

Сообщений в этой теме
- Paramon   Вопрос по прерываниям   Mar 19 2007, 13:44
- - Paramon   Цитата(kichkine @ Mar 19 2007, 14:39) Из ...   Mar 19 2007, 15:00
|- - Сергей Борщ   Цитата(Paramon @ Mar 21 2007, 15:43) Я бы...   Mar 21 2007, 18:35
|- - Paramon   Цитата(Сергей Борщ @ Mar 21 2007, 18:35) ...   Mar 22 2007, 08:13
|- - Сергей Борщ   Цитата(Paramon @ Mar 22 2007, 07:13) вчер...   Mar 22 2007, 12:22
|- - Paramon   Цитата(Сергей Борщ @ Mar 22 2007, 12:22) ...   Mar 22 2007, 12:59
|- - Paramon   Цитата(Paramon @ Mar 22 2007, 12:59) У ме...   Mar 23 2007, 09:05
- - bzx   Цитата(abcdefg @ Mar 20 2007, 17:14) Да э...   Mar 20 2007, 23:02


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:08
Рейтинг@Mail.ru


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