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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Interrupt i IAR
prottoss
сообщение Oct 22 2005, 23:46
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Nikola Kirov @ Oct 23 2005, 01:58)
Да так.
Если не сложно не мешаи в ету тему.


Как скажешь. Я больше не буду участвовать ни в одной твоей теме.


--------------------
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 23 2005, 12:49
Сообщение #32


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



To Nikola - все понятно, тогда думаю дальше blush.gif . Не может быть, что Ваша задача не решаема.

To VladislavS
Цитата(VladislavS @ Oct 20 2005, 18:11)
Цитата(BVU @ Oct 20 2005, 11:49)
в классических системах это делается немного по другому.  В теле Вашего прерывания должен находиться переход (call) на адрес расположенный в оперативной памяти (строго фиксировано), где размещается еще один вызов функции (переключение на функцию) адресс которой подставляется (настраивается в данный момент времени) в зависимости от логики работы программы. Так Вы получаете расширение ресурсов своего преравания.  Что касается скорости выполнения, то здесь теряется время на дополнительный вызов. На asm это реализуется просто, как это сделать корректно на 'C' - надо подумать.


С AVR это не пройдет, так как адресное пространство кода и данных раздельное и сегменты кода во flash лежать обычно.
*



Уточните, пожалуйста, вообще нет в системе команд - команд записи в сегменты кода или из-за того, что программа обычно во flash?
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 23 2005, 13:05
Сообщение #33


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Цитата(Nikola Kirov @ Oct 22 2005, 15:18)
Вот пример в коде
Код
#pragma vector =  USART_TXC_vect
__interrupt void TXCinterrupt()               /// Так должно въиглядет само перервание
{
     pActiv_TXinterrupt_Function();   /// ето указател к функции
}


А сами функции должно въиглядет так
Код
#pragma vector =  XXXXXXXX_vect
__interrupt Funct1()
{
-----------
}
#pragma vector =  XXXXXXXX_vect
__interrupt Funct2()
{
-----------
}


сам указател декларирован так
Код
void (__interrupt * pActiv_TXinterrupt_Function)(void);




Нашел решение которъие работает.
pActiv_TXinterrupt_Function въизъиваю из асме.
для Funct1,Funct2 ползуюс из векторов перервании которъие не ползуется в програме.
Но ето мне не нравится и не хватют свободнъие вектор прерервания
*


А зачем переключаемые 8 функций подвешивать на вектора прерываний? Как без asm-вызова обойтись - подумать еще надо cranky.gif . А вектора прерываний зачем использовать - разве нельзя указатель на обычную функцию? Или Вы таким образом хотите сохранить те регистры, которые внутри этих функций - непонятно cranky.gif
Go to the top of the page
 
+Quote Post
Nikola Kirov
сообщение Oct 23 2005, 14:11
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 4-11-04
Из: Болгария
Пользователь №: 1 050



Цитата
А зачем переключаемые 8 функций подвешивать на вектора прерываний? Как без asm-вызова обойтись - подумать еще надо cranky.gif . А вектора прерываний зачем использовать - разве нельзя указатель на обычную функцию? Или Вы таким образом хотите сохранить те регистры, которые внутри этих функций - непонятно cranky.gif


Прочтите внимателно что написал DXP когда обяснял разница между нормалние функции и функции перервания.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Oct 23 2005, 16:59
Сообщение #35


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Vic1 @ Oct 23 2005, 15:49)
Уточните, пожалуйста, вообще нет в системе команд - команд записи в сегменты кода или из-за того, что программа обычно во flash?
*


Команда записи в сегмент кода есть - процессор сам себя может перепрограммировать. Но, так как адресные пространства данных и кода раздельные, у контроллера в штатных режимах работы данные в RAM, а код во FLASH. AVR это вам не ARM, зато намного проще.
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 24 2005, 04:35
Сообщение #36


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Цитата(dxp @ Oct 21 2005, 10:05)
Прошу прощения, что вмешиваюсь. Тут все не так и все гораздо проще. IAR делит регистры на local и scratch. Первые - это регистры, которые в вызываемой функции компилятор может использовать только предварительно

....

Все остальные "финты ушами" вроде вызова функции через асмовую вставку - это быть самому себе злобным буратиной. В этом случае, когда возникнет прерывание и управление будет передано в функцию, которая не является ISR (т.к. компилятор не знает, что функция эта вызвана асинхронно по отношению к потоку управления), в этой функции будут без ограничений использоваться scratch регистры, значения которых, не будут сохранены (с последующим восстановлением). В результате огребете гору замечательных и труднопресказуемых глюков. Оно надо? Никогда ни в коем случае так делать нельзя. Если уж вызываете функцию без сохранения контекста компилятором, то делайте это сами руками. Такая необходимость может возникнуть при написании переключателя конткестов в вытесняющий RTOS.
*



