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

 
 
> Обработчик прерываний
lexa12
сообщение Jan 16 2014, 16:34
Сообщение #1


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

Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971



Добрый вечер! Помогите пожалуйста разобраться со следующим вопросом - как правильно написать обработчик прерывания на ассемблере с передачей параметров (переменной) в основную программу?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
lexa12
сообщение Feb 5 2014, 18:38
Сообщение #2


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

Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971



Всем спасибо за ответы, все таки разобрался sm.gif

Цитата(Xenia @ Jan 24 2014, 06:48) *
Разве тут есть проблема? Используете память в качестве хранилища данных обычным образом. В обработчике прерывания записываете в эту память данные, а основная программа эти данные оттуда забирает или сразу использует.

В тех случаях, когда может возникнуть накладка (в прерывании получаем новые данные прежде, чем основная программа успела воспользоваться старыми), то организуете (опять же в памяти) стек FIFO (первым пришел, первым вышел). Тогда в обработчике запихиваете данные в стек, а в основной программе забираете данные оттуда.

Короче говоря, никакой особой специфики, вытекающей из работы с прерываниями, здесь нет, а имеет место типичный случай асинхронного обмена данными между двумя потоками.


Просто я вспомнил, что модули подпрограмм на ассемблере и Си отдельно компилятся и потом объединяются линковщиком в один модуль, как в асме для PC. Технология передачи данных между подпрограммами, либо через стек или специальные регистры AX или DX:AX

Цитата(kolobok0 @ Jan 24 2014, 14:11) *
ну почему же либо?
стэк(если писюк то это та же озу), регистры, озу(конкретный адресс), внешняя переферия.

Стек и регистры понятно откуда известны, но откуда компилятор узнает адрес ОЗУ в другом модуле например? Не совсем очевидно, если вспомнить, что модули отдельно компилируются.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 6 2014, 19:39
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(lexa12 @ Feb 5 2014, 22:38) *
...Стек...понятно откуда известны, но откуда компилятор узнает адрес ОЗУ в другом модуле например? ..модули отдельно компилируются.


если Вам про стэк понятно, то откуда вопрос про ОЗУ? sm.gif

Или по другому.
Если стэк программный - то откуда Вы знаете что он тот же самый в "разных модулях"?

Наверное соглашение между модулями.
А кто, простите Вам запрещает зафиксировать ячейку данных по определённому адресу и свято соблюдать это в любых модулях программы?
Go to the top of the page
 
+Quote Post
lexa12
сообщение Feb 7 2014, 17:12
Сообщение #4


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

Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971



Цитата(kolobok0 @ Feb 6 2014, 23:39) *
зафиксировать ячейку данных по определённому адресу


каким образом, чтобы компилятор ее не использовал для своих целей?
в этом собственно и вопрос, а то как Вы ответили - взять любой адрес со всеми вытекающими...

например у меня в обработчике используется R16, можно ли его залочить и уже не сохранять в стеке при вызове обработчика для экономии времени?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 7 2014, 18:26
Сообщение #5


Гуру
******

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



Цитата(lexa12 @ Feb 7 2014, 19:12) *
например у меня в обработчике используется R16, можно ли его залочить и уже не сохранять в стеке при вызове обработчика для экономии времени?
Нет, нельзя.
Можно залочить регистры с R4 по R15. В свойствах проекта C/C++ compiler - Code - Number of registers to lock.

Цитата(lexa12 @ Feb 7 2014, 19:12) *
обработчика для экономии времени?
Сколько вы там сэкономите? 10 тактов ? Возьмите МК по-быстрее (хоть xmega на 32 Mhz) или алгоритм пересмотрите.

P.S. Оптимизацию включать пробовали?
Go to the top of the page
 
+Quote Post
lexa12
сообщение Feb 8 2014, 07:25
Сообщение #6


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

Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971



Цитата(_Артём_ @ Feb 7 2014, 22:26) *
P.S. Оптимизацию включать пробовали?

Если обработчик написан на асме, зачем включать оптимизацию и что она даст?


Цитата(kolobok0 @ Feb 8 2014, 01:42) *
Или Вы считаете, что команды привязки адресов служат только для формирования таблицы прерываний?


Вы используете странные понятия.
Что в Вашем понимании "команды привязки адресов" ? Звучит как абракадабра. Если это какие то директивы или настройки компилятора, так и пишите.


