2015-03-19 5 views
1

Интересно, есть ли способ загрузить функцию C с ее данными во время выполнения в текстовый сегмент работающей системы микроконтроллеров. После того, как функция помещается в текстовый сегмент и данные хранятся в сегменте данных, в главном приложении вызывается указатель функции на новую загруженную функцию. Функциональность будет похожа на загрузчик, за исключением загрузки всего двоичного файла перед запуском. Я знаю, что вы можете использовать функции разбрасывания компоновщика компоновщика, чтобы поместить указатель на фиксированный адрес или изменить выравнивание в разделах. Кто-нибудь знает, возможно ли это, и если не почему?Заменить функцию за указателем функции на микроконтроллере во время выполнения

Большое спасибо

+0

Программное обеспечение на жестких дисках делает что-то подобное. Как и в случае с ПК, есть загрузочный диск, который читается в главном коде при запуске, но есть также набор «наложений», группа функций, закодированных для работы по определенному адресу, которые динамически загружаются для неавиационных типов , таких как диагностика. Это понятие относится к 1960-м годам и небольшим компьютерам, таким как IBM 1130, которые используют наложения для библиотечных функций, загружая функции с диска в процессе вызова функции динамической библиотеки. – rcgldr

+0

Для какой цели? Все чипы ARM Cortex и серии 8051 не выполняют программных различий между ОЗУ и FLASH, поэтому вы можете легко создать функцию в ОЗУ во время выполнения и вызвать ее. AVR и PIC не могут выполнить из RAM, поэтому вам придется перезаписать FLASH так же, как это делает загрузчик. – Jon

+0

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

ответ

1

Технически это возможно. Имейте в виду, что любое решение будет нестандартным, а не переносным и очень сложным.

Многие контроллеры могут выполнять только код из памяти только для чтения, что делает всю концепцию динамической нагрузки проблематичной:

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

  • вам нужно будет очистить кеш инструкций (опять же, многие контроллеры полагаются на кеш инструкций всегда действительным).

В любом случае вам необходимо убедиться в том, что заменяемая функция не имеет связанного с ней кадра стека. Очень сложно обеспечить применение в многопоточной системе.

Любая конкретная архитектура может предложить больше ловушек.