Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/163: Рейтинг темы: голосов - 163, средняя оценка - 4.83
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
1

AVRAssembler - правильное подключение библиотек

16.06.2015, 20:19. Просмотров 29416. Ответов 84
Метки нет (Все метки)

Добрый вечер, уважаемые. Возник вопросик.
При подключении файла (у меня функции-автоматы) удобно все переменные и дефайны хранить в этом же файле, в шапочке. И все хорошо, и удобно пока я не пытаюсь из кода файла подключенного раньше по тексту обратиться к переменной или дефайну объявленным в тексте файла, подключенного позже по тексту.
Компилятор выкидывает ошибку о нелегальном использовании имени... Оно, конечно, поменять местами инклюды. Но самая соль - это когда оба файла имеют ссылки друг на друга.
Можно это как-нибудь обойти без разделения фалов на код и переменныи с дефайнами, как это делают в си?

Пояснения:
Основная портянка:
Код
...
.include "111.yms"
.include "222.yms"
...
111.yms:
Код
.dseg
var1:    .byte 1
.cseg
ldi    r1, 255
sts    var2, r1
222.yms:
Код
.dseg
var2:    .byte 1
.cseg
ldi    r1, 255
sts    var1, r1
По поводу использования var2 в тексте 111.yms вылетит ошибка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2015, 20:19
Ответы с готовыми решениями:

Правильное подключение микроконтроллера
Здравствуйте. Прочитав статью, задался вопросом, как же таки правильно...

Правильное подключение кварцевого генератора
Добрый день. Имеется кварцевый генератор на 16 MHz. Не очень разобрался ка...

Правильное использование своих библиотек в модели
Здравствуйте, есть самописная библиотека по решению матриц - Matrix Как мне...

Правильное подключение style.css (регистрация и подключение)
Разбираюсь с регистрацией и подключение стилей, немного выдохся, не могу ни как...

Правильное подключение
Скажите как правильно подключить или записать так что бы после выбора mdb файла...

84
judshym
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
16.06.2015, 21:55 2
а если создать еще один файл в котором описать только переменные и подключить его первым:
Основная портянка:
Код
...
.include "000.yms"
.include "111.yms"
.include "222.yms"
...
000.yms:
Код
.dseg
var1:    .byte 1
var2:    .byte 1
111.yms:
Код
.cseg
ldi    r1, 255
sts    var2, r1
222.yms:
Код
.cseg
ldi    r1, 255
sts    var1, r1
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
16.06.2015, 22:25 3
Чтобы не было таких ошибок, приучите себя к модульности программ. Опрос кнопок отдельный модуль. LCD отдельный модуль. И так далее.
Выстраивайте программу так, чтобы не было пересекающихся ссылок.
Сейчас ваша ошибка в том, что в двух файлах обращение к еще неопределенным переменным. Определение переменных идет сверху вниз. Использование переменных после определения. Либо определяйте нужные переменные, потом используйте.
0
Fohyvis
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 499
16.06.2015, 22:52 4
Цитата Сообщение от rymomtsofto
Но самая соль - это когда оба файла имеют ссылки друг на друга.
Ну а смысл? Вы же подключаете отдельные функции (=файлы).
А в другом проекте, к примеру, не будет у вас использоваться функция 222.yms - править библиотеку 111.yms?
Так тогда нет никакой экономии времени против описания переменных в отдельном файле.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
16.06.2015, 23:06 5
judshym, я и спросил, возможно ли без выноса всех определений в отдельный файл. Это первое, что приходит в голову, но это неудобно. И зачем так сделано, я не понимаю(

dymyurk1978, все по модулям распихано у меня до нельзя. В основном файле только инклюды да rcallы. А вот есть два конечных автомата, по разным файлам, естественно, и нужно мне из первого менять состояние второго, а из второго - состояние первого.
Подумал, как обычно, мож знает народ таблетку от этой напасти. Может директивы какие специальные, чтобы один и тот же фал можно было подключить сначала в дефайнах, и там из него прочитались только дефайны. А потом его же, но только уже в кодовом сегменте, чтобы там уже код развернулся. Может как-нибудь можно через def-undef и ifdef-endif?
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
16.06.2015, 23:13 6
Fohyvis, у меня в коде два спецефичных (именно для этого проекта) автомата. Они перекликаются.
А есть файлик с программой скана клавиатуры. Мне очень удобно оставить ссылки (rcall-ret) на обработчики оставить в этом же файле. Вот и споткнулся с ним. Он хоть универсальный, но когда попытался поменять состояние другого автомата из обработчика, получил ошибку. Пришлось менять в практически случайном порядке местами инклюды в главном файле. Но это ж не дело.

А разбивать каждый файл на 2 - у меня в папке проекта уже 30 файлов, а это сколько будет? Вообще беда, не найдешь во век)
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
16.06.2015, 23:20 7
Сделайте механизм обмена сообщениями. Тогда у вас не будет таких ошибок. Один автомат отправит сообщение другому, тот сменит свое состояние.
Либо так: в том модуле, в котором определено состояние создаете подпрограмму изменения состояния ЭТОГО модуля. Вызываете подпрограмму из другого модуля. Тогда не будет ошибок.
Подобная практика применяется в си.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
16.06.2015, 23:43 8
Модуль клавиатуры - самостоятельный модуль. Наружу он выдает события нажатия, отжатия. И код кнопки.
Обработка событий модуля клавиатуры и кодов кнопок должна происходить в тех модулях, в которых это требуется.
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
16.06.2015, 23:51 9
два конечных автомата... из первого менять состояние второго, а из второго - состояние первого
Это попытка к старому спагетти за уши притянуть новую наукообразную вывеску.
Конечный автомат или меняет своё состояние сам, или это уже не он.

