|
Прерывания в Atmel 8535 |
|
|
|
Jun 9 2008, 20:28
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(artemm @ Jun 9 2008, 10:56)  Если разрешить прерывания в обработчике какого-нить прерывания то будет шопопало. Если в обработчике прерывания I2C разрешить прерывания, то МК зависает. (по крайней мере у меня) Будет происходить не "шопопало", а "шонаписано". Если МК зависает, это значит, что обработчик написан неправильно, и не более того. Наверное стоило не делать поспешный вывод, что вложенные прерывания невозможны, а проанализировать ситуацию и найти ошибку. У меня во многих устройствах выполняется sei в обработчике - и никаких "шопопало", работает как часы. Подозреваю, что "шопопало" возникало из-за превышения дозволенного уровня вложенности обработчиков...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jun 10 2008, 12:39
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(defunct @ Jun 9 2008, 15:42)  И будут преведы, да еще и на ассемблере.  Потом попробуйте к такой программе прилепить новую функциональность. (например еще один протокол обмена). Преведы бывают хоть на ассемблере, хоть на с хоть на чём! Если руки не оттуда. Функциональность программы для МК - гм, изначально несколько более строго задаётся, чем функциональность программы для большого компьютера. Брать куски из одного проекта для другого - да. Расширять функциональность - это если плохое ТЗ. Цитата(defunct @ Jun 9 2008, 15:42)  почему многие так и рвутся получить проблему (через одно место работая с прерываниями)? А потом эту проблему исправлять опять же через то же самое место?! Потому что многих жмёт пространство и время. Про коробочку размером с "крону" написано. Про время: попробуйте сделать хоть генератор текста для врезания в видеосигнал - будете считать циклы процессора. С карандашом в руках, совсем несложно.
|
|
|
|
|
Jun 10 2008, 14:22
|

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

|
Цитата(Maik-vs @ Jun 10 2008, 15:39)  Преведы бывают хоть на ассемблере, хоть на с хоть на чём! Если руки не оттуда. На ассемблере преведов на порядок больше, и руки тут не при чем. Зерно примитивов меньше - текста больше, сложность программы выше. Программа получается ДУБОВАЯ - практически не подлежащая вразумительному расширению. Цитата Функциональность программы для МК - гм, изначально несколько более строго задаётся, чем функциональность программы для большого компьютера. Брать куски из одного проекта для другого - да. У кого как, мне важнее time-to-market и возможность заливать в одно и тоже железо разное ПО. Постепенно наращивать функциональность приходится - допустим выпустят новый Сепам или МРЗС и еще какую-то байду, добавить их к уже имеющейся прошивке нет проблем, и все управляющие устройства сразу умеют с ними работать. Надо только обновить прошивку. За примерами далеко ходить не надо - DVD/CD-RW - поддержка дисков разных производителей часто добавляется уже после выхода привода в продажу; Wireless AP / Router'ы - добавление различных режимов и служб тоже происходит после. и т.п. Цитата Расширять функциональность - это если плохое ТЗ. Невозможность расширения функциональности - это мертвое устройство. Т.к. через полгода придут конкуретны, с более дешевым девайсом и чуть более широкой функциональностью, и ваше устройство никто брать не будет. Цитата Потому что многих жмёт пространство и время. Пространство меня не жмет. Хоть в медном тазу можно клепать, лишь бы крепилось на дин-рейку. А про время, я вас умаляю. Ассемблеру с C не тягяться в этом. Улыбнуло. ;> Цитата Про коробочку размером с "крону" написано. Про время: попробуйте сделать хоть генератор текста для врезания в видеосигнал - будете считать циклы процессора. С карандашом в руках, совсем несложно. Мне не нужен генератор врезки текста, но например в IP router я смогу при необходимости легко добавить telnet консольку или http сервер или фильтр какой-нить хитроумный.
|
|
|
|
|
Jun 10 2008, 15:17
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(defunct @ Jun 10 2008, 18:22)  На ассемблере преведов на порядок больше, и руки тут не при чем. Зерно примитивов меньше - текста больше, сложность программы выше. Программа получается ДУБОВАЯ - практически не подлежащая вразумительному расширению. У кого как, мне важнее time-to-market и возможность заливать в одно и тоже железо разное ПО. Постепенно наращивать функциональность приходится - допустим выпустят новый Сепам или МРЗС и еще какую-то байду, добавить их к уже имеющейся прошивке нет проблем, и все управляющие устройства сразу умеют с ними работать. Надо только обновить прошивку. А я наоборот как наполучал преведы на С (для АВР), так на асм перешёл. И С для АВР забыл как страшный сон (для компьютера конечно на С++ пишу). У АВР 80% работы - это работа с USART, CAN, SPI, таймерами, портами др. устройсвами. А в этом С только мешает. Напишешь на С и понимаешь, что написал программу на ассемблере с помощью С. Всё равно приходится весь получившийся ассемблерный текст контролировать. А насчёт расширяемости: 1. Я сначала USB-HID написал и обращение через него к специфическим задачам. 2. Самопрограммирование через USB. 3. Всякие модбасы и др. USARTовские дела. 4. Mass Storage. 5. FAT (при работе без подключения к компьютеру). 6. SLEEP (работа от ионистора). 7. CAN. Всё это работает в разных проектах в разных вариантах. В т.ч. и всё это в одном устройстве (на AT90CAN128). И прошивки без проблем через интернет обновляются самими пользователями. Причём они даже об этом иногда не знают. Я всё это к тому, что и на асме и на С можно как плохо, так и хорошо писать.
|
|
|
|
|
Jun 11 2008, 14:56
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(777777 @ Jun 11 2008, 09:51)  Вместо того, чтобы найти их причину?  Нашёл несколько причин. Одна из них - несохранение С некоторых регистров в прерываниях. Искал долго т.к. вылезало редко, не во всех режимах, вылезало совсем в другом месте (в том месте которое было прервано после возврата с испорченными регистрами) и приводило к тому, что процессор выдавал на шину 1, а устройство 0. При этом происходило замыкание, срабатывала защита по питанию, срабатывал BOD, процессор перезапускался. Столько времени я бесполезно потерял... Понимаю, что в новых версиях это исправлено, но у меня уже какая-то аллергия на С для АВР выработалась. Мне всё кажется, что это глюк не мой, а С. А когда на асме пишу, то между мной и процессором никого нет... Макрокоманд для стандартных случаев понаписал. Если надо быстро сделать (и можно неоптимально), то макрокомандами пользуюсь. В принципе что-то типа своего языка на макрокомандах получилось. ЗЫ Прошу прощения за офтоп.
|
|
|
|
|
Jun 12 2008, 11:11
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Вот оно, ключевое слово: Цитата(defunct @ Jun 10 2008, 18:22)  У кого как, мне важнее time-to-market ... Цитата(defunct @ Jun 10 2008, 18:22)  За примерами далеко ходить не надо - DVD/CD-RW,Wireless AP / Router'ы и т.п. ИМХО для этого всего avr-ки мягко говоря, слабоваты. Или есть примеры DVD-RW на любимой народом восьмой меге? Нет, не контроллер евонного двигателя, а весь DVD привод? Цитата(defunct @ Jun 10 2008, 18:22)  Пространство меня не жмет. Хоть в медном тазу можно клепать, лишь бы крепилось на дин-рейку. А про время, я вас умаляю. Ассемблеру с C не тягяться в этом. Улыбнуло. ;> Прям представил медный таз, повешенный на DIN-рейку  УмАлять меня не надо, и улыбаться про себя типа как Джоконда. Лучше расскажите, как на С написать обработчик прерывания, длиной, например, 10 тактов процессора.
|
|
|
|
|
Jun 12 2008, 18:49
|

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

