Связывание дополнительного кода микроконтроллера (AVR) с уже существующим кодом

Постановка задачи: В микроконтроллере AVR необходимо иметь две части кода, фиксированную, которая всегда есть и не меняется (часто), и переходную, то есть (не очень) часто заменяемую или доп. Задача состоит в том, чтобы дать временному коду возможность вызывать функции и обращаться к глобальным переменным фиксированного — и наоборот.

Совершенно очевидно, что должны быть специальные методы для фиксированного кода для доступа к временному коду - например, вычисление указателей функций в ОЗУ и использование только их для вызова процедур временного кода.

Для вызова в обратном направлении я думал о связывании временного кода с существующим файлом .elf фиксированного кода.

Я использую набор инструментов avr-gcc (как в Ubuntu 20.20), gcc версии 5.4.0.

Что я уже пробовал:

  1. добавление '-shared' в качестве аргумента ссылки при построении фиксированного кода - похоже, не поддерживается для AVR (компоновщик сообщает об ошибке).

  2. добавление вместо этого '-Wl,--export-dynamic' в качестве аргумента ссылки - кажется, что он игнорируется, в эльфе не появляется раздел .dynsym.

В исправленном коде elf все еще есть раздел .symtab - можно ли его как-то использовать для ссылки на него?

Примечание: мое разделение на «фиксированный» и «переходный» код не имеет ничего общего с загрузочной областью какого-либо микроконтроллера AVR, загрузка — это то, что меня здесь не волнует.

Примечание 2. Вопрос очень похож на этот, но дает четкое объяснение необходимости.


person lvd    schedule 20.11.2020    source источник
comment
Загрузчик Optiboot предлагает функцию, вызываемую приложением. см. optiboot.h: github.com/Optiboot/optiboot /blob/master/optiboot/examples/ и исходный код optiboot   -  person Juraj    schedule 20.11.2020
comment
Не пытайтесь использовать динамические библиотеки, это причудливая вещь для реальных ПК с операционными системами. Вы должны быть в состоянии делать на AVR все, что хотите, но есть множество мелких проблем, которые нужно решить, и решение этих проблем, вероятно, потребует от вас знакомства с AVR-сборкой, вашим C-компилятором и вашим компоновщиком. Вам нужны методы, чтобы выяснить, какой адрес памяти содержит функцию, которую вы хотите вызвать, и вы должны убедиться, что функции в вашей программе не пытаются использовать одни и те же участки ОЗУ для конфликтующих целей.   -  person David Grayson    schedule 20.11.2020


Ответы (1)


Вы должны забыть все большие компьютерные знания. 8-битные AVR — это очень быстрые микроконтроллеры. Код должен быть связан статически. Другого пути нет.

person 0___________    schedule 20.11.2020
comment
но вы можете вызвать функцию в любом месте флэш-памяти, если у вас есть адрес (в векторной таблице в известном месте) - person Juraj; 20.11.2020
comment
@Juraj это вариант для более крупных UC, таких как ARM. - person 0___________; 20.11.2020
comment
Я имел в виду классический AVR ATmega - person Juraj; 20.11.2020
comment
@Juraj это крошечный 8-битный UC. - person 0___________; 20.11.2020
comment
Я не выдвигаю гипотез и не теоретизирую. я сделал это - person Juraj; 21.11.2020
comment
@Юрай зачем? - person 0___________; 21.11.2020
comment
записывать на флешку с функциями в загрузчике, т.к. из области приложения не возможно записать во флеш-память. загрузчик Optiboot имеет функцию do_spm() для приложения, и я добавил функцию copy_flash_pages. - person Juraj; 21.11.2020