Как написать сборку ISR в программе на C (AVR)? - PullRequest
1 голос
/ 16 апреля 2011

Исходя из моего другого вопроса, Помогите оптимизировать этот код C (AVR)? :) , я только что понял, что на самом деле не знаю, как реализовать ISR в сборке в моей C-программе. Я гуглил, но не нашел ничего слишком полезного.

По сути, я хочу настроить все остальное в моем C-проекте (включая регистры для запуска прерывания), но я хочу, чтобы прерывание выполняло некоторый код сборки, который я написал.

Я использую AVR studio 6 в Windows, если это поможет. Мне сказали, что мне нужно использовать .s файлы, но кроме этого я не совсем уверен, что делать. Является ли базовая структура следующей?

#include <avr\io.h> 
TIMER1_COMPA_vect:
    ; assembly instructions here

Если я хочу, чтобы сборка запускалась при срабатывании прерывания TIMER1_COMPA_vect (это имя ISR в C). Или я совсем не в курсе? Каков основной шаблон того, что мне нужно сделать? Или, если это глупый вопрос, есть ли ссылка, где я могу найти дополнительную информацию?

1 Ответ

1 голос
/ 16 апреля 2011

Язык «Искусство ассемблера» (Рэндалл Хайд) состоит из двух глав, посвященных ISR (17-я и 18-я, в частности, разделы 18.5 и 18.6 могут вам помочь). Коротко:

  1. Перейдите к IVT (таблице векторов прерываний) и измените его с вашим сегментом ISR и смещением, сохранив старые значения
  2. Вы должны создать программу TSR (прервать и остаться резидентом), чтобы ваш ISR оставался резидентным в памяти, даже когда пользователь закрывает окно
  3. Не забудьте вызвать старый ISR после завершения работы (это называется цепочкой прерываний)
  4. ваш ISR должен быть повторно введен (так что если прерывание сработает снова, когда ваш ISR все еще работает, компьютер не взорвется;))

Кстати, вы можете получить pdf копию этой великой книги здесь

...