ARDUINO Как указать компилятору адрес, где должен помещаться код?

micomy

✩✩✩✩✩✩✩
11 Дек 2023
4
0
Есть слитая прошивка с атмеги в формате *.hex . Сама прошивка занимает память контроллера меньше половины.
В свободное место надо добавить свой кусок кода с определенного адреса, чтобы при запуске сначала запускался мой кусок кода, а после него уже запускалась родная программа.
Этот свой кусок кода я напишу в С, проблем нет. Как сказать компилятору, чтобы он компилировал для конкретно указанной области FLASH памяти контроллера?
Например, чтобы кусок моего кода начинался, скажем с 3000h адреса.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
Как сказать компилятору, чтобы он компилировал для конкретно указанной области FLASH памяти контроллера?
В ардуино иде такой фокус не пройдёт. Во всяком случае, в интерфейсе пользователя такой опции нет.
 

micomy

✩✩✩✩✩✩✩
11 Дек 2023
4
0
В интерфейсе, понятно, что нет. Но неужели нет директив, которые можно в тексте программы вставить?
Типа, как в ассемблере, например .org 3000h. И начало программы будет начинаться с 3000h адреса
 

micomy

✩✩✩✩✩✩✩
11 Дек 2023
4
0
Так я и спрашиваю, как это сделать? Может в другой среде?
А если в другой, то в какой и как именно?
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,703
474
@micomy, это смотря с каким МК вы собираетесь работать. Если для атмега - то Атмел студио, например. Опять же, Си это вам не ассемблер. Непосредственных директив по размещению скомпилированного кода по конкретному адресу нет. Как вариант - дизассемблировать имеющуюся прошивку и вставить ассемблерный код в исходник на Си, который вы собрались писать. Об обмене данными меду этими кусками думайте сами. Как по мне - то проще самому написать код с нужным функционалом, чем заниматься подобной хернёй.
 
Изменено:
  • Лойс +1
Реакции: Vaqtincha

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
@micomy,
Как вы планируете работать с прерываниями? Ведь по адресам прерываний будет находиться программа из старого hex?
 

rkit

★★★✩✩✩✩
5 Фев 2021
510
127
Так я и спрашиваю, как это сделать? Может в другой среде?
А если в другой, то в какой и как именно?
Ни в какой среде, это не работа среды. Это работа компоновщика. Читай как программы на C собираются, пошагово.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
Наверное через компоновщик это правильнее, но не у всех хватит терпения в нем разобраться без большой нужды.
Иногда бывают более простые (хотя и менее правильные) способы.
В данном случае, я подумал что можно изменить значение #define _VECTORS_SIZE (26 * 4) на нужный размер, и под обработчики прерывания будет выделена требуемая область. Но оказалось, что #define _VECTORS_SIZE (26 * 4) есть, но не используется. Повторюсь - пробовал чисто из интереса, можно ли как то "по простому".
 

micomy

✩✩✩✩✩✩✩
11 Дек 2023
4
0
@Bruzzer,
Тут только ручками...
Reset-вектор заменяется на начало моего куска, а после того как он отработает, переходим на начало родной прошивки.
Я так делал для PIC-контроллера. Но там простенький кусок был. Я его на ассемблере написал.
А в нынешней задаче я замучаюсь его на ассемблере писать. Перед запуском родной программы нужно на индикатор инфу вывести и кнопки опросить.
Потому и спрашиваю, как скомпилировать для конкретного участка флешки? Я его потом в HEX-редакторе ручками перенесу в нужное место и ресет-вектор на него укажу
 

bort707

★★★★★★✩
21 Сен 2020
3,075
915
@micomy,не проще оригинальную программу переписать , добавив в начало свой код?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
@micomy,
Я не понял вашего ответа.
Вы планируете использовать прерывания в коде который вы будете писать (добавляемый код)?
Если да, то ваш добавляемый код может быть записан вместо бутлоадера.
Если в добавляемом коде прерывания не планируются. То я бы скомпилировал добавляемый код в AtmelStudio. Просто потому, что он у меня установлен, и я знаю где указать смещение. Как это сделать в Arduino я не знаю. Но скорее всего для того кто знает это совсем не трудно.
Настройка в AtmelStudio7

1702320345773.png

Добавление. Если прерывания нужны, но и бутлоадер затирать не хочется, то можно попробовать отредактировать jump адреса прерываний в исходном hex.
 
Изменено:

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Перед запуском родной программы нужно на индикатор инфу вывести и кнопки опросить.
в таком случае это практически нереально. Вам по-сути не байткод свой выполнить надо, а использовать функции и драйверы ардуино-ядра - работа с шиной дисплея, опрос пинов и пр. Адреса всего это из голого бинарника вы не вытащите, соотвественно слинковать свой код с ядром не сможете. Пишите на асме, модифицируйте бутлоадер чтобы при загрузке выполнял ваш сырой код с определенного адреса, потом передадите управление на адрес по-умолчанию откуда загрузчик стартует. Но КМК это утопическая затея, проще весь проект самому написать.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
По моему вполне реально и трудностей не представляет (если ТС умеет hex править). Если места во флешь осталось много, можно и ардуино функции использовать скомпилировав новый код в окружении Ардуино. А если прерывания не нужны, то вообще просто. (Но может быть действительно проще переписать весь проект).