Как можно съесть слона? По кусочку за раз
При поиске инфы по работе, наткнулся вот на ряд статеек о контроллерах. Приведу часть текста - ржачно (даже если вы не в теме)
читать дальше (многабукаф!)
Подпрограммы и прерывания
При написании первой программы я в технических отступлениях ругался такими страшными словами как стек, прерывания и подпрограммы, чем внес немало мути в ваши головы. Пора бы эту муть осадить и придать всему структурированный вид.
Чтобы понятно было сразу и на века приведу отвлеченный пример.
Представь ты просыпаешься утром и идешь умываться и чистить зубы. Сам процесс умывания и чистки зубов отработан уже до автоматизма и ничем не отличается от вечерней процедуры. Да и если тебе захочется вдруг взять умыться среди дня или почистить зубы просто так, то все ты повторишь в точно такой же последовательности. Мелкие вариации, конечно не в счет. Совершенно очевидно, что в твоих мозгах зашиты две подпрограммы: “Чистка зубов” и “Умывание“.
Также и в коде, когда у тебя какая то последовательность действий часто повторяется, то ее рациональней вынести в подпрограмму. Они же процедуры, функциями называть их можно, но это не совсем корректно. В функцию можно передавать параметры, для передачи же параметров в подпрограмму в ассемблере механизмов нет, их приходится изобретать самостоятельно. Например я передаю через регистры, заранее загрузив туда нужные значения перед вызовом процедуры.
Возвращаясь к нашей аналогии, если бы тебе надо было почистить зубы гуталином, то в случае с функцией ты бы взял тюбик гуталина в руку (передаваемый параметр) и поперся к раковине. В случае ассемблерной процедуры, тебе бы пришлось вначале подсунуть гуталин вместо зубной пасты. А потом почистить зубы по обычному алгоритму “взяв тюбик возле раковины”. После зачистки зубов ты бы вернулся к тому месту откуда начал - если бы это было вечером, то ты бы лег спать, а если утром, то ушел на работу или учебу.
Прерывания
Они похожи на процедуры, но работают по несколько иному принципу и имеют принципиально иное назначение.
Опять условный пример.
Ты сидишь втыкаешь в монитор, читаешь эту статью, тут звонок в дверь — аппаратное прерывание от устройства дверь. Если ты не нычишься от военкомата или соседки которую ты вчера затопил, и у тебя разрешены прерывания от устройства “дверь” то ты оторвешь задницу от стула и пойдешь в прихожую — вектор прерывания, от аппаратного устройства дверь. Прийдя в прихожую, то есть на вектор прерывания, происходит переход к обработчику прерывания, то есть мы уже врубаем, какой либо заранее записанный алгоритм, определяющий что сделать: открыть дверь, обматерить тех кто за дверью, открыть и обматерить, вызвать милицию, вызвать дурку. Да что угодно.
Приоритеты прерываний.
Представь ты ломанулся открывать дверь, а тебе пришло второе аппаратное прерывание - захотелось крупно погадить. С одной стороны важно и то и другое. С другой стороны в туалет можно и потерпеть, а вот гость то может и свалить. Так что заранее выстраиваются приоритеты прерываний и вначале принимаем гостя, а потом идем гадить. С другой стороны можно принять гостя, а потом днище как сорвет и случится большой конфуз. Так что надо очень тщательно подходить к процессу выбора приоритетов.
Главное помнить то, что отложенное прерывание никуда не девается, и как только процессор освободится, то пойдет выполнять его. Но его можно отменить вручную, скинув флаговый бит отвечающий за вызов прерывания.
Прерывания можно запрещать как по одному, от каждого устройства, так и глобально все махом. К этому тоже следует относится осторожно, например во время секса вполне разумно игнорировать стуки по батарее, телефонные звонки и долбежку в дверь, а вот взрыв газа на кухне игнорировать уже не стоит, по понятным причинам.
Возврат.
После обработки прерывания, когда все гости выслушаны и разогнаны, сортир смыт и проветрен, взрыв газа локализован и пожар потушен, а стучащие по батарее соседи получили в дыню, осуществляется возврат к прерванной программе, в нашем примере ты бы вернулся к компу читать статью дальше, как ни в чем ни бывало.
Установка флагов.
Это относится не столько к функционированию ядра контроллера, сколько к методикам ассемблерного программирования.
Вот вернулся ты к своему компу, а у тебя по плану было написание поста в блог. Изначально ты хотел выдать порожняк, вроде “ааа скучно мне, дайте чо нибудь посмотреть, или расскажите анекдот”, но вот хрен там! У тебя же недалече как пять минут назад наплыв беженцев в дверь, стуки по батарее и взрыв газа на кухне, ты, как истинный блоггер, в тех же обработчиках прерываний написал себе “Ы! Об этом надо написать в блог!” и теперь, увидев эти пометки начал яростно строчить тексты, красочно описывая случившиеся события.
Для этих целей в AVR есть удобный флаг Т в регистре SREG. Он ни за что не отвечает и сделан для пользовательских целей, т.е. для свободного использования.
ЗЫ. автор - DI HALT
ЗЗы. от себя скажу, что там ещё много полезного материала о контроллерах AVR изложено в понятной форме и с юмором. AVR. Учебный курс
ЗЗЗЫ. есть тут кто-нить, кто понял о чём речь?
читать дальше (многабукаф!)
Подпрограммы и прерывания
При написании первой программы я в технических отступлениях ругался такими страшными словами как стек, прерывания и подпрограммы, чем внес немало мути в ваши головы. Пора бы эту муть осадить и придать всему структурированный вид.
Чтобы понятно было сразу и на века приведу отвлеченный пример.
Представь ты просыпаешься утром и идешь умываться и чистить зубы. Сам процесс умывания и чистки зубов отработан уже до автоматизма и ничем не отличается от вечерней процедуры. Да и если тебе захочется вдруг взять умыться среди дня или почистить зубы просто так, то все ты повторишь в точно такой же последовательности. Мелкие вариации, конечно не в счет. Совершенно очевидно, что в твоих мозгах зашиты две подпрограммы: “Чистка зубов” и “Умывание“.
Также и в коде, когда у тебя какая то последовательность действий часто повторяется, то ее рациональней вынести в подпрограмму. Они же процедуры, функциями называть их можно, но это не совсем корректно. В функцию можно передавать параметры, для передачи же параметров в подпрограмму в ассемблере механизмов нет, их приходится изобретать самостоятельно. Например я передаю через регистры, заранее загрузив туда нужные значения перед вызовом процедуры.
Возвращаясь к нашей аналогии, если бы тебе надо было почистить зубы гуталином, то в случае с функцией ты бы взял тюбик гуталина в руку (передаваемый параметр) и поперся к раковине. В случае ассемблерной процедуры, тебе бы пришлось вначале подсунуть гуталин вместо зубной пасты. А потом почистить зубы по обычному алгоритму “взяв тюбик возле раковины”. После зачистки зубов ты бы вернулся к тому месту откуда начал - если бы это было вечером, то ты бы лег спать, а если утром, то ушел на работу или учебу.
Прерывания
Они похожи на процедуры, но работают по несколько иному принципу и имеют принципиально иное назначение.
Опять условный пример.
Ты сидишь втыкаешь в монитор, читаешь эту статью, тут звонок в дверь — аппаратное прерывание от устройства дверь. Если ты не нычишься от военкомата или соседки которую ты вчера затопил, и у тебя разрешены прерывания от устройства “дверь” то ты оторвешь задницу от стула и пойдешь в прихожую — вектор прерывания, от аппаратного устройства дверь. Прийдя в прихожую, то есть на вектор прерывания, происходит переход к обработчику прерывания, то есть мы уже врубаем, какой либо заранее записанный алгоритм, определяющий что сделать: открыть дверь, обматерить тех кто за дверью, открыть и обматерить, вызвать милицию, вызвать дурку. Да что угодно.
Приоритеты прерываний.
Представь ты ломанулся открывать дверь, а тебе пришло второе аппаратное прерывание - захотелось крупно погадить. С одной стороны важно и то и другое. С другой стороны в туалет можно и потерпеть, а вот гость то может и свалить. Так что заранее выстраиваются приоритеты прерываний и вначале принимаем гостя, а потом идем гадить. С другой стороны можно принять гостя, а потом днище как сорвет и случится большой конфуз. Так что надо очень тщательно подходить к процессу выбора приоритетов.
Главное помнить то, что отложенное прерывание никуда не девается, и как только процессор освободится, то пойдет выполнять его. Но его можно отменить вручную, скинув флаговый бит отвечающий за вызов прерывания.
Прерывания можно запрещать как по одному, от каждого устройства, так и глобально все махом. К этому тоже следует относится осторожно, например во время секса вполне разумно игнорировать стуки по батарее, телефонные звонки и долбежку в дверь, а вот взрыв газа на кухне игнорировать уже не стоит, по понятным причинам.
Возврат.
После обработки прерывания, когда все гости выслушаны и разогнаны, сортир смыт и проветрен, взрыв газа локализован и пожар потушен, а стучащие по батарее соседи получили в дыню, осуществляется возврат к прерванной программе, в нашем примере ты бы вернулся к компу читать статью дальше, как ни в чем ни бывало.
Установка флагов.
Это относится не столько к функционированию ядра контроллера, сколько к методикам ассемблерного программирования.
Вот вернулся ты к своему компу, а у тебя по плану было написание поста в блог. Изначально ты хотел выдать порожняк, вроде “ааа скучно мне, дайте чо нибудь посмотреть, или расскажите анекдот”, но вот хрен там! У тебя же недалече как пять минут назад наплыв беженцев в дверь, стуки по батарее и взрыв газа на кухне, ты, как истинный блоггер, в тех же обработчиках прерываний написал себе “Ы! Об этом надо написать в блог!” и теперь, увидев эти пометки начал яростно строчить тексты, красочно описывая случившиеся события.
Для этих целей в AVR есть удобный флаг Т в регистре SREG. Он ни за что не отвечает и сделан для пользовательских целей, т.е. для свободного использования.
ЗЫ. автор - DI HALT
ЗЗы. от себя скажу, что там ещё много полезного материала о контроллерах AVR изложено в понятной форме и с юмором. AVR. Учебный курс
ЗЗЗЫ. есть тут кто-нить, кто понял о чём речь?
между прочим такие примеры (или почти такие) частенько являются единственно приемлемыми для пояснения.
особенно для студентов, которых мне приводили
на сьедениена практикувот такие они... студенты