|
|
  |
Прерывание на ASM, IAR AVR interrupt |
|
|
|
Feb 7 2011, 11:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(_Артём_ @ Feb 6 2011, 21:48)  Всем привет!
Нужно написать обработчик прерывания на ассемблере (остальная программа на Си); процессор - AtxMega256A3, компилятор - IAR.
Нет ли у кого-нибудь примера кода?
Спасибо. А что именно Вам непонятно. Код COMMON INTVEC ORG INT0_vect rjmp loader Код ORG TIMER2_OVF_vect rjmp TimeOutFor485 PS: Прошу прощения, это для обычной меги. Думаю, что для xmega будет аналогично, кроме, естественно имён векторов.
|
|
|
|
|
Feb 7 2011, 13:33
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(SasaVitebsk @ Feb 7 2011, 13:53)  А что именно Вам непонятно. Код COMMON INTVEC ORG INT0_vect rjmp loader Код ORG TIMER2_OVF_vect rjmp TimeOutFor485 PS: Прошу прощения, это для обычной меги. Думаю, что для xmega будет аналогично, кроме, естественно имён векторов. Попробовал подключить к проекту файл: Код NAME sst_spi #include "ATxmega256A3.h" COMMON INTVEC ORG TCE1_OVF_vect RJMP tce1_ovf_handler RSEG CODE; This code is relocatable, RSEG tce1_ovf_handler: push r16 in r16,0x3f push r16 push r17 pop R17 pop r16 out 0x3f,r16 pop r16 reti END IAR на ошбки не ругается, но работает как-то криво - явно что-то неправильно... Но вот что?
|
|
|
|
|
Feb 7 2011, 16:39
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Попытаюсь описать что не так... Программа компилится без ошибок, вроде бы правильно работает. Но есть странности: при установке точки прерывания симулятор (AVRStudio) открывает не мой исходный файл а окно Disasemdler-а, что странно и неудобно. Цитата(andk @ Feb 7 2011, 16:59)  Все таки напишите, что нужно получить в итоге. В итоге хотелось бы: прерывание должно быть написано в asm-файле, остальная программа на Си. И чтобы всё это работало... Цитата(andk @ Feb 7 2011, 16:59)  Сишный код у последних компиляторов вполне себе компактный, может асм и не нужен вовсе? Можно и обойтись, но что-то слишком медленный код у IAR получился. Цитата(andk @ Feb 7 2011, 16:59)  Откуда уверенность, что сишный компилятор оставил вам достаточно стека? Не то чтобы уверенность, я о стеке и не подумал...
|
|
|
|
|
Feb 8 2011, 13:32
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(V_G @ Feb 8 2011, 08:01)  У вас прерывание единственное? Когда несколько прерываний с разными приоритетами, нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса. Я на выходах из прерываний использую такую конструкцию: Код POP r16 CLI POP ac_tmp OUT CPU_SREG,ac_tmp;restore Status register RETI Зачем CLI? ПРерывание произойдёт и что будет?
|
|
|
|
|
Feb 8 2011, 13:54
|

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

|
Цитата(V_G @ Feb 8 2011, 09:01)  нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса. При входе в прерывание аппаратно сбрасывается флаг разрешения прерывания (речь, надеюсь, про AVR). В очень редких случаях, бывает, прерывания разрешают, но - только, если это действительно нужно и без этого не обойтись (обычно, такое - результат неправильного построения вычислительного процесса). Поэтому, никакого "вклинивания" при выполнении процедуры прерывания - нет (посему: команда CLI - абсолютно излишния). Да, и если - есть, то как это приведёт к "нехорошим" последствиям в интервале "между извлечением статуса из стека и восстановлением статуса" ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|