Перейти к содержанию

Как Изменить Конструкцию Кода На Асме


Kuraga

Рекомендуемые сообщения

Здравствуйте,

Изучаю STM32, пишу на ассемблере, в KEIL, MK F407IGT6.

Возникло несколько вопросов, знатоки, помогите пожалуйста.

1. Как изменить данную конструкцию, чтобы можно было менять значения BASE_1 и ZERO_BIT?

Пробовал и переменную и константу и регистры туда подставлять - ругается компилятор, говорит что нельзя в операции И и в других.

BASE_1 EQU 0x40023800

ZERO_BIT EQU 2

MACRO

RCC_ON_GPIOC

MOV32 R0,(BASE_1 & 0x00FFFFFF) * 0x20 \

+ 0x42000000 \

+ (ZERO_BIT:ROL:2)

MOV R1, #0x1

STR R1, [R0]

MEND

2. Возникает ошибка Undefined symbol main. Прочитал про эту ошибку, но решить не смог.

Файл уже называется main.s, в файле есть функция __main, пробовал и main и что угодно, все равно выдает ошибку.

Как с этим бороться?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

1) После умножения на 0x20, результат не вылезет ли за 32 разряда?

2) Есть ли EXPORT __main? Если нет, то неудивительно, что линкер не находит.

К тому же неясно, что значит поменять местами BASE_1 и ZERO_BIT? Раз уж это две константы, не проще ли написать сразу нужное выражение? Хотя бы, на этапе отладки.

P.S. Как ты можешь писать в Keil, когда в Линуксе есть Eclipse и тулчейн для STM32? :)

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Спасибо за ответ.

1). Нет не вылезет, потому что с помощью И осталось только смещение относительно базового адреса. В моем случае 2 3800.

2). Пошел гуглить.

Вопрос был немного другой - сильно не пинать, я только учусь: вот есть две константы BASE_1 и ZERO_BIT. Я хотел бы их менять по ходу пьесы подставляя туда другие значения и если можно так выразиться вызывать макрос. Вот - как это сделать пока не понял.

Попытался писать в Keil - думал будет удобней... пока его использую чтобы проще было смотреть на сам процик и готовые библиотеки, порты, RCC и прочее, а пишу в GNU асме, как-то он по-приятней что-ли.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В коде твоей программы обязательно должна присутствовать строка EXPORT __main

А дело вот в чем. C скрывает эти вещи, но в асме все ручками.

__main - это не первая процедура, которая вызывается в твоей программе. Когда линкер собирает исполняемый файл (кстати, формата ELF, как и в Юникс), он добавляет к нему загрузчик. Который создает образ процесса в памяти, и потом передает управление __main. Редактор связей знает, что загрузчик хочет передать управление на метку __main, но не находит ее нигде. Откуда ему знать, где она может быть, в каком файле? То, что объектный файл называется main.o, еще ничего не значит - он может называться как угодно. Директива EXPORT просто делает метку из данного модуля видимой в других модулях.

Вообще STM32 больше похож на обычный комп, чем на контроллер. И программирование тоже больше похоже на прграммирование для компа. Есть и настоящие многозадачные операционные системы для него, и даже GUI.

Насчет выражения для второго операнда MOV32 - по идее, должно работать (честно говоря, никогда так не делал, да и пишу на С), поскольку в выражении фигурируют только определенные на этапе компиляции константы.

Как именно, дословно, ругается компилятор? И когда - в самом макроопределении или на этапе его развертки?

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Спасибо. Мда KEIL ASM - для меня пока печаль. Вообщем исправил Main, при отладке используя стандартные библиотеки с Reset Handler код никогда не попадает в Main.

Без них соответственно ругается на Cannot Find Arguments 'Reset_Handler', 'Vectors'

Вообще пока перешел на GNU ASM - будем перепиливать startup.s и прочее, иначе невозможно просто работать - ужас какой-то, до чего разработчиков ARM довели ЯВУ...

Ссылка на комментарий
Поделиться на другие сайты

