Помогите написать код на ассемблере для ардуино

Johnson070
Offline
Зарегистрирован: 05.11.2020

В общем, нужно из скетча обратиться к функции которая находится bootloader

В функцию нужно передавать число uint64_t а возращает она тоже uint64_t

Помоги пожалуйста вообще не мыслю как это сделать.

EEPROM Миную тк нарушается безопасность

Johnson070
Offline
Зарегистрирован: 05.11.2020

Бутлоадер я скомпилировал, если что.

mixail844
Offline
Зарегистрирован: 30.04.2012
 
 
к решению какой задачи приведет исполнение вашей задумки ? 
brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Все очень просто. Вы можете узнать адрес нахождения функции (точку входа). Ну раз вы сами написали бутлоадер. А дальше объявляете прототип функции в своем куске прошивки. И обращаетесь по адресу используя это объявление. Тут ассемблер не нужен.

Johnson070
Offline
Зарегистрирован: 05.11.2020

А как подобное реализовать?

Мне нужно чтобы скетч и бутлоадер проверяли какой-то хэш, если все гуд бутлоадер возвращает переменную если нет, то нет

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Johnson070 пишет:

В общем, нужно из скетча обратиться к функции которая находится bootloader

В функцию нужно передавать число uint64_t а возращает она тоже uint64_t

Помоги пожалуйста вообще не мыслю как это сделать.

EEPROM Миную тк нарушается безопасность

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

Johnson070
Offline
Зарегистрирован: 05.11.2020

И как я смогу это сделать если бутлоадер по сути это отдельная программа

Я буду только обновлять прошувку без бутлоадера

Johnson070
Offline
Зарегистрирован: 05.11.2020

Johnson070 пишет:

И как я смогу это сделать если бутлоадер по сути это отдельная программа

Я буду только обновлять прошувку без бутлоадера

И как написать это чтобы можно было туда передавать данные и принимать возвращаемые

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Johnson070 пишет:

Johnson070 пишет:

И как я смогу это сделать если бутлоадер по сути это отдельная программа

Я буду только обновлять прошувку без бутлоадера

И как написать это чтобы можно было туда передавать данные и принимать возвращаемые

Похоже, эта задача Вам не под силу - обратитесь в платный раздел "Ищу исполнителя".

imp
Онлайн
Зарегистрирован: 20.06.2020

to Johnson070

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

Johnson070
Offline
Зарегистрирован: 05.11.2020

Я с этим разобрался, нашел как создать подобную функцию, но она не работает, я пока не могу понять почему.

Адрес в памяти я нашёл

00007ef2 <EEPROM_read>:
 
uint8_t EEPROM_read(uint16_t uiAddress)
 
uint8_t (*EEPROM_read)(uint16_t uiAddress) = (uint8_t (*)(uint16_t uiAddress))0x7ef2;
 
или так
 
void (*draw)(void);
   draw = reinterpret_cast<void (*)(void)>(0x7ef2);
 
Но данный метод не работает
 
Но вот не могу понять она обращается по адресу во FLASH или SRAM?
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Johnson070 пишет:

Я с этим разобрался, ...

Адрес в памяти я нашёл

00007ef2 <EEPROM_read>:
.... бла-бла-бла...
 
Но данный метод не работает
это относительный адрес, относительно начала секции. ;))) Угадай, где указано начало секции? - если бутлоадер собирал!
 
Цитата:
Но вот не могу понять она обращается по адресу во FLASH или SRAM?

Любознательность помноженная на полное невежество - взрывоопасная смесь! Изучаем понятие "Гарвардская архитектура".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
uint64_t boot_func(uint64_t data, uint16_t adress); // это прототип, а сама функция как будет выглядеть?

 

Johnson070
Offline
Зарегистрирован: 05.11.2020

Хорошо.

Все заработало, всем спасибо.

Последний вопрос как то можно из из исходников достать абсолютный адрес на функцию?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Я сразу понял, что ты что то сломать пытаешься :) Конечно можно ! Как то :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Johnson070 пишет:
как то можно из из исходников достать абсолютный адрес на функцию?
Может, как-то и можно, только непонятно зачем. Имя функции и есть абсолютный адрес её начала. Чего его доставать-то?

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Чего его доставать-то?