Цитата(kolobok0 @ Jan 24 2014, 14:11) *
ну почему же либо?
стэк(если писюк то это та же озу), регистры, озу(конкретный адресс), внешняя переферия.


Мне вот это очень понравилось, для Вас переферия МК и "регистры" разные понятия sm.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2014, 07:44
Сообщение #7


Гуру
******

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



Цитата(lexa12 @ Feb 8 2014, 09:25) *
Если обработчик написан на асме, зачем включать оптимизацию и что она даст?
Если на асме - ничего не даст. Попробуйте на Си написать с включённой оптимизацией. Может и не понадобится асм.
Go to the top of the page
 
+Quote Post
lexa12
сообщение Feb 8 2014, 08:49
Сообщение #8


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

Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971



Цитата(_Артём_ @ Feb 8 2014, 11:44) *
Если на асме - ничего не даст. Попробуйте на Си написать с включённой оптимизацией. Может и не понадобится асм.


Обработчик простейший - пара команд. Если убрать сохранение в стек при вызове, получится то что надо.

Писать на Си с оптимизацией наверно будет тоже самое.

Я думаю может как-нибудь проинициализировать переменную в основной программе как "regvar", но настораживает, что нельзя залочить регистр в компиляторе.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 8 2014, 09:27
Сообщение #9


Гуру
******

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



Цитата(lexa12 @ Feb 8 2014, 10:49) *
Я думаю может как-нибудь проинициализировать переменную в основной программе как "regvar", но настораживает, что нельзя залочить регистр в компиляторе.



Код
__regvar __no_init unsigned short IntCounter @ 14;


Go to the top of the page
 
+Quote Post
lexa12
сообщение Feb 8 2014, 10:07
Сообщение #10


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

Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971



Цитата(_Артём_ @ Feb 8 2014, 13:27) *
Код
__regvar __no_init unsigned short IntCounter @ 14;

Как написано в руководстве по компилятору есть т.н. "Scratch registers" и "Preserved registers". А требуется как раз доступ к "Scratch register" недоступный __regvar.
В этом то сейчас и вопрос как его залочить sm.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- lexa12   Обработчик прерываний   Jan 16 2014, 16:34
- - _Артём_   Цитата(lexa12 @ Jan 16 2014, 18:34) как п...   Jan 16 2014, 19:00
|- - lexa12   Цитата(_Артём_ @ Jan 16 2014, 23:00) Для ...   Jan 16 2014, 19:18
|- - _Артём_   Цитата(lexa12 @ Jan 16 2014, 21:18) Меня ...   Jan 16 2014, 20:40
- - kolobok0   Цитата(lexa12 @ Jan 16 2014, 20:34) ..пер...   Jan 17 2014, 20:59
|- - lexa12   Цитата(kolobok0 @ Jan 18 2014, 00:59) заф...   Jan 24 2014, 01:33
|- - kolobok0   Цитата(lexa12 @ Jan 24 2014, 05:33) ...ли...   Jan 24 2014, 10:11
- - Xenia   Цитата(lexa12 @ Jan 16 2014, 20:34) Добры...   Jan 24 2014, 02:48
- - piroman   Я всегда в EWAVR вот такой скелет использую. Тольк...   Jan 24 2014, 06:36
- - jcxz   Цитата(lexa12 @ Feb 6 2014, 00:38) Стек и...   Feb 6 2014, 02:57
||- - _Артём_   Цитата(lexa12 @ Feb 8 2014, 12:07) В этом...   Feb 8 2014, 13:39
||- - jcxz   Цитата(_Артём_ @ Feb 8 2014, 19:39) Компи...   Feb 9 2014, 14:14
||- - _Артём_   Цитата(jcxz @ Feb 9 2014, 17:14) Надо-ж...   Feb 9 2014, 15:01
||- - jcxz   Цитата(_Артём_ @ Feb 9 2014, 21:01) Хоть ...   Feb 10 2014, 08:24
||- - _Артём_   Цитата(jcxz @ Feb 10 2014, 12:24) А ничег...   Feb 10 2014, 09:33
|- - kolobok0   Цитата(lexa12 @ Feb 8 2014, 11:25) ...Что...   Feb 9 2014, 22:33
|- - lexa12   Цитата(kolobok0 @ Feb 10 2014, 02:33) Вы ...   Feb 10 2014, 19:04
- - kolobok0   Цитата(lexa12 @ Feb 7 2014, 21:12) ...что...   Feb 7 2014, 21:42


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

 


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


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