А что мешает писать на С?

Асм, ну чисто для интереса, тем более на таком могучем проце.

И даже архитектуру МК (регистры, биты и все такое прочее, касающееся периферии) можно изучить без асма.

Ссылка на комментарий
Поделиться на другие сайты

С библиотеки можно вызывать и из асма. Но тогда вообще нет смысла писать на асме :)

И тем более нет никакого смысла делать большой проект на асме.

Я так понял ты не программист (по специальности)?

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

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Как то так получается что похоже скоро программирование станет моей специальностью, поскольку заниматься системным администрированием и перепаивать автомобильные блоки мне уже надоело, хочется занять embedded разработкой, сварганить что-нибудь этакое. Например написать на АСМе TCP IP стэк...

Ссылка на комментарий
Поделиться на другие сайты

Заметно :) Потому что ни один программист, для которого это работа, не будет писать на асме целиком большой проект, да и маленький тоже - слишком падает производительность труда, и так невысокая. А TCP/IP на асме :) - это из разряда понтов, типа как я крут, что я на асме написал :D Но это пройдет, если станет просто работой.

Вообще, если нужен TCP/IP, возьми готовую либу, да и протоколы прикладного уровня тоже готовые есть. Что до сам и на асме, ну залезь в код Линукса, и посмотри сколько строк кода там занимает реализация TCP/IP - сразу расхочется, и это при том, что там С.

Одной из первых моих конструкций на МК были часы. Второй раз за всю мою карьеру (программиста и сисадмина, так что коллеги :) ) мне довелось поработать по специальности :D Простые часы вместо Электроники 7 с дохлыми почти индикаторами. На Меге 8. Висят на работе в машзале сейчас. Разумеется, все разрабатывал сам - схему, софт. Поскольку я ненавижу аппаратуру с часами, время в которых сбивается при пропадании питания (даже в машине - когда снимаешь аккумулятор), то сразу стало понятно, что нужно ставить RTC c литиевой батарейкой. Поставил DS1307 с I2C интерфейсом. Разумеется, либу I2C взял готовую - и моя разработка от этого менее интересной не стала. На плате была разводка и для темературного датчика DS18B20 с 1-Wire интерфейсом, хотя в этом проекте не распаивал, но в следующих часах был. И снова я взял готовую 1-Wire либу, и скучно от этого мне не стало. Потому что сам функционал часов все равно надо было программить.

Мораль такова, даже если ты собираешь софт в значительной степени "из кубиков", то собственно прикладной код пишешь все равно сам, и это не менее интересно, зато не тратится время и нервы на написание (и отладку!) стандартных модулей. И кстати на С это не менее интересно, чем на асме.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Вы все правильно говорите, нужно писать прикладной код, а не отлаживать стандартные модули и не изобретать велосипед. Но когда свербит в одном месте и не знаешь что с собой делать хочется сесть и написать на асме что-нибудь большое. :crazy:

Чтобы смотреть с умилением сколько килобайт занимает твоя прошивка в соотношении с прошивкой из папочки Examples которую на том же Keil например, не купив/не вылечив Keil скомпилировать невозможно так как она далеко выходит за установленные размеры в 32 килобайта.

Ссылка на комментарий
Поделиться на другие сайты

То, что на асме не следует писать что-нибудь большое, поняли еще Томпсон и Ричи в начале 70-х, когда переписали UNIX на С. Винда, кстати, тоже на С написана. Но если свербит... :)

Вместо TCP/IP на асме, я бы потратил это время на изучение FreeRTOS :)

Мне удалось запустить ее с двумя задачами даже на Меге 8 (на три не хватило оперативы для сохранения контекста задач при переключении). А уж про STM32 и говорить нечего.

И там есть TCP/IP и FAT.

И гуй можно приаттачить

http://www.ugfx.org/

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Ну не могу - хочеться всего и сразу! И АСМ, и гуи, и фреертос, и СИ - короче начну с АСМ, один проект и дальше буду остальное изучать.

Ссылка на комментарий
Поделиться на другие сайты