Вдруг придется на кафедре его оставить, если преподавателя не будет.

Johnson070
Offline
Зарегистрирован: 05.11.2020

В общем вопрос решен.

Всем спасибо.

Абсолютный адрес достал из HEX прошивки с помощью программы reAVR

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

ЕвгенийП пишет:

Johnson070 пишет:
как то можно из из исходников достать абсолютный адрес на функцию?
Может, как-то и можно, только непонятно зачем. Имя функции и есть абсолютный адрес её начала. Чего его доставать-то?

Сдается мне что "исходник" в данном контексте это некая прошивка, реального исходника которой нет .

Johnson070
Offline
Зарегистрирован: 05.11.2020

Нет, код я сам писал взял HEX файл и вытащил адреса оттуда

Johnson070
Offline
Зарегистрирован: 05.11.2020

А у вас есть лучше вариант как достать?

Johnson070
Offline
Зарегистрирован: 05.11.2020

А у вас есть лучше вариант как достать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да кто его знает, плата неизвестна, загрузчик неизвестен, начало загрузчика для 328 чипа  к примеру (nano) может быть как от 30720 так и иное (32256)

#ATmega328P/PA
atmega328p: TARGET = atmega328p
atmega328p: CFLAGS += $(COMMON_OPTIONS) $(UART_CMD)
atmega328p: maketargetdir
# Move bootloader location + change name if eeprom support is preset
ifneq (,$(filter 1, $(COPY_FLASH_PAGES) $(SUPPORT_EEPROM) $(BIGBOOT)))
atmega328p: LDSECTIONS = -Wl,--section-start=.text=0x7c00 -Wl,--section-start=.version=0x7ffe
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED)_BIGBOOT.hex
ifeq ($(ASM_OUTPUT), 1)
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED)_BIGBOOT.lst
endif
else
atmega328p: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED).hex
ifeq ($(ASM_OUTPUT), 1)
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED).lst
endif
endif
atmega328pa: atmega328p

Интересно, а чего это загрузчик пишется с адреса на 512 байт ниже?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Johnson070 пишет:

Нет, код я сам писал взял HEX файл и вытащил адреса оттуда

а как тогда ты не видел в Makefile вот такого:

LDSECTION  = --section-start=.text=0x3800

???

можно и из хекса взять, но это  через жопу, уж прости.

Johnson070
Offline
Зарегистрирован: 05.11.2020

Самому стыдно, за такое вот и спрашиваю.

Плата atmega 328p. модифицированный optiboot

Johnson070
Offline
Зарегистрирован: 05.11.2020

wdrakula пишет:

Johnson070 пишет:

Нет, код я сам писал взял HEX файл и вытащил адреса оттуда

а как тогда ты не видел в Makefile вот такого:

LDSECTION  = --section-start=.text=0x3800

???

можно и из хекса взять, но это  через жопу, уж прости.

 

LDSECTION  про него я не знал а как тогда с его помощью посчитать адрес в памяти,

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Johnson070 пишет:

LDSECTION  про него я не знал а как тогда с его помощью посчитать адрес в памяти,

Значит ты никак не мог собрать бутлоадер. Брехунам нет желания помогать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Johnson070 пишет:

Самому стыдно, за такое вот и спрашиваю.

Плата atmega 328p. модифицированный optiboot

у меня  вырезка как раз из Make optiboot )))

Всё таки IDE видимо неправильно память подсчитывает?
 

