|
|
  |
ATMEL рекомендует ATmega32A и ATmega16A |
|
|
|
Jul 6 2008, 13:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(ReAl @ Jul 4 2008, 21:47)  А кто мешает у MCS51 точно так же "какие хочешь, такие в данном месте и"? Рукопашное "какие хошь прерывания, такие в данном месте и разрешай" точно так же можно и у 51-го дёргать. Сильно теоретически можно. Мешает та самая приоритетная система прерываний с правилом "прервать текущее прерывание может только более приоритетное". Нельзя прервать даже прерыванием того-же уровня. Теоретически можно поднять приоритет "соседа", но тогда в этом "соседе" надо анализировать собственный приоритет, что-бы не наделать глупостей. Как ни странно, но простота системы прерываний AVR часто и есть его преимущество. А плюс заключается в том, что иногда в прерывании можно разрешить прерывания еще до сохранения контекста. Хотя стоит сперва исключить возможность повторного попадания в текущее прерывание. Т.е. прерывания наинизшего уровня как в x51 эмулируются в AVR одной командой разрешения прерывания в начале обработчика (можно даже еще в таблице векторов). А вообще - в любом длинном прерывании чаще всего есть критическая секция которую надо сделать "как можно шустрей" и "все остальное", которое уже можно обрабатывать при разрешенных прерываниях. Цитата(ReAl @ Jul 4 2008, 21:47)  GCC в прологах/эпилогах трогает. Ну, это к создателям GCC... Если им лень было учитывать особенности платформы и они предпочли сделать "как в х86", то кто им лекарь. А особенность заключается в том, что X и Y позволяют сделать честный стеки данных, а не играться со стековым кадром на стеке возвратов. Цитата(ReAl @ Jul 4 2008, 21:47)  Любой переключатель задач трогает. Обычно переключателю задач не атомарность SP до лампочки. Переключение задач обычно делают уже в прерывании т.е. при запрещенных операциях со стеком. Цитата(ReAl @ Jul 4 2008, 21:47)  Кроме SPL я ещё и словные SFR припомнил - очень весело при каждом обращении к 16-битным таймерным регистрам запрет прерывания дёргать. Не работай с регистрами таймеров в основном цикле программы (не самое удачное решение), не будет тебе этой "проблемы". Цитата(ReAl @ Jul 5 2008, 18:06)  Если же уже начал работать обработчик, к примеру, SPI, то не имеет никакого значения факт "наиприоритетности" INT0 - оно не прервёт "менее приоритетный" обработчик SPI до тех пор, пока в том не будет выполнена команда SEI. Но сразу после неё резко так обработчик EE_RDY тоже сможет прервать обработчик SPI - т.е. коту под хвост пошло теперь уже то, что обработчик SPI якобы приоритетнее EE_RDY. Если в обработчике появилась SEI, то все, что требовало "приоритетности" там уже выполнено. Остальной код по важности ниже необходимости обработки того-же EE_RDY.... Цитата(ReAl @ Jul 5 2008, 18:06)  Конечно, можно поизвращаться и при входе в обработчик SPI сохранить состояние разрешения прерывания EE_RDY, запретить его, потом сделать SEI, порабтать, (по вкусу - выполнить CLI) и восстановить состояние разрешения EE_RDY. Именно о таком спочобе эмуляции приоритетной системы прерываний писал ArtemKAD. И о таком в т.ч.. Хотя именно так я никогда не делаю. Разве, что тогда, когда меня интересует не само прерывание, а только его флаг. Обычно обработчик делится на приоритетную часть(которую прерывать нельзя) и остальную (после SEI) Цитата Но это только программная эмуляция того, что у других бывает аппаратно. В том же MCS51 имеется две или четыре таких цепочки, которая у AVR одна. Не совсем такие. У MCS51 разрулить выполнение прерываний с равными приоритетами - только последовательное исполнение. Поэтому там длинным обработчикам ПРИХОДИТСЯ ставить наинизший приоритет независимо от их важности т.к. разрешить выполнение ВСЕХ остальных прерываний посреди обработчика весьма непросто Цитата В этом случае, например, можно прерывание от аналогового компаратора переместить в самую приоритетную цепочку и сработка компаратора сразу же вызовет его обработчик - без ожидания, пока работающий уже в данный момент обработчик какого-нибудь таймера расщедрится на сохранение контекста, Ага... Если только это прерывание "какого-нибудь таймера" само не вызвано таким-же способом из другого прерывания  . Тогда вызвать прерывание "от аналогового компаратора" повышением его приоритета будет не суждено. Приведу пример на примере обычного декрементирующего таймера. После возникновения этого прерывания необходимо как можно скорее установить новое значение счетчика (т.е. вроде как наивысший приоритет), а затем выполнить кучу работы которая накопилась за время между срабатываниями (пару десятков мс) и эта обработка не срочная и может занять несколько мс (т.е. надо разрешить остальные прерывания). Вот и попробуй выбрать че больше не нравится при использовании х51-й системы прерываний. Цитата Да, без этого можно жить. Можно стараться обработчики прерываний делать покороче, чторбы задержка в них не была существенной, можно, как это часто обсуждается, в нужных обработчиках запрещать "менее приоритетные" и после этого разрешать прерывания Зачем? Просто ставь пораньше SEI если не нужна дальше непрерывность кода. А "наименее приоритетные" вообще начинай с этой команды... Цитата Да, в свежих AVR это дело потихоньку поправили, но изначально был такой ляп... Не думаю, что это был совсем уж ляп. Скорее всего в погоне за ценой кристалла делали регистры "так как получилось". С переходом на более мелкую норму ресурсы по "устаканиванию" порядка регистров стали более незаметны вот в новых и поправляют. ЗЫ. Как по мне - наиболее неудобное расположение регистров у Mega48(88/168), но у них и наилучшее соотношение цена/возможности.
|
|
|
|
|
Jul 6 2008, 19:27
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Сильно теоретически можно. Мешает та самая приоритетная система прерываний с правилом "прервать текущее прерывание может только более приоритетное". Нельзя прервать даже прерыванием того-же уровня. "если нельзя, но очень хочется, то можно". Код prog segment code stack segment idata
rseg stack ds 10H
cseg at 0 jmp start jmp IE0_vect org 1BH jmp TF1_vect
rseg prog start: mov SP,#stack-1 mov TMOD, #03H mov TCON, #43H mov IE, #89H setb PT1 sjmp $ TF1_vect: setb P1.0 setb P3.2 clr P3.2; передёрнули INT0 acall L_reti; очистка логики прерываний - теперь как после SEI у AVR nop nop nop clr P1.0 L_reti: reti
IE0_vect: setb P1.1 clr P1.1 reti end У меня таким образом прерывание от таймера с периодом 256 циклов процессора прерывало само себя - оно обычно быстренько всё делало, но раз в N входов работало долго, вместе с обычной работой - больше 256 циклов. Ну так входило, опять делало быструю часть и возвращалось в длинную, оттуда - в основную программу. Цитата(ArtemKAD @ Jul 6 2008, 16:19)  А вообще - в любом длинном прерывании чаще всего есть критическая секция которую надо сделать "как можно шустрей" и "все остальное", которое уже можно обрабатывать при разрешенных прерываниях. Ну так и делаю. Просто у AVR можно *только* так. А у MCS51 - не только. И я пользовался тем, что можно и так, и эдак, и смесь. Чаще всего я на "двухуровневых" MCS51 таким образом эмулировал третий уровень, на "четырёхуровневых" хватало имеющихся уровней и только несколько раз делал acall L_reti, чтобы прерывание могло прервать свою же длинную часть (ну и другие чтобы не ждали аж так долго). Но всё равно я на AVR перешёл  , по сумме баллов. Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Ну, это к создателям GCC... Если им лень было учитывать особенности платформы и они предпочли сделать "как в х86", то кто им лекарь. А особенность заключается в том, что X и Y позволяют сделать честный стеки данных, а не играться со стековым кадром на стеке возвратов. Лень - не лень, но странно выходит. Разработчиков AVR Вы защищаете, а у разработчиков AVR-GCC право иметь какие-то свои соображения отбираете. Зато в тех функциях, в которых стековый кадр не нужен - у них Y вообще свободен для использования. А основной проигрыш IAR-у в размере кода у них отнюдь не на том, что нужно модифицировать SP, если у функции есть локальные переменные на стеке. Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Обычно переключателю задач не атомарность SP до лампочки. Переключение задач обычно делают уже в прерывании т.е. при запрещенных операциях со стеком. Да, это я увлёкся  Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Не работай с регистрами таймеров в основном цикле программы (не самое удачное решение), не будет тебе этой "проблемы".  Точнее "только в обработчиках прерываний до SEI" ? Ну, случаи бывают всякие. Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Не совсем такие. У MCS51 разрулить выполнение прерываний с равными приоритетами - только последовательное исполнение. Поэтому там длинным обработчикам ПРИХОДИТСЯ ставить наинизший приоритет независимо от их важности т.к. разрешить выполнение ВСЕХ остальных прерываний посреди обработчика весьма непросто см. выше. Очень просто, цена вопроса - два байта и (на классике) четыре машинных цикла, что гораздо проще, чем на AVR сэмулировать работу системы прерываний 51-го. Из-за сложности эмуляции на AVR обходятся по другому, а не потому, что в этом нет своих прелестей. Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Приведу пример на примере обычного декрементирующего таймера. После возникновения этого прерывания необходимо как можно скорее установить новое значение счетчика (т.е. вроде как наивысший приоритет), а затем выполнить кучу работы которая накопилась за время между срабатываниями (пару десятков мс) и эта обработка не срочная и может занять несколько мс (т.е. надо разрешить остальные прерывания). Вот и попробуй выбрать че больше не нравится при использовании х51-й системы прерываний. Ну так не просто пробовал - отлично работало. Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Зачем? Просто ставь пораньше SEI если не нужна дальше непрерывность кода. А "наименее приоритетные" вообще начинай с этой команды... Да так и делаю. Просто если вообще все прерывания уже разрешены, то это как бы "уровень подпрограммы завершения", между прерываниями и основным кодом  , "обработчик как можно короче" читать как "критическую часть как можно короче, после чего перейти на уровень приоритета основной программы".
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Jul 6 2008, 23:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата(ReAl @ Jul 6 2008, 22:27)  "если нельзя, но очень хочется, то можно". Код acall L_reti; очистка логики прерываний - теперь как после SEI у AVR ........... L_reti: reti  Оригинально, оценил. Цитата Лень - не лень, но странно выходит. Разработчиков AVR Вы защищаете, а у разработчиков AVR-GCC право иметь какие-то свои соображения отбираете. У разработчиков компилятора возможностей максимально оптимизировать код под возможности платформы гораздо больше, чем у разработчиков камня (!)общего применения(!) оптимизировать систему фич, что-бы всех удовлетворило. Вот что-то типа твоего acall -> reti можно использовать для сброса текущего приоритета прерываний не смотря на то, что разработчиками камня такой фичи аппаратно не предусмотрено. А тут разработчики камня выкручивались обеспечивая очень мощную фичу на спец.регистр (Y), а его используют просто как регистр общего применения. Цитата "обработчик как можно короче" читать как "критическую часть как можно короче, после чего перейти на уровень приоритета основной программы". Угу... ЗЫ. Кстати, посмотрел я реализацию контроллера прерываний в ПЛИС - не сказал бы, что он проще умножителя 8х8. А если еще поставить условие принятия решения за 1 цикл, да еще и как в х51 - он получается однозначно сложнее.
|
|
|
|
|
Jul 7 2008, 11:27
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(ArtemKAD @ Jul 6 2008, 16:19)  Не совсем такие. У MCS51 разрулить выполнение прерываний с равными приоритетами - только последовательное исполнение. Поэтому там длинным обработчикам ПРИХОДИТСЯ ставить наинизший приоритет независимо от их важности т.к. разрешить выполнение ВСЕХ остальных прерываний посреди обработчика весьма непросто Простите конечно, но что-то вы либо недопонимаете либо бред пишете либо выссказываетесь неточно. МК это не лошадь. Его руками и головой делали. Здесь нет полутеней и всё предельно чётко. А посему: 1) Прерывания в AVR - аналог одного уровня прерываний в x51. Пускай вас не вводит в заблуждение описание порядка обработки прерываний в AVR при одновременном поступлении прерываний. На самом деле данный порядок не имеет никакого значения и ничем не поможет разработчику. С другой стороны x51 также имеет какой-то порядок обработки, - это ежу понятно. Просто разработчики на нём не заморачивались (и абсолютно правильно так как это один уровень) 2) В x51 введён аппаратный контроллер уровней прерывания, что очень удобно и постоянно используется (в AVR, к сожалению это приходится делать вручную. Точно также это можно делать и в x51 - никто не мешает). Более того введение банков регистров (с переключением) это тоже сделано для поддержки работы с прерываниями. Что, в свою очередь, говорит об обдуманном подходе разработчиков к решению этого вопроса. Таким образом при входе в прерывание необходимо было лишь сохранить PSW и выбрать банк, а при выходе - восстановить PSW и выйти. 3) В одной из первых статей разработчики AVR писали что работают на расширенном контроллером прерываний с поддержкой приоритетов и что данный вопрос "очень сложный" (Хотя несколько непонятно почему). Это было ещё на заре появления семейства megaAVR. Очевидно что их разработка воплощена в семействе xmega, где введено 4 уровня и есть "карусельный" вариант внутри уровня. Совершенно очевидно, что это серьёзный шаг вперёд и по сравнению с AVR и по сравнению с x51. Указано также что появилась возможность "программного вызова", отсутствие которого тоже была крайне неприятным моментом. Всё это говорит что разработчики также воспринимали эти моменты, как отрицательные и работали над их исправлением. PS: Вот вам в догонку раскладка прерываний х51 внутри уровня (аналог уровней) 1. IE0 (highest) 2. TF0 3. IE1 4. TF1 5. RI + TI 6. TF2 + EXF2 (lowest)
|
|
|
|
|
Jul 8 2008, 19:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Если делать полный аналог системы прерываний x51 на AVR, то затраты будут куда как более серьёзные. А если делать полный аналог системы команд x51 на AVR, то затраты будут еще больше. ЗЫ. А зачем делать "полный аналог"?
|
|
|
|
|
Jul 9 2008, 20:00
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(ArtemKAD @ Jul 8 2008, 22:46)  А если делать полный аналог системы команд x51 на AVR, то затраты будут еще больше. Затраты будут небольшие. Тут уже упоминалось, что я, и как оказалось, не только я выполнял такую работу при переходе с камня на камень. При этом просто тупо переписывал ASM операторы. И всё сразу заработало. Система команд AVR мощнее и удобнее чем x51. Цитата ЗЫ. А зачем делать "полный аналог"? Я надеюсь, вы не считаете что разработчики Intel, просто тупы и не знали что творили? При этом архитектура x51 и по сей день (по-моему) лидирует в области восьмибитников. Что указывает на её удачность. Кроме того, косвенно, на удачность системы прерываний указывает система прерываний xmega, которая заимствует и расширяет принципы системы прерываний x51. Впрочем, это общепринятые подходы к уровням прерываний. А, собственно, в чем прерывания AVR вы считаете лучше чем x51? Что такого можно сделать на AVR, чего нельзя на x51? Или удобнее на AVR чем на x51?
|
|
|
|
|
Jul 10 2008, 19:39
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Я надеюсь, вы не считаете что разработчики Intel, просто тупы и не знали что творили? Это намек на то, что разработчики Atmel просто тупы и не знали что творили? Цитата Кроме того, косвенно, на удачность системы прерываний указывает система прерываний xmega, которая заимствует и расширяет принципы системы прерываний x51. xMega слегка крупнее остальных AVR, что предъявляет к ней новые требования (задачи становятся объемнее, прерывания усложняються). Вы же не считаете, что к примеру в 8-битнике класса AVR и х51 должны быть средства реализации вытесняющей многозадачности (а-ля Intel x386). Вы вполне понимаете, что "за удовольствие придется заплатить". AVR упростила систему прерываний, а в замен дала очень функциональные таймера - на каждый по 2-3 прерывания, а не только одно переполнение как в х51. Так стоит ли повторять систему прерываний x51? Существующая в AVR Вам сильно не нравится (не дает работать)? Цитата А, собственно, в чем прерывания AVR вы считаете лучше чем x51? Почти ничем. Но тем не менее их почти всегда хватает. Так стоит ли их для этого класса МК расширять?
Сообщение отредактировал ArtemKAD - Jul 10 2008, 19:40
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|