Да обидно просто - уже начал писать драйвер для PHY, разбираюсь как настраивать DMA - пока поставил задачу хотя выдать в сеть любой фрейм и получить любой фрейм и посмотреть на сниффере.

Ссылка на комментарий
Поделиться на другие сайты

А в чем сейчас загвоздка то? __main уже работает?

Насчет макро, может вместо ZERO_BIT:ROL:2 лучше написать ZERO_BIT * 4? Может, компилер ROL не понимает?

Какой phy чип юзаешь?

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Main работает, все в порядке - спасибо :) кстати.

Основная проблема - мой уровень ассемблера и С около среднего или вскоре к нему приблизиться, но это не проблема.

Проблема в другом - я не понимаю какой четкий алгоритм действий по инициализации периферии, PHY, буферов DMA, какой четкий алгоритм работы с MAC (я так понимаю это встроенный модуль) по обработке входящих/исходящих пакетов, передачи их на верхние уровни и обработки там до прикладного уровня. Фух - выговорился :)

Понимаешь (ничего что на ты?), для меня плавно зажечь лампочку накаливания, передать данные по CAN шине, запустить электродвигатель, не беда не потому что я хорошо знаю языки, а потому что я четко представляю в физической вселенной весь алгоритм работы программы и я могу реализовать в коде. А тут уже неделю курю стандарты IEEE, даташиты и прочее и никак не могу написать максимально четкого и простого алгоритма.

По PHY - DP83848-EP.

Насколько я понял из даташита и Си-шного драйвера алгоритм такой:

1. Есть встроенный в STM32 модуль SMI который передает по одному пину данные, а по другому синхронизирует часики с PHY. Передача осуществляется путем заполнения одного регистра данными, на другом висит флаг занятости.

2. Надо послать с помощью двух регистров сообщение любое на PHY чтобы он ожил (естественно перед этим затактировать, инициализировать все что связано с Ethernet).

3. Потом надо запросить PHY ID, предварительно задефайнив его (прости меня господи - заЭкьюив его :) ) и сравнить с полученным. Если не совпадет - в ошибку.

4. Потом надо де-инициализировать (зачем-то) его записав в регистр PHY записав в регистр BCMR PowerDown/

5. тут все понятно - записать в регистры PHY режим MII/RMII, записать скорость передачи, FULL/HAlf duplex'

6. получить состояние линка из регистра PHY.

7. Получить еще какую-то Link Info из PHy - тут пока не понял. если что пиши в личку мыло, скину код который нарыл и даташиты. Если тебе конечно интересно или не в напряг

P.S - по поводу ROL - я уже переписал код, сейчас все понимает и все замечательно работает, помимо Bit Banding я уже успел освоить BFI - битовые маски :) Мы немного отклонились от изначальной темы

Изменено пользователем Kuraga
Ссылка на комментарий
Поделиться на другие сайты

Вообще, и сам на "ты" и к себе предпочитаю на "ты" :)

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

Драйвер конечно некоторый интерес представляет, но не вижу смысла этим заниматься, я лучше это время на FreeRTOS пущу. Хотя конечно это проблемно, я программист и после работы снова садиться за программирование как то неохота.

Кстати, веб-сервер есть для FreeRTOS готовый :) Так что вопрос только написать админку... посмотрю, может и PHP ecть под FreeRTOS :D хотя если нет то можно и на С - CGI еще никто не отменял.

Вот ты уже неделю бьешься над тем, что уже написано другими, а мог бы сделать что нибудь более полезное :)

Но от темы да, отклонились, вопросы из-за чего она создавалась, решены.

Ты бы темку назвал иначе, что нибудь вроде того "пишу стек TCP/IP на асме с нуля". Но переименовать наверное не выйдет уже. Но можно создать новую.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

по поводу готового могу сказать только, что качать лечение к кейлу не хочу - глупо как-то, у меня тоже полно готовых примеров только f7 нажми и залей.

но с LwIp пример веба у меня весит около 100 кб - почти втрое выше установленной нормы в 32 кб. Это первое.

