Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

120 Часть 11. Программирование микроконтроллеров АVR на ассемблере ты, индивидуальные для каждого экземпляра устройства (например, калибровоч­ ные коэффициенты датчиков) следует хранить в EEPROM, откуда их легко про­ честь и при необходимости изменить отдельной процедурой калибровки, не затра­ гивая саму программу. Такое соответствие каждой разновидности памяти ее назна­ чению позволяет оптимальным образом использовать ресурсы контроллера и выжать из него намного больше, чем позволяет любой язык высокого уровня. Как вы уже знаете, при работе МК последовательно выполняет команды програм­ мы, записанной в памяти программ. Программист может менять порядок выполне­ ния команд, организуя циклы и различные переходы. Одно из самых мощных средств программирования - вызов подпрограмм или процедур (в нашем случае это одно и то же), т. е. кусков кода, которые могут использоваться неоднократно. Во всех ассемблерах вызов процедур предусмотрен обязательно. ЗАМЕТКИ НА ПОЛЯХ В Pascal и других классических алголоподобных языках подпрограммы делятся на процедуры и функции , а в языке С и всех остальных, основанных на его синтаксисе, есть только функции . В ассемблере , строго говоря , существуют только подпрограммы, хотя в основе это все одно и то же - пример еще одной путаницы в головах програм­ мистов , в которую вникать совсем не хочется . Потому пусть читатель меня извинит, если я иногда буду вперемешку употреблять термины «процедура» и «подпрограм­ ма» , подразумевая , что это означает одинаковые сущности . А вот «функций» , как та­ ковых, собственно в ассемблере не бывает вовсе. Функция - это всего лишь такой особый способ передачи параметров из подпрограммы, характерный именно для язы­ ков высокого уровня . Для ассемблера функция ничем не отличается от любой другой подпрограммы. - Кроме выполнения просто процедур-подпрограмм, важное значение имеет обра­ ботка прерываний. По сути, это такая же процедура, но ее выполнение отличается некоторыми существенными аппаратными нюансами, потому необходимые коман­ д ь 1 для обработки прерываний другие . Давайте разберемся во всем этом подробнее. Общая структура ассемблерной про граммы и ее выполнение Естественно, программу сначала нужно записать в память МК, причем так, чтобы МК «знал», откуда начинать при включении питания или после подачи импульса на вывод RESET . Это его «Знание» в случае современных МК АVR также програм­ мируется, однако пока для простоты будем считать, что программа всегда начинает выполняться с самой первой ячейки памяти программ - т. е . с нулевого адреса. Исходя из этих обстоятельств, программа должна иметь определенную структуру. По этому начальному (нулевому) адресу почти всегда располагается одна и та же команда безусловного перехода, название которой во всех ассемблерах происходит от английского jump (прыжок) . Для AVR она может записываться следующим образом : rjrnp RESET или jrnp RESET

RkJQdWJsaXNoZXIy MTExODQxMg==