|
Обработчик прерываний |
|
|
|
 |
Ответов
|
Feb 5 2014, 18:38
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971

|
Всем спасибо за ответы, все таки разобрался  Цитата(Xenia @ Jan 24 2014, 06:48)  Разве тут есть проблема? Используете память в качестве хранилища данных обычным образом. В обработчике прерывания записываете в эту память данные, а основная программа эти данные оттуда забирает или сразу использует.
В тех случаях, когда может возникнуть накладка (в прерывании получаем новые данные прежде, чем основная программа успела воспользоваться старыми), то организуете (опять же в памяти) стек FIFO (первым пришел, первым вышел). Тогда в обработчике запихиваете данные в стек, а в основной программе забираете данные оттуда.
Короче говоря, никакой особой специфики, вытекающей из работы с прерываниями, здесь нет, а имеет место типичный случай асинхронного обмена данными между двумя потоками. Просто я вспомнил, что модули подпрограмм на ассемблере и Си отдельно компилятся и потом объединяются линковщиком в один модуль, как в асме для PC. Технология передачи данных между подпрограммами, либо через стек или специальные регистры AX или DX:AX Цитата(kolobok0 @ Jan 24 2014, 14:11)  ну почему же либо? стэк(если писюк то это та же озу), регистры, озу(конкретный адресс), внешняя переферия. Стек и регистры понятно откуда известны, но откуда компилятор узнает адрес ОЗУ в другом модуле например? Не совсем очевидно, если вспомнить, что модули отдельно компилируются.
|
|
|
|
|
Feb 6 2014, 19:39
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(lexa12 @ Feb 5 2014, 22:38)  ...Стек...понятно откуда известны, но откуда компилятор узнает адрес ОЗУ в другом модуле например? ..модули отдельно компилируются. если Вам про стэк понятно, то откуда вопрос про ОЗУ?  Или по другому. Если стэк программный - то откуда Вы знаете что он тот же самый в "разных модулях"? Наверное соглашение между модулями. А кто, простите Вам запрещает зафиксировать ячейку данных по определённому адресу и свято соблюдать это в любых модулях программы?
|
|
|
|
|
Feb 7 2014, 17:12
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971

|
Цитата(kolobok0 @ Feb 6 2014, 23:39)  зафиксировать ячейку данных по определённому адресу каким образом, чтобы компилятор ее не использовал для своих целей? в этом собственно и вопрос, а то как Вы ответили - взять любой адрес со всеми вытекающими... например у меня в обработчике используется R16, можно ли его залочить и уже не сохранять в стеке при вызове обработчика для экономии времени?
|
|
|
|
|
Feb 7 2014, 18:26
|
Гуру
     
Группа: Свой
Сообщений: 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. Оптимизацию включать пробовали?
|
|
|
|
|
Feb 8 2014, 07:25
|
Частый гость
 
Группа: Свой
Сообщений: 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)  ну почему же либо? стэк(если писюк то это та же озу), регистры, озу(конкретный адресс), внешняя переферия. Мне вот это очень понравилось, для Вас переферия МК и "регистры" разные понятия
|
|
|
|
|
Feb 8 2014, 08:49
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 6-10-10
Из: Санкт-Петербург
Пользователь №: 59 971

|
Цитата(_Артём_ @ Feb 8 2014, 11:44)  Если на асме - ничего не даст. Попробуйте на Си написать с включённой оптимизацией. Может и не понадобится асм. Обработчик простейший - пара команд. Если убрать сохранение в стек при вызове, получится то что надо. Писать на Си с оптимизацией наверно будет тоже самое. Я думаю может как-нибудь проинициализировать переменную в основной программе как "regvar", но настораживает, что нельзя залочить регистр в компиляторе.
|
|
|
|
|
Feb 8 2014, 10:07
|
Частый гость
 
Группа: Свой
Сообщений: 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. В этом то сейчас и вопрос как его залочить
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|