Второе что меня в принципе бесит LwIp так ИМХО такого количества функций обернутых в функцию в квадрате я не видел в программировании МК (наверное потому что я не программист :))

В линуксе вообще не представляю как что-то можно написать, придется мне такой огород городить, поэтому пишу на ноуте т.к у меня на ноуте винда.

нашел неплохой сайт, начал по нему осваивать asm - stm32asm.

А PHY почему такая - я просто сразу заказал отладочный модуль EVK407i в китае, чтобы не заморачиватся с пайкой Ethernet. Меня кто-то напугал что ЛУТить Ethernet на плате это очень муторно.

Ты бы темку назвал иначе, что нибудь вроде того "пишу стек TCP/IP на асме с нуля". Но переименовать наверное не выйдет уже. Но можно создать новую.

Ну как видишь на этом сайте только ты откликнулся вообще, а если я про стек напишу, да ещё и на асме так это надо минимум на WE или куда-то ещё лезть, выслушивать какой я нуб и прочее :)

Ссылка на комментарий
Поделиться на другие сайты

У тебя 1Мб флеша. Это больше, чем в XT. Ты сначала попробуй свои задумки (устройство) реализовать на тех либах, что есть, а вот если памяти не хватит, тогда оптимизируй. Иначе получится так, что потратишь силы и время на попытку втиснуть сеть в 32 Кбайт, а в итоге окажется, что у тебя полно свободной памяти. Или что еще хуже, втиснуть в 32 просто не получится. А ты это поймешь только спустя много времени, и все окажется зря. Оптимизацией заниматься надо только тогда, когда это необходимо. Когда не лезет, или тормозит.

Что до темы - ну, максимум, скажут что мазохист писать на асме TCP/IP :) Но может есть здесь тот, кто это делал, пусть не на асме, а на С хотя бы. Хотя вряд ли, все скорее всего пользовались готовыми либам.

Попробуй uIP

https://en.m.wikiped.../UIP_(micro_IP)

http://we.easyelectronics.ru/electro-and-pc/stm32-uip-enc28j60.html

FreeRTOS +uIP заняли меньше 11Кбайт флеша :) Правда, это без web-сервера.

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Ещё раз спасибо - где же я был, ищу совсем не то. Нашел статью, там правда другая PHY:

http://we.easyelectronics.ru/electro-and-pc/stm32-uip-enc28j60.html

парень пишет вроде 11 кб кода ща проверим.

Драйвер на свое PHY я уже сам запилю - до меня дошло наконец как надо сделать его на асме, а остальное возьмем из стека.

Теперь буду гуглить как из Си вызывать что-нибудь написанное в ассемблере.

Ссылка на комментарий
Поделиться на другие сайты

Именно эту статью я и нашел вчера, и ссылку дал на эту же статью - можно было и не искать :) но "нормальный" PHY работает по MII (RMII), а не по SPI. С MII мне кажется вообще ничего делать не надо - просто взять стандартный драйвер FreeRTOS. Ну или свой, раз уж хочешь допилить.

а остальное возьмем из стека.

Уже прогресс :)

Изменено пользователем Rafiq
Ссылка на комментарий
Поделиться на другие сайты

Все внимательно изучил и прочитал. Да, у меня ситуация полегче потому что у меня куча памяти, есть модуль RMII, MAC, DMA. Плюс куча уже готовых регистров.

Один только вопрос uIP так это то что она ждет ак на каждый пакет, но думаю можно слегка перепилить.

Вот :) Пока читаю RFC разные - все таки надо как-то понимать что там и как происходит... эх жаль что нет такого описания как WE про AVR про модули STM32 и Ethernet...

Ссылка на комментарий
Поделиться на другие сайты

Наверное, я в подробности не вдавался. uIP вообще имеет ряд ограничений в жертву размеру, можешь прочитать в Вике. Там не все реализовано, что должно быть в TCP/IP. Тем не менее работает. В lwIP, возможно, есть все что должно быть.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...