Да, вы можете.
Есть 3 файлов, которые вам необходимо понять, прежде чем вы можете быть уверены, что вы знаете, как решить эту проблему:
- The SAM3N4C Startup Code
- The DeviceVectors definition
- The SAM3N4C Linker Memory Region Definitions
- 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 поможет вам в этом.
Кроме того, решение вы после бы, на мой взгляд, повторить это поведение, но вы должны использовать меньший «таблицы векторов», так как вам нужна одна функция ...
нет, мы не пытаемся залатать кто-то другой двоичный .Мы код в одном потоке и у нас нет никакой ОС и проблема заключается в том, как будет создавать условия для установки и использования это приложение в таком случае. – user1884725
Большинство ваших вопросов элегантно решены с помощью * linker *. Посмотрите документацию для своего инструментария. Например, [Gnu Ld] (http://sourceware.org/binutils/docs/ld/) с инструментами 'gcc'. Вы можете извлекать символы из одного модуля и вызывать их * без * указателей функций. Несмотря на то, что вы можете сделать это на простом C без ухищрения линкера, ваш код обычно будет * ограничен *. Если у вас действительно нет ОС, я бы предположил, что у вас уже есть собственный скрипт компоновщика. –
Да, вы можете. То, что вы сможете сделать, полностью зависит от того, как вы его реализуете. Infact, вы можете реализовать Reset Vector и даже дать ему новую таблицу Vector, чтобы вы могли загрузить небольшой загрузчик где-то в памяти. – nonsensickle