А когда что-то куда-то не впихуется, то это хороший повод задуматься "мож я чё не так понял, мож я чё не так делаю, мож надо просто посильнее надавить и всё впихнётся, а потом костылём подопрём и напильником подправим".
После хорошей задумчивости многие проблемы отпадают сами собой. Просто теряют смысл, нечего обсуждать.
Чё тут думать - трясти надо?
0
Fohyvis
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 499
16.06.2015, 23:55 10
Странно! Сейчас сам попробовал с небольшим упрощением
Код
;111.asm
.dseg
var1:   .byte 1
.cseg
sts var2, temp
----------------
;222.asm
.dseg
var2:   .byte 1
.cseg
sts var1, temp
у меня студия 4.18 и выбран ASM2 - и ничего оно не ругается! %

В симуляции в память записывается сначала в var2 (adr=3), потом - в var1 (adr=2). Первые два адреса были определены предыдущим инклюдником и к вопросу отношения не имеют.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
17.06.2015, 00:02 11
Объясните пожалуйста лапшеводу. Есть у меня модуль BEEP. Для того, чтобы бипнуть, я меняю его состояние с 0 на 1. Это пинок. А там он сам уже дальше считает, пищит, в зависимости от настроек. В коде у меня это выглядит так:
Код
        uouti    beep_at_state, 1