Изменены опции сборки, пересобираем все
Скетч использует 10466 байт (32%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 460 байт (22%) динамической памяти, оставляя 1588 байт для локальных переменных. Максимум: 2048 байт.

 

Johnson070
Offline
Зарегистрирован: 05.11.2020

Я просто изменил, а потом скомпилировал бутлоадер.

В makefile было уже все прописано

Johnson070
Offline
Зарегистрирован: 05.11.2020

Если у вас стоит OPTIBOOT 8v, то нет

Johnson070
Offline
Зарегистрирован: 05.11.2020

wdrakula пишет:

Johnson070 пишет:

LDSECTION  про него я не знал а как тогда с его помощью посчитать адрес в памяти,

Значит ты никак не мог собрать бутлоадер. Брехунам нет желания помогать.

 

Я изменил только

LDSECTIONS  = -Wl,--section-start=.text=0x7d8c -Wl,--section-start=.version=0x7ffe

и то только, потому что не влезал бутлоадер

Какой смысл мне тогда была спрашивать об этом если я не знаю и не делал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Johnson070 пишет:

А у вас есть лучше вариант как достать?

Так теперь уже и у Вас есть, я Вам ещё часа три назад писал

ЕвгенийП пишет:
Имя функции и есть абсолютный адрес её начала.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Johnson070 пишет:

wdrakula пишет:

Johnson070 пишет:

LDSECTION  про него я не знал а как тогда с его помощью посчитать адрес в памяти,

Значит ты никак не мог собрать бутлоадер. Брехунам нет желания помогать.

 

Я изменил только

LDSECTIONS  = -Wl,--section-start=.text=0x7d8c -Wl,--section-start=.version=0x7ffe

и то только, потому что не влезал бутлоадер

Какой смысл мне тогда была спрашивать об этом если я не знаю и не делал

а чего не выровнял адрес?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Имя функции и есть абсолютный адрес её начала.

а оно доступно, если я компилирую к примеру простой блинк?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кто, имя функции? Если функция есть, то доступно, наверное.

Johnson070
Offline
Зарегистрирован: 05.11.2020

Выровнял уже адрес

Johnson070
Offline
Зарегистрирован: 05.11.2020

ua6em пишет:

ЕвгенийП пишет:

Имя функции и есть абсолютный адрес её начала.

а оно доступно, если я компилирую к примеру простой блинк?

 

Доступно

Грубо наверное но можно так:

Serial.println((uint16_t)&func);

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Кто, имя функции? Если функция есть, то доступно, наверное.

я считал, что бутлодер линкуется на уровне хекса из ядра

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

я считал, что бутлодер линкуется на уровне хекса из ядра

Я отвечал на вопрос из #13. Там ничего за бутлоадер не было.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

я считал, что бутлодер линкуется на уровне хекса из ядра

Я отвечал на вопрос из #13. Там ничего за бутлоадер не было.

я так понял ТС защиту программы лепит, дописав код в бутлоадер, мой вопрос подразумевал, как обратиться к функции в бутлоадере и, попутно вылезло, что в ядре miniCore (optiboot) бутлоадер пишется по адресу, на 512 байт ниже, это как понимать? Или IDE неправильно считает верхнюю границу ПЗУ?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

 Или IDE неправильно считает верхнюю границу ПЗУ?

Ну вот почему ты занудно спрашиваешь на форуме одно и тоже, пока кто-то не взорвется ответом, вместо того, чтобы поискать самому?

В boards.txt  есть  параметр upload.maximum_size. Ничего ИДЕ не считает, а просто берет это число. А тот, кто описывал плату - сие число туда записывает. Человеческий фактор. ;)))) Если ты поменял бутлоадер, то лучше опиши новую плату с новым бутлоадером, иначе размер будет считаться неверно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

ua6em пишет:

 Или IDE неправильно считает верхнюю границу ПЗУ?

Ну вот почему ты занудно спрашиваешь на форуме одно и тоже, пока кто-то не взорвется ответом, вместо того, чтобы поискать самому?

В boards.txt  есть  параметр upload.maximum_size. Ничего ИДЕ не считает, а просто берет это число. А тот, кто описывал плату - сие число туда записывает. Человеческий фактор. ;)))) Если ты поменял бутлоадер, то лучше опиши новую плату с новым бутлоадером, иначе размер будет считаться неверно.

так это жеж miniCore, орднунг и стандарт де факто, как бы, я так считал )))
кругом одни в разной степени Гайверы, как дальше бедному крестьянину...
PS что-то в последнее время постоянно убеждаюсь, хочешь сделать хорошо - сделай сам...
PPS надо автору отписать, видимо в оптибут 8 размер загрузчика изменился
 

Johnson070
Offline
Зарегистрирован: 05.11.2020

Да вы правильно сказали все я изменял optiboot для добавления туда валидности скетча и ключа шифрования EEPROM а еще возможность блокирования запуска бутлоадера, если его заблокировать нужно будет прошивать через SPI и информация не утечет.

