|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||||||
Keil 8051 как запихнуть *.a51 в *.a51 и не получить WARNING29.05.2015, 00:50. Показов 47432. Ответов 22
Метки нет (Все метки)
Здравствуйте. Начал самостоятельное изучение кейла и MSC51. Но вот разжеванной инфы по A51 очень мало.
Такая проблема, написал файл инициализации init.a51
Получаю *** WORMYNG L5: CODE SPACE MEMORY OVERLAP 00h to 33h Если скопировать код в хедер и вставить его, то ворнинга не будет. Научите пожалуйста директивам A51, что бы можно нормально вставлять и выставлять код из файла в файл.
0
|
||||||
| 29.05.2015, 00:50 | |
|
Ответы с готовыми решениями:
22
Assembler A51 Assembler A51 Samsung galaxy A51 |
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|||||||||||
| 29.05.2015, 10:08 | |||||||||||
|
a51 - двухпроходный оптимизирующий ассемблер для написания сегментированных программ. Если вы хотите разбить программу на логические блоки, каждый блок должен быть оформлен своим сегментом. Первый програмный сегмент будет тот, в котором строка CSEG AT 0, остальные препроцессор разместит сам. Поэтому оператор ORG должен использоваться только для таблицы прерываний. Инклюды в а51 практически не используются, только для таблиц и макросов, код должен быть в своем сегменте (сегментах). Эти файлы просто подключаются в проект. О написании программ под а51 я уже писал в этой ветке.
Для вас примерно так: InitSection
MainSection
Поэтому и инициализация и главный цикл должны располагаться в одном файле. Другое дело, что главный цикл может состоять только из вызовов подпрограмм, а вот они уже могут располагаться в других файлах (секциях). Имена секциям даются для быстрого поиска ошибок, компилятор выведет его в строке ошибки. Среда Keil уже содержит кучу примеров, в том числе и разной инициализации - Init.a51, Init_mx.a51, Init_tny.a51, файлы StartXXX.a51 в папке С51\Lib. Чтение и разбор исходников - лучший учебник, да и хелп (англоязычный) в Keil отличный.
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
|
| 29.05.2015, 15:18 | |
|
Здравствуйте. Спасибо за ответ.
Но не могу понять: STACK SEGMENT IDATA RSEG STACK DS STACK_START Объявляется сегмент в ОЗУ, и там выделяется место под переменную размером с адрес начала стека? MOV SP, #STACK-1 ; тут от сегмента в ОЗУ уже что то отнимают, да еще как от куска кода! Даже если предположить, что так хитро инициализируется стек, почему -1? RSEG INIT ; USING 0 ; Что вот это такое? Переключение банка, но оно до метки Start, PC туда не попадет никогда.
0
|
|
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
| 29.05.2015, 15:58 | |
|
ОЗУ у i51 не является непрерывной областью одинаковой памяти. Оно разбито на сегменты, непосредственно адресуемый DATA, косвенно адресуемый IDATA, внешняя ROM XDATA, хотя часть ее часто находится на чипе и т.д.
Стек всегда размещается в сегменте IDATA, от основной памяти он ничего не отнимает. То что вы назвали STACK_START - это на самом деле его зарезервированный размер. #STACK-1 - потому, что стек у i51 расширяется вверх, при обращении сначала происходит инкремент (переход на следующий адрес), затем запись. RSEG INIT - это регистрация (место с которого начинается) сегмента данных INIT. USING 0 - предупреждение компилятору, что пока программа использует только банк 0. Банки 1..3 он может использовать как обычное ОЗУ. На первом проходе компилятор подсчитывает все USING и соответственно распределяет память. <Изображение удалено>
0
|
|
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||
| 29.05.2015, 16:42 | ||
А вот про ОЗУ я совсем запутался. Но ведь DATA(РОН+20-7F) по сути является частью IDATA(РОН+20-7F+РСН) В РСН находится только SP(указатель стека) Сам стек должен писаться куда нибудь в память с возможностью прямой адресацией 00-7F Или я что то не понимаю...
0
|
||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
| 29.05.2015, 17:10 | |
|
Все вы правильно понимаете. Непосредственно адресуемой ROM у предка i51 было всего 128 байт. Тогда там размещался и стек в том числе. Но уже у i52 стало 256 байт ROM. И как их теперь адресовать семью битами? Поэтому вторую страницу в 128 байт с косвенной адресацией обозвали IDATA, и стек теперь всегда там. Но и теперь выпускаются контроллеры с 128 байт ROM. Например AT89C2051. Поэтому указывая IDE конкретный тип контроллера, вы не только подключаете описания регистров, вы и грубо указываете как интерпретировать адреса памяти. Более точно можно задать в настройках проекта.
Прямая адресация для работы со стеком стандартными средствами не предусмотрена архитектурой, только косвенно через SP.
0
|
|
|
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 106
|
|
| 29.05.2015, 17:28 | |
|
Регистр-указатель стека SP в 805Х -- восьмибитный. Он может адресовать любую область внутренней памяти данных. В отличие от микропроцессора КР580ВМ80, у микро-ЭВМ семейства 805Х стек "растет вверх", т.е. перед выполнением команды PUSH или CALL содержимое SP инкрементируется, после чего производится запись информации в стек. Соответственно при извлечении информации из стека регистр SP декрементируется после извлечения информации. В процессе инициализации микро-ЭВМ после сигнала сброса или при включении питающего напряжения в SP заносится код 07h (8-1)!!!. Это означает, что первый элемент стека будет располагаться в ячейке памяти с адресом 08h... Учите матчасть, а то бьют так больно...
0
|
|
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|||
| 29.05.2015, 18:04 | |||
0
|
|||
|
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 106
|
|
| 29.05.2015, 18:11 | |
|
Это был ответ на "почему -1?".
Я давал информацию не о конкретной величине указателя стека, а о методике назначения исходного значения указателя стека... При данном вами раскладе памяти исходно в указатель стека должна быть занесена величина 80h-1...
0
|
|
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||
| 29.05.2015, 18:13 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||
| 29.05.2015, 18:37 | ||
Те как я понял в контроллерах 8052, 2 параллельных ОЗУ? 1я Стандартная от 8051 128 байт с прямой и косвенной адресацией + 128 РСН. 2я IDATA 128 байт с исключительно косвенной адресацией через SP IDATA не конфликтует с SFR потому, что физически не начинается с адреса 80h? Или? Все в голове каша. Все ушел читать даташиты на 8052 =\
0
|
||
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
|
| 29.05.2015, 21:33 | |
|
Такс вычитал http://what-when-how.com/8051-microsont ... m-in-8052/
Значит как я и понял, на 8052 имеем 3 физически разные куска ОЗУ: 1. DATA (РОН + адреса 20-7F) адресуется и прямо и косвенно. 2. SFR (80-FF) обращение к ним происходит только при прямой адресации 3. IDATA (адрес такой же 80-FF) но обращение к ним может происходить только через косвенную адресацию, а именно через R0\R1 и SP Хорошо, многое стало яснее. Но зачем нужен и что делает этот код, я стал понимать еще меньше =) STACK SEGMENT IDATA RSEG STACK DS 0х07 Получается мы резервируем сегмент в ОЗУ с меткой STACK и выделяем 7 байт(почему не 8?) с 80h по 86h абсолютному адресу ОЗУ или с 00h по 06h относительно памяти IDATA. Но зачем это делать? SP мы инициализируем после строкой MOV SP, #STACK-1 Вот тут я вообще теряюсь. # — мы загружаем в SP значение сегмента STACK. Но блин, значение сегмента STACK должно быть 00 ибо мы только зарезервировали память, но не фига туда не закидывали, так же значение сегмента STACK имеет размер в 7 байт, целиком его попросту нельзя использовать в инструкции MOV. ПС в своих размышлениях опираюсь на это: ?label:? DS expression The DS statement reserves the specified number of bytes in the current memory sposi. label is a symbol that is assykned the current memory address. expression is the number of bytes to reserve.
0
|
|
|
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 106
|
|
| 29.05.2015, 22:01 | |
|
STACK SEGMENT IDATA -- абсолютный (неперемещаемый)сегмент внутри области памяти IDATA
RSEG STACK -- перемещаемый сегмент принадлежащий сегменту STACK DS 0х07 -- семь байт расположенные внутри перемещаемого сегмента Поскольку больше нет перемещаемых сегментов внутри сегмента STACK, перемещаемый сегмент размещается по смещению ноль(0) относительно начала сегмента STACK. Поэтому заносится в SP величина начала сегмента STACK минус один чтобы не пропадал байт, находящийся в начале стека и полностью использовать все байты стека...
0
|
|
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||
| 29.05.2015, 22:45 | ||
Спасибо. Как работает понял. Но все еще не понял зачем? Почему просто не забить в SP начало (00h)IDATA или просто константу с нужным отступом? И почему стек начнется с 7 байта адреса, а не с 8го, что логично? (00h+(07h-1d))=06h и при преинкременте байт будет записан в 07h, не кратный 8. Не злитесь, я действительно не могу понять этого.
0
|
||
|
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 106
|
|
| 29.05.2015, 23:42 | |
|
Над тобой довлеет парадигма того, что указатель стека должен начинаться с наибольшего адреса выделенной под стек памяти... Здесь же, все устроено наоборот: начальный указатель стека размещается по наименьшему адресу выделенной под стек памяти. Конкретно в этом случае RSEG и STACK начинаются с адреса 80h и имеют длину 7 байт. Указатель стека устанавливается на начало вышеозначенных сегментов минус единица т.е. на 7fh ...
0
|
|
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||
| 29.05.2015, 23:50 | ||
Я не совсем понимаю, зачем под него делать сегмент. Если мы наверняка не знаем, будет он занимать 7 байт или 70. Вернее ограничить мы его не можем, зачем 7 байт тогда? Почему просто адрес начала не занести? Еще одна тайна стала явью, MOV SP, #STACK-1 , #STACK подставляет не размер, а адрес начала. Осталось понять нафига 7 байт выделяется.
0
|
||
|
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 106
|
|
| 30.05.2015, 00:33 | |
|
Ну здесь заложена такая идея: эта величина заложена под потребности данного модуля. Примерно вызов 1-2х уровней подпрограмм и заброс на стек и снятие пары байт на стек и со стека. Но программы пишутся многомодульные и в каждом модуле может находиться такая запись об использовании стека данным модулем:
RSEG STACK DS ххх Где ххх -- количество байтов стека используемых данным модулем. После линковки программы длины всех таких сегментов суммируются и без особенного напряжения создается глубина стека реально используемого всей программой. НЕ ВОЗБРАНЯЕТСЯ написать одномодульную программу, абсолютную, без каких либо сегментов и ручками все повыставлять под личную ответсвенность программиста...
0
|
|
|
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 163
|
||
| 30.05.2015, 04:25 | ||
Те по факту это такая рекомендация, что бы при окончательной сборки можно было проверить, хватит ли стека в пике на все? Но само по себе оно ничего не делает, SP просто закидывается на стартовый адрес и в случае необходимости будет расти до 7Fh? Из всей этой темы, в итоге я понял, что, чтобы заинклудить какой либо отдельный модуль, мне этот самый модуль сначала необходимо привести к ввиду: NAME имя_модуля - обозвать модуль Стек_модуля SEGMENT IDATA - объявить права модуля на место в IDATA RSEG Стек_модуля - уточнить, что этот кусок свободно перемещаемый DS число - сообщить расчетный размер выделяемого куска. Код_модуля SEGMENT CODE - объявить права на место в ROM CSEG AT начальный_адрес - сказать что код должен начинаться по следующему абсолютному адресу или с помощью RSEG сказать, что код можно пихать куда хочется. END - сказать что модуль закончен. Правильно? Теперь этот файл можно сохранить и использовать инклудом куда хочешь?
0
|
||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
||||||||||||||||||||||||||
| 30.05.2015, 11:09 | ||||||||||||||||||||||||||
|
Про SEGMENT IDATA могу сказать что у меня он всегда один и обьявлен в основном модуле. Никогда не пробовал делать несколько сегментов стека, да и зачем?
Применение CSEG AT - делает модуль неперемещаемым, и применяется только для сегмента инициализации с таблицей прерываний. RSEG Имя_сегмента - регистрирует сегмент и обозначает его начало. Кроме этого что-то маловато видов памяти вы нашли у i51. Давайте считать:
Код:KEY0 BIT P1.0 ; Битовое имя внешнего вывода KEY1 BIT P1.3 ; Битовое имя внешнего вывода KEY2 BIT P1.2 ; Битовое имя внешнего вывода Если же вместо а51 воспользоваться более навороченным Ах51 там видов памяти еще больше. P.S. Сам никогда им не пользовался, хватало а51.
0
|
||||||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
| 30.05.2015, 14:19 | |
|
Не совсем по теме, скорее по отладке ассемблерных проектов в Keil. По умолчанию в настройках проекта генерируется только листинг (*.lst). Для ассемблера этот файл никакой полезной смысловой нагрузки не несет, вы увидите только свой ассемблерный листинг с разбивкой на страницы и нумерацией.
Очень полезно для знания что и куда ассемблер положил в прошивку генерировать карту памяти (*.m51). По умолчанию она отключена, ее генерацию надо включить.
0
|
|
| 30.05.2015, 14:19 | |
|
Помогаю со студенческими работами здесь
20
Нет сети на Samsung a51 Чёрный экран Samsung A51 Программа тестирования для МК A51 Assembler A51. Среднее арифметическое Подходят ли airpods pro на Samsung A51? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|