Все! Вы считаете, что нужно ввести еще один флаг, еще кусочек кода, чтобы пинать этот beep?
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
17.06.2015, 00:07 12
Fohyvis, каюсь. Сам не проверял прям вот так. Но эти ошибки периодически напрягают.
На счет лапши (после раздумья). Лапши то, собственно, никакой не возникает. Состояния, отчасти, сами служат флагами. Точек входа в автомат и управления им - минимум. Все прозрачно. Может кто подскажет, все-таки, на счет директив?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.06.2015, 00:12 13
Цитата Сообщение от _moysi
Изменение состояния одного автомата другим автоматом нормальная практика. Вопрос только в том, как это реализовать.
Но вы правильно сказали, когда начинаются проблемы, возможно придется пересматривать подход.
На асме:
Код
Set_State_Beep_On:
ldi r16, 1
sts State_Beep, r16
ret
Вызываем эту подпрограмму из другого модуля, и ошибки нет.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
17.06.2015, 00:23 14
dymyurk1978, спасибо, понял. Для каждого автомата создать такую подпрограмму и макрос к ней и вызывать макросом в одну строчку. Ругается только на имена переменных и на дефайны, а на метки уж никак он не может ругаться. Единственное, что сразу вижу - иногда rcall не будет доставать. Если делать универсальный модуль, придется строчить две подпрограммы чтоль))) Ну да это мелочи.
А все-таки. Можно разбить файл на секции директивами. Чтобы сначала прочиталась половина файла, потом в тексте определить какое-то слово, и еще раз заинклюдить файл, чтобы развернулась вторая половина?
0
Fohyvis
0 / 0 / 0
Регистрация: 28.01.2012
Сообщений: 499
17.06.2015, 00:26 15
Цитата Сообщение от rymomtsofto
Может кто подскажет, все-таки, на счет директив?
А посмотрите в Help в самой студии. Вот, к примеру:
Код
; Defyme FOO if it is not already defined.
.ifndef FOO
.equ FOO = 0x100
.endif
Я сам пока еще не пользовался, но думаю это к вашему вопросу.
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
17.06.2015, 00:32 16
ОК! Спасибо!
0
rimomtsofto
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 397
17.06.2015, 01:28 17
Вобщем поколдовал, ребят, принял для себя решение. Буду разбивать все файлы условной компиляцией. Работает.
Все файлы подключаются 2 раза. Между подключениями в главном модуле объявляем что-то вроде
Код
#define Code_sikmimt
При первом подключении разворачивается секция
Код
#ifndef Code_sikmimt
...
#endif
А при втором - секция
Код
#ifdef Code_sikmimt
...
#endif
Все работает, ошибки улетели. Красота.
В си так тоже можно сделать? Чтобы заголовочные файлы не писать отдельно?
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
17.06.2015, 11:14 18
То есть лазить на ходу снаружи внутрь работающего автомата не просто хочется, а даже нормально.
Ладно пример:

еепром 24с256 подключено к интерфейсу и2ц
в произвольный момент где-то снаружи пишем "сделать состояние_и2ц = слейв_не_ответил_на_адрес"... так нельзя? почему нельзя? а как можно?

Я не знаю, кто из оппанентов как себе понимает всю эту движуху в целом: ремесло, утилизация лишних ресурсов, вынужденная необходимость, способ быстро и дёшево приобрести необходимое изделие... кто как хочет, так и понимает.
В плане для себя лично смысл движухи выражался бы фразой "способ смотрения и видения": распознавание сущностей и явлений, определение причин и следствий, целей и средств, выстраивание взаимосвязей, из каши-малаши рисование красивой картинки бытия - в... уме. Весь смысл в уме.
А в уме нет правильного способа рисования картинок. Если кто-то утверждает, что такой способ есть - не верьте, он просто хочет впарить вам свой личный способ, таким образом лишив вас вашего собственного способа (в вашем уме).

Но... когда картинка "сложилась", вы это не сможете не заметить (в своём уме), а "разложить обратно" уже не захотите.
Складывание картинки - очень быстрый процесс, практически момент. Физиологическое ощущение красоты и лёгкости.
Но этот момент не наступает просто так, по щелчку пальцами. Он вытекает из предшествующих моментов.

Помешать "моменту просветления" наступить? Нууу... а помочь?
В некоторых умах эти моменты наступают быстро и как бы даже автоматически, непроизвольно.
Кому-то надо сначала помучаться, потрудиться, потерпеть, подождать.
А кто-то с этим счастьем родился. Как в лотерее. А другой не может выиграть, потому что неудачник, несмотря на старания.
Но надо же как-то ещё и доказывать сказки...