Ключи шифрования используются uint64_t + алгоритм

Пришлось, конечно, увеличить в фьюзах бутлоадер до 1k. А так все работает

Все это было сделано только для того, чтобы можно было прошивать МК, а в прошивке не хранились ключи шифрования, позже можно будет еще дописать запрет на прошивку через UART на уровне загрузчика

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Всё таки тема сисег не раскрыта

смотрим хекс загрузчика:

:10 7E00 00 01C0B7C0112484B790E8909361001092 2C

:107E10006100882361F0982F9A70923041F081FFC1
:107E200002C097EF94BF282E80E0C6D0E9C085E05D
:107E30008093810082E08093C00088E18093C1003C
:107E400080E18093C40086E08093C2008EE0B4D0CD
:107E5000259A84E020E33CEF91E030938500209365
:107E6000840096BBB09BFECF1D9AA8954091C000A0
:107E700047FD02C0815089F793D0813479F490D0C6
:107E8000182FA0D0123811F480E004C088E0113817
:107E900009F083E07ED080E17CD0EECF823419F40B
:107EA00084E198D0F8CF853411F485E0FACF853598
:107EB00041F476D0C82F74D0D82FCC0FDD1F82D0DC
:107EC000EACF863519F484E085D0DECF843691F58B
:107ED00067D066D0F82E64D0D82E00E011E05801AB
:107EE0008FEFA81AB80A5CD0F80180838501FA10D8
:107EF000F6CF68D0F5E4DF1201C0FFCF50E040E0DC
:107F000063E0CE0136D08E01E0E0F1E06F0182E067
:107F1000C80ED11C4081518161E0C8012AD00E5F9A
:107F20001F4FF601FC10F2CF50E040E065E0CE01BB
:107F300020D0B1CF843771F433D032D0F82E30D086
:107F400041D08E01F80185918F0123D0FA94F11070
:107F5000F9CFA1CF853739F435D08EE11AD085E934
:107F600018D08FE097CF813509F0A9CF88E024D0D1
:107F7000A6CFFC010A0167BFE895112407B600FCF3
:107F8000FDCF667029F0452B19F481E187BFE89594
:107F900008959091C00095FFFCCF8093C60008958E
:107FA0008091C00087FFFCCF8091C00084FD01C09C
:107FB000A8958091C6000895E0E6F0E098E19083EE
:107FC00080830895EDDF803219F088E0F5DFFFCF80
:107FD00084E1DFCFCF93C82FE3DFC150E9F7CF9122
:027FE000F1CFDF
:027FFE00000879
:0400000300007E007B
:00000001FF

Что видим? Грузится с адреса 0x7e00

Смотрим Make файл:
 

#ATmega328P/PA
atmega328p: TARGET = atmega328p
atmega328p: CFLAGS += $(COMMON_OPTIONS) $(UART_CMD)
atmega328p: maketargetdir
# Move bootloader location + change name if eeprom support is preset
ifneq (,$(filter 1, $(COPY_FLASH_PAGES) $(SUPPORT_EEPROM) $(BIGBOOT)))
atmega328p: LDSECTIONS = -Wl,--section-start=.text=0x7c00 -Wl,--section-start=.version=0x7ffe
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED)_BIGBOOT.hex
ifeq ($(ASM_OUTPUT), 1)
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED)_BIGBOOT.lst
endif
else
atmega328p: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED).hex
ifeq ($(ASM_OUTPUT), 1)
atmega328p: bootloaders/atmega328p/$(AVR_FREQ)/$(PROGRAM)_atmega328p_UART$(UART)_$(BAUD_RATE)_$(AVR_FREQ)_$(LED).lst
endif
endif
atmega328pa: atmega328p

Видим, что мы имеем какие-то два загрузчика, один из них бигбут оставляет под загрузчик 1 килобайт и грузится с адреса 0х7с00,
а обычный с адреса 0х7e00 как в хексе и прописано, осталось найти этот самый бигбут )))

Johnson070
Offline
Зарегистрирован: 05.11.2020

А к чему это все?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Johnson070 пишет:

А к чему это все?

мысли вслух )))

PS у автора miniCore всё правильно, видимо задел на будущее (как и ожидалось)