Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
15.11.2007, 10:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от nokazus
|
... Но точно знаю, что во многих процессорах ядро не станет обрабатывать прерывание, пока обрабатывается прерывание с таким же приоритетом.
|
Поскольку ни в одном даташите я таких сведений не встречал, хочу спросить - это где-то описано или на уровне непроверенных наблюдений? Специально проверялось? Если да, то - на каких камнях?
|
|
|
|
15.11.2007, 11:43
|
|
Временная регистрация
Регистрация: 01.11.2006
Сообщений: 66
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Поскольку ни в одном даташите я таких сведений не встречал, хочу спросить - это где-то описано или на уровне непроверенных наблюдений? Специально проверялось? Если да, то - на каких камнях?
|
во всех даташитах в разделе Interrupts написано как они работают на конкретном камне. Для АВР (в частности МЕГА64) приоритет прерывания определяется его позицией в таблице векторов (т.е. жестко задан аппаратно). Думаю, что в других АВР недалеко ушли.
На тему выдергивания переменной побайтно:
а зачем под контроллер писать как под ПиСи? предложенный код ресурсов сожрет немеряно. гораздо проще:
Код:
|
unsigned long a;
char * ptr=(char *)&a;
Send(*(ptr++));
Send(*(ptr++));
Send(*(ptr++));
Send(*(ptr++)); |
а вообще удобней перед началом передачи готовить данные в буфере, а лишь потом начинать передачу. В этом случае проще использовать memcpy:
Код:
|
unsigned long a;
char buf[BUFSIZE];
char bufptr = 0;
memcpy(&buf[ptr],&a,sizeof(a));
bufptr+=sizeof(a); |
PS: Наглядность и эстетичность кода - дело святое. Особенно это понимаешь, когда меняешь чужую прогу, написанную по принципу "работать будет, и хорошо"
|
|
|
|
15.11.2007, 12:28
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Сообщение от tempora
|
Сообщение от nokazus
|
... Но точно знаю, что во многих процессорах ядро не станет обрабатывать прерывание, пока обрабатывается прерывание с таким же приоритетом.
|
Поскольку ни в одном даташите я таких сведений не встречал, хочу спросить - это где-то описано или на уровне непроверенных наблюдений? Специально проверялось? Если да, то - на каких камнях?
|
Выдержки из ДШ на Mega8. Что касается приоритета rremix абсолютно прав:
Цитата:
|
The lowest addresses in the Program memory space are by default defined as the
Reset and Interrupt Vectors. The complete list of Vectors is shown in “Interrupts” on
page 44. The list also determines the priority levels of the different interrupts. The lower
the address the higher is the priority level. RESET has the highest priority, and next is
INT0 – the External Interrupt Request 0.
|
Что касается запрета в AVR:
Цитата:
|
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts
are disabled. The user software can write logic one to the I-bit to enable nested interrupts.
All enabled interrupts can then interrupt the current interrupt routine. The I-bit is
automatically set when a Return from Interrupt instruction – RETI – is executed.
|
Если нужны комментарии на русском - пишите.
2 rremix
По преобразованию в байты. Тут Вы совершенно правы. Просто я не знаю как компилятор CV сделает кусок со сдвигами. Может он очень умный и сформирует временную переменную, которую будет сдвигать последовательно на 8 бит. Терзают сомнения, но кто его знает. Не работаю я с CV. Адресная ссылка или буфер - "правильное" решение. В ковычках, потому что строгих правил тут нет. Скорее это общепринято.
Удачи.
|
|
|
|
15.11.2007, 12:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Что касаемо пиков - то при вызове прерывания устанавливается автоматом бит запрета прерываний gie в 0. При выполнении возврата retif тоже идет автоматическая установка его в 1. Так что ситуация с переполнением стека ... Вряд ли.
|
|
|
|
15.11.2007, 15:40
|
|
Частый гость
Регистрация: 11.01.2005
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от urry
|
Что касаемо пиков - то при вызове прерывания устанавливается автоматом бит запрета прерываний gie в 0. При выполнении возврата retif тоже идет автоматическая установка его в 1.
|
Для АВРов такая же фигня ...
|
|
|
|
15.11.2007, 16:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
rremix, nokazus, urry - вы меня неверно прочитали. Поясню мысль. Итак, nokazus утверждал, что два прерывания от одного источника запрещены к вложению аппаратно, на уровне ядра, вот его слова:
Цитата:
|
а)... точно знаю, что во многих процессорах ядро не станет обрабатывать прерывание, пока обрабатывается прерывание с таким же приоритетом ...
б)... Например, в MSC-51 есть скрытый регистр (подчеркнуто мной, t.), запрещающий реакцию на прерывания (с таким же или низшим приоритетом) на время от начала реакции (занесения в стек адреса возврата) до исполнения команды reti.
|
Про то, что большинство камней (если не все) при возникновении прерывания выставляют флаг, запрещащющий вложенные прерывания от того же источника (а иногда и глобально), я, слава богу, знаю - читать не разучился еще ![Смешно](images/smilies/icon_lol.gif) , но флаг этот можно сбросить программно, разрешив вложенные прерывания одного и того же типа, а nokazus высказал мысль прежде мне неизвестную - что ядро не будет обрабатывать такое же прерывание, пока не выполнится инструкция iret. Если он прав, то сбрасывай флаг программно, не сбрасывай - вложенных прерываний все равно не будет. Есть разница?
Таки, я хотел бы услышать ответ на свой вопрос от nokazus'а и других участников... мм? Только, плиз, говорите о фактах - здравый смысл уже весь прозвучал.
|
|
|
|
15.11.2007, 17:09
|
|
Частый гость
Регистрация: 11.01.2005
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от tempora
|
Таки, я хотел бы услышать ответ на [u]свой вопрос
|
При входе в обработчик прерываний флаг глобального разрешения прерываний "I" аппаратно сбрасывается . Но его можно программно установить для разрешения вложенных прерываний .... Действительно интересно узнать , что будет если условия для данного (первого) прерывания ещё не прошли или опять наступили - например на входе внешнего прерывания присутствует необходимый уровень . По идее тогда МК "приклинет" , заполнится до отказа стек и проц подвиснет .Короче будет ЗЛО .
Но если требуется обработать вложенные прерывания , то можно попробовать в теле обработчика перед установкой флага "I" запретить первичное прерывание , а по выходу из него -снова разрешить .
|
|
|
|
15.11.2007, 17:15
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от Plant
|
Действительно интересно узнать , что будет если условия для данного (первого) прерывания ещё не прошли или опять наступили - например на входе внешнего прерывания присутствует необходимый уровень .
|
Тогда установится флаг прерывания, и если его програмно не очистить, то как только будут разрешены общие прерывания, программа перейдет на вектор прерывания...
Кстати это все четко прослеживается в аврстудио
|
|
|
|
15.11.2007, 17:21
|
|
Вид на жительство
Регистрация: 05.09.2006
Сообщений: 360
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
1. MSC-51 не сбрасывает/восстанавливает общий флаг запрета прерываний во время обрабртки.
2. Приоритет прерываний может изменяться (для 52). Существует 2 уровня, во время обработки низшего, может обрабатываться прерывание с высшим приоритетом.
3. В даташите Вы никогда не найдете описания работы регистров, недоступных пользователю. Фирменную техническую документацию не читал (кроме ДШ и АПН).
4. В книге "Проектирование цифровых устройств на однокристальных микроконтроллерах" В.В. Сташин, ... , которую я уважаю, на стр.77 написано
Цитата:
|
Система прерываний сформирует аппаратурно вызов (LCALL) соответствующей подпрограммы обслуживания, если она не заблогирована одним из следующих условий:
...
|
5. Блокировка может быть осуществлена только триггером, как элементом, сохраняющим устойчивое состояние.
6. Разницы между триггером и регистром не вижу.
Все. Дела. Удачи.
|
|
|
|
15.11.2007, 17:21
|
|
Частый гость
Регистрация: 11.01.2005
Сообщений: 24
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от dimonbest
|
Тогда установится флаг прерывания, и если его програмно не очистить, то как только будут разрешены общие прерывания, программа перейдет на вектор прерывания...
|
Я же про то же (для АВР)... Если это делать в обработчике , то после установки общего флага , опять произойдет это -же прерывание (если правда оно первое по приоритету) . Опять вызов этого же обработчика и т д , пока не заполнится стек .
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Схема на частотомер
|
smg123 |
Измерительное оборудование |
5 |
08.09.2007 02:48 |
Частотомер Ч3-34А
|
Modul-x |
Поиск схем. Делимся схемами |
0 |
24.08.2007 23:00 |
Частотомер ЦД2120.1
|
Slava_shp |
Поиск схем. Делимся схемами |
0 |
10.08.2007 21:18 |
Частотомер
|
KLMZ |
Измерительное оборудование |
4 |
12.01.2007 12:06 |
Часовой пояс GMT +4, время: 01:18.
|
|