IJAR 0 19 августа, 2013 Опубликовано 19 августа, 2013 (изменено) · Жалоба В DS указано что время вызова обработчика прерывания детерминировано и равно 12-ти тактам частоты процессора при автоматическое сохранение регистров. При отладке программы , написанной на С/C++ Code Composer Studio, в обработчике прерывания от GPIO (видно в дизасемблерном коде ) компилятор вставляет команды push/pop (сохранения/восстановления регистров в стеке). При этом регистр состояния процессора не сохраняется и не восстанавливается при возврате из обработчика прерывания Вопросы 1. На что уходят 12 тактов процессора при вызове обработчика прерывания 2 Если в эти 12 тактов не входит сохранение регистров процессора (контекста) то сколько времени дополнительно занимает их сохранение 3. Как сохраняется/восстанавливается регистр состояния процессора Зарание спасибо за помощь Изменено 19 августа, 2013 пользователем IJAR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 августа, 2013 Опубликовано 19 августа, 2013 · Жалоба такты идут на работы машины прерываний. потому что кроме прерывания есть еще арбитраж их приоритета, сохранение регистра счетчика команд и прочих из ядра. Но регистры сохраняются не в стэк, вернее правильнее сказать не во всех архитектурах регистры сохраняются в стэк. Есть архитектуры с теневыми регистрами, это копия набора регистров процессора, и при возникновении прерывания процессор просто переходит на работу с этим набором регистров. http://vestnikmag.ru/wp-content/uploads/20...electronics.pdf здесь написано что кортекс м4Ф автоматически сохраняет регистры, а как и куда не сказано, но если найти более официальный документ по этому вопросу будет все понятно.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IJAR 0 20 августа, 2013 Опубликовано 20 августа, 2013 · Жалоба такты идут на работы машины прерываний. ..... кортекс м4Ф автоматически сохраняет регистры, а как и куда не сказано, но если найти более официальный документ по этому вопросу будет все понятно.. Н-да.... похоже весь контекст состоит из рег-ра состояния процессора и старого PC который грузится в LR а все остальное сохранять ручками и на все тратить такты, такты, такты ......и еще 12 штук тактов на возврат и + восстановление контекста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 августа, 2013 Опубликовано 20 августа, 2013 · Жалоба Н-да.... похоже весь контекст состоит из рег-ра состояния процессора и старого PC который грузится в LR а все остальное сохранять ручками и на все тратить такты, такты, такты ......и еще 12 штук тактов на возврат и + восстановление контекста Описание процессора говорит, что за эти 12 тактов среди прочего он сохраняет в стеке следующие регистры: Program Counter (PC) Processor Status Register (xPSR) r0-r3 r12 Link Register (LR) Если обработчик прерывания использует регистры r4-r11, то их тоже надо сохранить. Если такты так критичны, пишите обработчик на ассемблере. Тогда можно не трогать регистры r4-r11, и необходимость в их сохранении отпадёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба Если такты так критичны, пишите обработчик на ассемблере. Тогда можно не трогать регистры r4-r11, и необходимость в их сохранении отпадёт. ...или возьмите процессор с ядром ARM7/9 - там есть переключение контекста (на один из теневых наборов регистров) и можно ничего не сохранять (особенно для FIQ) :laugh: Н-да.... похоже весь контекст состоит из рег-ра состояния процессора и старого PC который грузится в LR В LR грузится не старый PC, а спец. значение (ссылка на вектор прерывания). Адрес возврата сохраняется на стеке как вам уже сказали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IJAR 0 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба Описание процессора говорит, что за эти 12 тактов среди прочего он сохраняет в стеке следующие регистры: Program Counter (PC) Processor Status Register (xPSR) r0-r3 r12 Link Register (LR) Если обработчик прерывания использует регистры r4-r11, то их тоже надо сохранить. Если такты так критичны, пишите обработчик на ассемблере. Тогда можно не трогать регистры r4-r11, и необходимость в их сохранении отпадёт. Все таки сохраняет/восстанавливает часть - это уж что то > Если такты так критичны, пишите обработчик на ассемблере. Тогда можно не трогать регистры r4-r11, и необходимость в >их сохранении отпадёт Очень критичны, применение ас-ма в обработчике прерывания очевидно Да-а-а-а - возврат из прерывания командой "бранч по содержимому регистр" - это кончно надо додуматься, хотя экономия одного кода команды - это много. Спасибо! ...или возьмите процессор с ядром ARM7/9 - там есть переключение контекста (на один из теневых наборов регистров) и можно ничего не сохранять (особенно для FIQ) :laugh: В LR грузится не старый PC, а спец. значение (ссылка на вектор прерывания). Адрес возврата сохраняется на стеке как вам уже сказали. В этом процессоре 8 UART чего в других, кроме Ренесанса и Атмела, нет, а мне вообще надо 16 UART. Использую 2-й такой же процессор в качестве сопроцессора По поводу LR - я ошибся Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба может легче уже ПЛИС поставить и получить хоть 50 уартов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба В этом процессоре 8 UART чего в других, кроме Ренесанса и Атмела, нет, а мне вообще надо 16 UART. Использую 2-й такой же процессор в качестве сопроцессора Может вы просто неправильно выбрали процессор? Ставить для этого 2 процессора - по-моему избыточно. Если процессор не загружен на 100%, то может проще сделать программную эмуляцию UARTов? Если загружен - взять более мощный и сделать программную эмуляцию на нем. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IJAR 0 21 августа, 2013 Опубликовано 21 августа, 2013 (изменено) · Жалоба Может вы просто неправильно выбрали процессор? Ставить для этого 2 процессора - по-моему избыточно. Если процессор не загружен на 100%, то может проще сделать программную эмуляцию UARTов? Если загружен - взять более мощный и сделать программную эмуляцию на нем. ;) По выходу эмулировать 8 UART не проблема, но в том то и фишка что надо Только принимать от 16-ти асинхронно работающих устройств и выдающих в ТТЛ UART 8N1 на скорости 200 000 б/с 2 байта без паузы, с периодичностью в несколько мл сек причем в любое время может придти прерывание от ноги которое надо обслужить за 2 мк сек в котором задействовано порядка 30-ти пинов проца и которое может повторяться (сериями по max 32 шт) с интервалом 5 мк сек интервал между сериями десятки мл сек и до кучи потребление всей этой байды не должно превышаать 30 или на "крайняк" 40 мА Изменено 21 августа, 2013 пользователем IJAR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба По выходу эмулировать 8 UART не проблема, но в том то и фишка что надо Только принимать от 16-ти асинхронно работающих устройств и выдающих в ТТЛ UART 8N1 на скорости 200 000 б/с 2 байта без паузы, с периодичностью в несколько мл сек причем в любое время может придти прерывание от ноги которое надо обслужить за 2 мк сек в котором задействовано порядка 30-ти пинов проца и которое может повторяться (сериями по max 32 шт) с интервалом 5 мк сек интервал между сериями десятки мл сек и до кучи потребление всей этой байды не должно превышаать 30 или на "крайняк" 40 мА другими словами надо всего лишь поставить ПЛИС на входе... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IJAR 0 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба другими словами надо всего лишь поставить ПЛИС на входе... ПЛИС не "катит" из-за потребления - это уже проходили сейчас стоят 2 БМК Зеленоградские но от них вынуждены отказаться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 21 августа, 2013 Опубликовано 21 августа, 2013 · Жалоба По выходу эмулировать 8 UART не проблема, но в том то и фишка что надо Только принимать от 16-ти асинхронно работающих устройств и выдающих в ТТЛ UART 8N1 на скорости 200 000 б/с 2 байта без паузы, с периодичностью в несколько мл сек причем в любое время может придти прерывание от ноги которое надо обслужить за 2 мк сек И на прием - никакой проблемы. У вас скорость - фиксированная и формат по UART - тоже, это упрощает задачу. Вопрос только - хватит-ли общего быстродействия проца? Заводите DMA с группы ног и спокойно потом разбираете в фоне пришедший блок. Оверсэмплинг можно поставить поменьше - 8 например. Для работы быстрых прерываний в обработчике прерываний DMA разрешаете сразу же на входе прерывания (для быстрых прерываний надо поставить наивысший приоритет). Если все напишите оптимально то по-моему хорошие шансы что хватит 1го процессора, возможно даже М3. А с 2-мя у вас меньше шансов уложиться по потреблению. Непонятно только - зачем 200кбод при таком малом траффике. если у вас 2 байта в неск. мсек, то лучше снизьте скорость раз в 10-100 и будет легче и потребление меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IJAR 0 22 августа, 2013 Опубликовано 22 августа, 2013 · Жалоба И на прием - никакой проблемы. У вас скорость - фиксированная и формат по UART - тоже, это упрощает задачу. Вопрос только - хватит-ли общего быстродействия проца? Заводите DMA с группы ног и спокойно потом разбираете в фоне пришедший блок. Оверсэмплинг можно поставить поменьше - 8 например. Для работы быстрых прерываний в обработчике прерываний DMA разрешаете сразу же на входе прерывания (для быстрых прерываний надо поставить наивысший приоритет). Если все напишите оптимально то по-моему хорошие шансы что хватит 1го процессора, возможно даже М3. А с 2-мя у вас меньше шансов уложиться по потреблению. Непонятно только - зачем 200кбод при таком малом траффике. если у вас 2 байта в неск. мсек, то лучше снизьте скорость раз в 10-100 и будет легче и потребление меньше. Сопроцессор будет почти все время спать - важно интегральное потребление по току, на частоте до 8 МГц потребление будет достаточно малым >Непонятно только - зачем 200кбод при таком малом траффике. не напрягайтесь - так сделано во внешнем устройстве чужой разработки и "место встречи изменить нельзя" >И на прием - никакой проблемы. А вот здесь, если можно, поподробней и лучше в личку или port.e<пес>маил<тчк>ру Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 22 августа, 2013 Опубликовано 22 августа, 2013 · Жалоба ПЛИС не "катит" из-за потребления - это уже проходили сейчас стоят 2 БМК Зеленоградские но от них вынуждены отказаться что-то вы странное проходили, ей богу... как может процессор с кучей периферии и уартом жрать больше отдельного уарта? прелесть ПЛИС что вы делаете именно машину уарта, и все остальное выкидываете Это я так тыкнул на угад... http://kazus.ru/lenta/view/0_6586_0.html CPLD с потреблением энергии в режиме ожидания всего 5мкА. Ток потребления микросхемы в рабочем режиме при частоте 20мГц составляет 1мА или даже меньше А вам 20 МГц нафиг не сдалось, на 1 все будет работать... И что у вас ПЛИС просыпаясь для работы на 2 байта раз в миллисекунду выйдет из ваших 2 миллиампер? ЦПЛД + какой то крохотный микроконтроллер полюбому будет есть меньше 2 АРМов Или я чего то не знаю? П.С. А как БМК расшифровывается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IJAR 0 22 августа, 2013 Опубликовано 22 августа, 2013 · Жалоба что-то вы странное проходили, ей богу... как может процессор с кучей периферии и уартом жрать больше отдельного уарта? прелесть ПЛИС что вы делаете именно машину уарта, и все остальное выкидываете Это я так тыкнул на угад... http://kazus.ru/lenta/view/0_6586_0.html CPLD с потреблением энергии в режиме ожидания всего 5мкА. Ток потребления микросхемы в рабочем режиме при частоте 20мГц составляет 1мА или даже меньше А вам 20 МГц нафиг не сдалось, на 1 все будет работать... И что у вас ПЛИС просыпаясь для работы на 2 байта раз в миллисекунду выйдет из ваших 2 миллиампер? ЦПЛД + какой то крохотный микроконтроллер полюбому будет есть меньше 2 АРМов Или я чего то не знаю? П.С. А как БМК расшифровывается? >Или я чего то не знаю? Конечно, я не могу тут расписывать всю работу девайса, там есть фильтрация с использованием Float64 и прочее... Нам предлагали разработать 2 ПЛИС под часть этой задачи pin-to-pin с применяемыми БМК- стоимость пол-лимона . БМК - базовый матричный кристалл БИС http://ru.wikipedia.org/wiki/%D0%91%D0%B0%...%B0%D0%BB%D0%BB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться