понедельник, 06 августа 2012
Бегающие светодиоды — это круто. Но когда весь код превращается в нечитабельную простыню — нет. К тому же надо бы добавить хоть какую реакцию на внешние события. Хоть кнопку ту же пусть чует, благо это очень просто.
Потому надо каждый проект разбивать на функционально обособленные модули. И не важно будет, на чём оные модули будут написаны =)
Но пока нас интересуют только ассемблерные.
читать дальшеНапример, для данного проекта можно выделить 4 модуля:
main.s — весь алгоритм программы сидит здесь.
led.s — весь код работы со светодиодами (инициализация, поджиг, тушение).
button.s — код работы с кнопкой (инициализация, опрос).
system.s — всякая дребедень (SystemInit и delay).
В каждом модуле нужно выделить экспортируемые процедуры. Это делается ключевым словом EXPORT:
EXPORT LedInit
EXPORT LedOn
EXPORT LedOff
После этого данные символы появятся в глобальной области видимости и могут быть использованы в других модулях.
Подключается отдельный символ с помощью ключевого слова IMPORT:
IMPORT символ
Подключать в каждом файле эти функции тоже не круто. Надо бы их объявить в одном файле и подключать только его. Ну, как include в языке С.
Такой файл записывается таким образом (led.inc):
Подключается это дело тоже просто:
Собственно, по синтаксису всё.
Сам проект изменился следующим образом: светодиоды бегают по часовой стрелке. Если нажать кнопку, побегут против.
Номер зажигаемого светодиода хранится в регистре R5 главного цикла. Без кнопки регистр увеличивается с каждым оборотом на 1 (и проверяется, не убежал ли более 3х). Если кнопка нажата — регистр уменьшается на 1. Если число стало минусом, оно сбрасывается в 3.
Хотя гораздо проще и лаконичнее это было бы сделать такой конструкцией:
Попробуйте заменить =)
Файлы:
button.s
led.s
main.s
system.s
button.inc
led.inc
system.inc
Проект целиком.<< Предыдущее Следующее >>
@темы:
arm,
программизмы,
электроника,
ассемблер,
stm32f4discovery,
stm32
Подскажите пожалуйста, если я создал файл, в котором прописал все адреса периферии, директивой GET подключил файл в модуль main.s, сюда же подключил другие модули, где настраивается периферия, типа портов, таймеров, АЦП и т.д. Тот файл с адресами, получается использовать только исключительно в модуле main.s, в других, если я напишу, например LDR R0, = GPIOB это будет ошибкой. Как сделать, что бы тот файл, был виден во всех модулях? Пробовал это реализовать директивами EXPORT/IMPORT - не получилось, видимо, что то не то сделал...
Подскажите пожалуйста, если я создал файл, в котором прописал все адреса периферии, директивой GET подключил файл в модуль main.s, сюда же подключил другие модули, где настраивается периферия, типа портов, таймеров, АЦП и т.д. Тот файл с адресами, получается использовать только исключительно в модуле main.s, в других, если я напишу, например LDR R0, = GPIOB это будет ошибкой. Как сделать, что бы тот файл, был виден во всех модулях? Пробовал это реализовать директивами EXPORT/IMPORT - не получилось, видимо, что то не то сделал...
Всё... Сам разобрался... )