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

 
 
 
Reply to this topicStart new topic
> Прерывание на ASM, IAR AVR interrupt
_Артём_
сообщение Feb 6 2011, 18:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Всем привет!

Нужно написать обработчик прерывания на ассемблере (остальная программа на Си);
процессор - AtxMega256A3, компилятор - IAR.

Нет ли у кого-нибудь примера кода?

Спасибо.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 7 2011, 11:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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 будет аналогично, кроме, естественно имён векторов.
Go to the top of the page
 
+Quote Post
GDI
сообщение Feb 7 2011, 12:00
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Почитайте в хэлпе как асм код встраивать в Си, точно не помню, нужно что-то типа
Код
#pragma asm+
... тут асм код...
#pragma asm-


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 7 2011, 13:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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 на ошбки не ругается, но работает как-то криво - явно что-то неправильно...
Но вот что?


Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 7 2011, 14:29
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(_Артём_ @ Feb 7 2011, 15:33) *
IAR на ошбки не ругается, но работает как-то криво - явно что-то неправильно...
Но вот что?

Попробуйте оттрассировать. (точку останова на каждый элемент таблицы векторов).
Благо конкретно в этой ситуации можно и симулятором воспользоваться.
Go to the top of the page
 
+Quote Post
andk
сообщение Feb 7 2011, 14:59
Сообщение #6


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

Группа: Свой
Сообщений: 199
Регистрация: 17-12-04
Из: Миасс
Пользователь №: 1 519



Все таки напишите, что нужно получить в итоге.
Сишный код у последних компиляторов вполне себе компактный, может асм и не нужен вовсе?
По приведенному выше коду:
Откуда уверенность, что сишный компилятор оставил вам достаточно стека?
совет от defunct +1
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 7 2011, 16:39
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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) *
Откуда уверенность, что сишный компилятор оставил вам достаточно стека?

Не то чтобы уверенность, я о стеке и не подумал...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 7 2011, 17:28
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(_Артём_ @ Feb 7 2011, 19:39) *
Попытаюсь описать что не так...

Программа компилится без ошибок, вроде бы правильно работает.
Но есть странности:
при установке точки прерывания симулятор (AVRStudio) открывает не мой исходный файл а окно Disasemdler-а, что странно и неудобно.
Не то чтобы уверенность, я о стеке и не подумал...

А Вы стек вообще-то определили? Команды push и pop без стека не работают и не удивительно , что открывается Disasm. Компилятор не проверяет логику.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 7 2011, 18:19
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Feb 7 2011, 19:28) *
А Вы стек вообще-то определили? Команды push и pop без стека не работают и не удивительно , что открывается Disasm. Компилятор не проверяет логику.


Стек определил. С запасом... потому и задумывался о нём...

Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 7 2011, 20:34
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(_Артём_ @ Feb 7 2011, 21:19) *
Стек определил. С запасом... потому и задумывался о нём...

Что значит "...С запасом.. " Оределяют только "вершину" стека -обычно старший адрес общего адресного пространства SRAM, далее , как вершина айсберга, всё что туда вкладывается стремится к нулю. Так , что Ваш запас - это весь объём SRAM. C начального адреса SRAM обычно записываются все необходимые данные , которые Вы используете в программе. Так вот - нет ли перехлёста данных "впихнутых" в SRAM c данными записанными Вашей программой по тем же адресам SRAM


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
V_G
сообщение Feb 8 2011, 06:01
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



У вас прерывание единственное?
Когда несколько прерываний с разными приоритетами, нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса. Я на выходах из прерываний использую такую конструкцию:
Код
    POP        r16
    CLI
    POP        ac_tmp
    OUT        CPU_SREG,ac_tmp;restore Status register
    RETI
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2011, 13:32
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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?
ПРерывание произойдёт и что будет?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 8 2011, 13:54
Сообщение #13


Гуру
******

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



Цитата(V_G @ Feb 8 2011, 09:01) *
нужно учитывать возможность вклинивания более приоритетного прерывания между извлечением статуса из стека и восстановлением статуса.
При входе в прерывание аппаратно сбрасывается флаг разрешения прерывания (речь, надеюсь, про AVR). В очень редких случаях, бывает, прерывания разрешают, но - только, если это действительно нужно и без этого не обойтись (обычно, такое - результат неправильного построения вычислительного процесса). Поэтому, никакого "вклинивания" при выполнении процедуры прерывания - нет (посему: команда CLI - абсолютно излишния). Да, и если - есть, то как это приведёт к "нехорошим" последствиям в интервале "между извлечением статуса из стека и восстановлением статуса" ?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2011, 14:11
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Палыч @ Feb 8 2011, 15:54) *
При входе в прерывание аппаратно сбрасывается флаг разрешения прерывания (речь, надеюсь, про AVR).


В xmega не сбрасывается.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 10 2011, 14:24
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



В завершении темы выкладываю пример проекта на Си с asm-функцией прерывания.
Может пригодится кому-нибудь или кто покритикует...Прикрепленный файл  test_asm.rar ( 146.62 килобайт ) Кол-во скачиваний: 141
Go to the top of the page
 
+Quote Post

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

 


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


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