|
SWI, Смысл использовать SWI |
|
|
|
 |
Ответов
(15 - 29)
|
Aug 30 2007, 07:56
|
Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997

|
Цитата(alexander55 @ Aug 30 2007, 08:30)  Ошибаетесь. потому-то и поставил вопрос!(Может я ошибаюсь?) Я его (FIQ) пользую к таймеру.(Нужны относительно стабильные по времени выборки). Правда пока не наткнулся ни на какие казусы(кроме времени реакции на FIQ). IRQ использую еще с 3 таймерами (там точности большой ненадо) SWI использую из основного цикла. Будьте добры поясните, а то может быть мне жизнь раем показалась и надо переделать проект. Спасибо!
|
|
|
|
|
Mar 20 2013, 11:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Подниму тему. Вопрос "если у меня идет выполнение IRQ и в процессе выполнения приходит SWI" остался. Что будет, если из IRQ вызвать SWI? По приоритетам у SWI низший, то есть как бы не должен вытеснять IRQ. Но если вызов SWI блокирующий, то как тогда дальше быть? Нашел похожую по проблеме тему, но там тоже суть не раскрыта.
|
|
|
|
|
Mar 23 2015, 20:29
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185

|
Здравствуйте! Выше много писали о том, что во время IRQ происходит SWI. На AVR я реализовал многозадачность, с использованием псевдо-SWI (аппаратное прерывание, как программное - INT0). Моя идея заключалась в том, чтобы при выполнении IRQ, в обработчике надо быть, как можно меньше времени. Только сохранение данных и инициация работы кода, который занимает нечто промежуточное по важности, между фоновой задачей (которая может длиться до единиц миллисекунд) и обработчиками прерываний. То есть, обработать данные надо, как можно скорее, но не в ущерб аппаратным прерываниям. Для этого обработчик IRQ инициирует SWI. После завершения IRQ вызывается SWI, который является диспетчером обработчиков, вызывающим наиболее важный обработчик. SWI, перед вызовом обработчика, разрешает прерывания, что позволит без ущерба отрабатывать обработчикам аппаратных прерываний. А как это работает на ARM? Правильно ли я понял, что если в обработчике IRQ вызвать SWI, то его код будет отработан после того, как отработают все IRQ? Если во время работы SWI произойдёт IRQ, управление сразу же будет передано IRQ, а по его завершению вернётся обратно в SWI? Спасибо!
|
|
|
|
|
Mar 24 2015, 06:39
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(SII @ Mar 24 2015, 11:52)  FIQ не запрещается икакими прерываниями, кроме самого FIQ. Да, наверное. Писал по памяти. Цитата(SII @ Mar 24 2015, 11:52)  И, кстати говоря, SWI уже давным-давно переименована в SVC. Переименована в Cortex-M. А у ТС вроде как Classical ARM, а там не переименована.
|
|
|
|
|
Mar 24 2015, 08:43
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(jcxz @ Mar 24 2015, 09:39)  Переименована в Cortex-M. А у ТС вроде как Classical ARM, а там не переименована Переименована для всех, когда был введён унифицированный синтаксис языка ассемблера для систем команд ARM и Thumb -- а он распространяется не только на новые процессоры, но и на старые тоже, хотя в старой документации, естественно, остаётся мнемоника SWI. Однако ассемблер и компилятор используют SVC для любых процессоров (SWI можно применять в ассемблере, если включить использование старого синтаксиса, насчёт компилятора не знаю -- может, только SVC позволяет).
|
|
|
|
|
Mar 24 2015, 12:41
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185

|
Цитата(jcxz @ Mar 24 2015, 07:47)  Неправильно. SWI - синхронное исключение, а не обычное асинхронное внешнее прерывание типа IRQ или FIQ. Т.е. - собственно для Вас это как простой вызов функции (с переключением CPU в привилегированный режим). Если процессор перед вызовом SWI находился в режиме IRQ, то произойдёт переключение в режим SWI (с запретом FIQ и IRQ). При выходе из режима SWI произойдёт возврат в режим IRQ. SWI например может использоваться для вызова функций OS из непривилегированного режима (режима пользователя). А как тогда оформить код, который активируется в прерывании, но исполняется после всех прерываний? То есть менее приоритетный, чем прерывания, но более приоритетный, чем фоновая задача. Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|