... сказки про бесконечные автоматы.
Напоминаю, что написанное сегодня придётся не только дописывать послезавтра, но и модифицировать через неделю. А если не повезёт, то и отлаживать.
Write-only. С граблями на амбразуру. Место для подвига.
Чем круче джип, тем дальше бежать за трактором.

Кстати, вам нравится современная цивилизация? Падающие протоны, глючащие венды, самопроизвольно разгоняющиеся тоёты, гигабайтные странички в интернете, траектории движения почтовых отправлений, таможенное законодательство, начальное образование, железнодорожное сообщение, кадастровый учёт...

Код
Set_State_Beep_On:
ldi r16, 1
sts State_Beep, r16
ret
Код
Riset_Machine:
; ... сюда можно вписать какие-нибудь проверки и приготовления ...
ldi r16, Machine_State_Idle
sts Machine_State, r16
ret
Одно и то же разными буквами переписано.
Какая разница, поменять снаружи внутреннюю переменную или отреагировать изнутри на внешнее событие (условие, воздействие).
Какие проверки и приготовления необходимо и достаточно туда вписать, как доказывается и проверяется их а) необходимость б) достаточность в) при последующих модификациях г) при последующих модификациях не только этой машинки д) о планах на которые модификации пока ещё не в курсе даже их будущий заказчик.

Код
Set_State_1:
ldi r16, 1
sts State, r16
ret

Set_State_2:
ldi r16, 2
sts State, r16
ret

Set_State_3:
ldi r16, 3
sts State, r16
ret

Set_State_ ...
Масляное масло как способ наебать систему методом сведения к хуям.

Код
.equ Flags = R20
.equ Flag_Beep = 0
Машинка из двух состояний: "флаг снят", "флаг установлен".
Результат работы машинки - снятый либо установленный бит в регистре.
Код
sbr Flags, 1<<Flag_Beep
Отработка внешнего события "программист хочет установить флаг", в результате которого машинка пришла в состояние "флаг установлен".

Заебался редактировать.

Есть у меня модуль BEEP. Для того, чтобы бипнуть, я
... его сначала рисую на буниге, если не получается обойтись представлением в уме виртуально.
А если обойтись получается, но не совсем правильно, тогда это ещё хуже, чем никак.

Цивилизация-то современная нравится или нет? Редактировать заебался. Да ещё и читать.
0
Btosk Worryor
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
17.06.2015, 11:36 19
Цитата Сообщение от _moysi
То есть лазить на ходу снаружи внутрь работающего автомата не просто хочется, а даже нормально.
Ладно пример:

еепром 24с256 подключено к интерфейсу и2ц
в произвольный момент где-то снаружи пишем "сделать состояние_и2ц = слейв_не_ответил_на_адрес"... так нельзя? почему нельзя? а как можно?
Если автомат надо переключать снаружи, я ввожу для такого автомата состояние "стоп". Это значит, что он закончил все свои дела и его можно переключать.
Ну либо знать и проверять состояния, когда можно переключать, но это уже более опасно и менее предсказуемо.
(Хотя вот сейчас я понял, что правильнее было бы ввести сигналы, проверяя которые автомат сам бы уже принимал необходимое положение)

А вообще, опытные плисоводы постоянно пишут, что автомат должен быть один (но большой). Много маленьких - уже опасно.
0
Btosk Worryor
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 392
17.06.2015, 11:37 20
...
0
17.06.2015, 11:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2015, 11:37

Подключение библиотек
Всем привет ! Недавно перешел на ubuntu ! И установил компилятор g++ !...

Подключение библиотек
Добрый вечер. Прошу помощи,так как сам осилить не состоянии. Имеется база...

Подключение библиотек
Есть набор файлов: CAPI.dll CAPI.lib CAPI.h CAPI.cpp(в вложении). Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru