2013-09-21 4 views
2

Я работаю над Cortex-M3. Я хочу добавить функцию (или ISR) к существующему образцу прошивки без обновления всей программы. Могу ли я скомпилировать и построить функцию без main и записать во флеш? Если я знаю адрес, где написана эта функция, могу ли я вызвать эту функцию с помощью указателя на функцию?добавление кода в существующую прошивку

У нас есть код в одном потоке и без ОС. Основная проблема заключается в том, как мы создадим среду для установки и использования приложения в этом случае.

+0

нет, мы не пытаемся залатать кто-то другой двоичный .Мы код в одном потоке и у нас нет никакой ОС и проблема заключается в том, как будет создавать условия для установки и использования это приложение в таком случае. – user1884725

+0

Большинство ваших вопросов элегантно решены с помощью * linker *. Посмотрите документацию для своего инструментария. Например, [Gnu Ld] (http://sourceware.org/binutils/docs/ld/) с инструментами 'gcc'. Вы можете извлекать символы из одного модуля и вызывать их * без * указателей функций. Несмотря на то, что вы можете сделать это на простом C без ухищрения линкера, ваш код обычно будет * ограничен *. Если у вас действительно нет ОС, я бы предположил, что у вас уже есть собственный скрипт компоновщика. –

+0

Да, вы можете. То, что вы сможете сделать, полностью зависит от того, как вы его реализуете. Infact, вы можете реализовать Reset Vector и даже дать ему новую таблицу Vector, чтобы вы могли загрузить небольшой загрузчик где-то в памяти. – nonsensickle

ответ

0

Да, вы можете.

Есть 3 файлов, которые вам необходимо понять, прежде чем вы можете быть уверены, что вы знаете, как решить эту проблему:

  1. The SAM3N4C Startup Code
  2. The DeviceVectors definition
  3. The SAM3N4C Linker Memory Region Definitions
  4. The SAM3N4C Linker Script

Я дал вам ссылки на SAM3N4 C, потому что я знаком с ним. Код можно сделать в соответствии с вашим чипом, который вы используете.

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

Краткое объяснение:

кажется, что вы еще не знакомы с тем, как работают вещи на Cortex-M3, так что я постараюсь объяснить немного.

main не является особым. Это просто функция, и это даже не первое, что выполняется. Первой функцией, выполняемой на Cortex-M3, является ваш Сброс вектора процедура обслуживания прерываний. Затем эта функция устанавливает всю вашу память, а затем вызывает main (см. The SAM3N4C Startup Code).

На Cortex-M3 есть указатель на эту специальную функцию с известным смещением от начала вашей памяти (0x00000004), и это то, что ваше оборудование использует для загрузки/запуска. По этому адресу размещена функция Reset_Handler() от The SAM3N4C Startup Code. Это делается в структуре DeviceVectors exception_table, которую вы можете видеть, инициализируется кодом, указанным в The SAM3N4C Startup Code. Эта структура содержит все указатели на функции и для вектора сброса, который должен быть расположен со смещением 0x00000004 с начала памяти, exception_table необходимо разместить в самом начале памяти. Это делается с использованием флага __attribute__ ((section(".vectors"))), чтобы разместить exception_table в разделе .vectors (см. The GNU attribute syntax).Затем он используется в The SAM3N4C Linker Script, который включает определения области памяти, приведенные в The SAM3N4C Linker Memory Region Definitions, чтобы разместить его в самом начале памяти (с использованием линии KEEP(*(.vectors .vectors.*)), которая помещается в память , первая).

Я рекомендую изучить существующие сценарии компоновщика, как они работают, потому что они дадут вам представление о том, как вы можете это сделать. Читайте больше о the GNU linker поможет вам в этом.

Кроме того, решение вы после бы, на мой взгляд, повторить это поведение, но вы должны использовать меньший «таблицы векторов», так как вам нужна одна функция ...

0

только Если вы скомпилировать код, используя " Position Independent Code ", то ваша функция может быть перемещена в любом месте в ПЗУ (Flash) или ОЗУ.

Код записи, который перемещается в память, по-прежнему не является тривиальным, и вы должны обязательно понимать архитектуру ARM и, по крайней мере, не бояться набора инструкций машины ARM. Трюк заключается в том, чтобы сначала понять, как это происходит на уровне обучения, а затем попытаться сделать то же самое с C. Конечно, есть осложнения. Перед запуском main в процедурах инициализации выполняется за кадром, которые устанавливают нулевые и ненулевые инициализированные переменные. Это зависит от вашего компилятора от того, как это происходит. Полезно запускать фиктивную программу и выполнить все ее выполнение. ПЕРЕД вы добираетесь до main.

Смотрите этот родственный вопрос: Trying to load position independent code on cortex-m3

+0

Более эффективным решением было бы написать код, зависящий от позиции для целевого местоположения. –

Смежные вопросы