|
Цитата(Maik-vs @ Jun 12 2008, 14:11)  Лучше расскажите, как на С написать обработчик прерывания, длиной, например, 10 тактов процессора. Что есть такты и зачем именно 10? Что это даст? Прерывания использую не ради тактов, а ради своевременной реакции на события системы. И мне производительности хватает. Цитата ИМХО для этого всего avr-ки мягко говоря, слабоваты. Если пользовать все обработчики длиной в 10 тактов, то конечно AVRки будут слабоваты для всего.
|
|
|
|
|
Jun 13 2008, 18:09
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата Дело в том, что я пишу обработчик и мне надо знать было ли за время работы обработчика прерывание. Можно узнать для таймерных прерываний - смотрите регистр TIFR. Цитата А есть возможность как-нибудь очистить вот эту очередь прерываний? Я имею ввиду сделать так, чтобы после обработки текущего отложенные прерывания не выполнялись?.. Куда хоть посмотреть можно? Также через TIFR можно очистить соответствующие флаги установкой того же бита в TIFR. Смотреть в даташит, написано. Цитата А у меня не зависает. Проверено. Вы пишите на ассемблере, отлаживайте. И тогда всё будет нормально, хоть с вложенными прерываниями, хоть с выложенными У меня тоже не зависает, проверено. Пишу на С (gcc), как-то и особой отладки не разу не требовалось.
|
|
|
|
|
Jun 15 2008, 09:05
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Maik-vs @ Jun 12 2008, 15:11)  Прям представил медный таз, повешенный на DIN-рейку  УмАлять меня не надо, и улыбаться про себя типа как Джоконда. Лучше расскажите, как на С написать обработчик прерывания, длиной, например, 10 тактов процессора. Прочитайте AVR035, многие сишные команды дают одинаковый код если бы Вы писали на ассемблере, ну а зная ключевые слова конкретного компилятора можете вмешаться в сохранение рабочих регистров или исключить их сохранение , ну и обработчик прерываний будет коротеньким. С другой стороны если вы имеете ввиду построение обработчика прерывания таким образом чтобы немедленно отреагировать на определённое событие ну а в основном цыкле делать его обработку - тогда зачем заморачиваться с асм?
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jun 15 2008, 09:42
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Не по теме, но не удержался Код register uint8_t count asm("r2"), tsreg asm("r3");
SIGNAL (SIG_INTERRUPT0) __attribute__((naked)); SIGNAL (SIG_INTERRUPT0){ tsreg = SREG; // 1 такт count++; // 1 такт SREG = tsreg; // 1 такт asm volatile("reti"); // 4 такта } Обработчик на gcc, для подсчета импульсов, например. count потом обрабатываем в основном цикле. И правда - зачем заморачиваться с ассемблером?
Сообщение отредактировал 733259 - Jun 15 2008, 10:04
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|