Nikola, я имела в виду, то что подчеркнуто в QUOTE
Т.е. если уж Вы все-равно вынуждены использовать asm-вставку, то и делайте в ней сохранение регистров.
Плюсы - избавитесь от 8 вынужденно занимаемых векторов прерываний и число сохраняемых регистров при вызове по указателю можно уменьшить (т.е. сохраняются только те регистры, которые действительно используются в 8 переключаемых функций).
Минусы - необходимо знать, какие именно это регистры.

Это, если решение Вашей задачи на Си окажется невозможным.
Go to the top of the page
 
+Quote Post
Nikola Kirov
сообщение Oct 24 2005, 11:04
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 4-11-04
Из: Болгария
Пользователь №: 1 050



Решил проблем.
В фаила \src\template\cfgm16.xcl увеличил -D_..X_INTVEC_SIZE

Ето конечно в целости очен некрасивое решение но никто не предложил более приемливъи вариант.
Go to the top of the page
 
+Quote Post
Nikola Kirov
сообщение Oct 26 2005, 17:09
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 4-11-04
Из: Болгария
Пользователь №: 1 050



Никто ли не знает как ето написат как то нормалнее?
Go to the top of the page
 
+Quote Post
Old1
сообщение Dec 20 2005, 10:32
Сообщение #39


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(Nikola Kirov @ Oct 20 2005, 02:04) *
Необходимо переключат функции которъе въизъиваются на перервание.
Сделал
extern __near void (* pTX_InterruptFunction)(void);

а сам interrupt
Код
#pragma vector = USART_TXC_vect
__interrupt void TXCinterrupt(void)
{
 pTX_InterruptFunction();
}


все работает но вот такое генерируется
Код
  \   00000000   93BA               ST      -Y, R27
  \   00000002   93AA               ST      -Y, R26
  \   00000004   938A               ST      -Y, R24
  \   00000006   93FA               ST      -Y, R31
  \   00000008   93EA               ST      -Y, R30
  \   0000000A   923A               ST      -Y, R3
  \   0000000C   922A               ST      -Y, R2
  \   0000000E   921A               ST      -Y, R1
  \   00000010   920A               ST      -Y, R0
  \   00000012   937A               ST      -Y, R23
  \   00000014   936A               ST      -Y, R22
  \   00000016   935A               ST      -Y, R21
  \   00000018   934A               ST      -Y, R20
  \   0000001A   933A               ST      -Y, R19
  \   0000001C   932A               ST      -Y, R18
  \   0000001E   931A               ST      -Y, R17
  \   00000020   930A               ST      -Y, R16
  \   00000022   B78F               IN      R24, 0x3F
    54            pTX_InterruptFunction();
  \   00000024   ....               LDI     R26, LOW(pTX_InterruptFunction)
  \   00000026   ....               LDI     R27, (pTX_InterruptFunction) >> 8
  \   00000028   91ED               LD      R30, X+
  \   0000002A   91FC               LD      R31, X
  \   0000002C   9509               ICALL
    55          }
  \   0000002E   BF8F               OUT     0x3F, R24
  \   00000030   9109               LD      R16, Y+
  \   00000032   9119               LD      R17, Y+
  \   00000034   9129               LD      R18, Y+
  \   00000036   9139               LD      R19, Y+
  \   00000038   9149               LD      R20, Y+
  \   0000003A   9159               LD      R21, Y+
  \   0000003C   9169               LD      R22, Y+
  \   0000003E   9179               LD      R23, Y+
  \   00000040   9009               LD      R0, Y+
  \   00000042   9019               LD      R1, Y+
  \   00000044   9029               LD      R2, Y+
  \   00000046   9039               LD      R3, Y+
  \   00000048   91E9               LD      R30, Y+
  \   0000004A   91F9               LD      R31, Y+
  \   0000004C   9189               LD      R24, Y+
  \   0000004E   91A9               LD      R26, Y+
  \   00000050   91B9               LD      R27, Y+
  \   00000052   9518               RETI

И как видно перервание становится медленое.
А мои функции совсем простенкие,такое сохранение регистров не нужно.
Явно что то не так делаю. Как правилно ето делат?

2 Nikola Kirov Если эта тема вам еще интересна, то сохранение регистров можно отключить используя квалификатор __raw при определении функции обработчика прерывания, или если он не поддерживается вашей версией компилятора можно еще попробовать __noreturn, правда сохранение регистров (если это требуется) тогда ложится на вас...
Go to the top of the page
 
+Quote Post

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

 


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


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