2010-11-11 1 views
0

Возможно ли запустить RUN 2 разных C-программы (т.е. 2 основных()), сохраненных во Flash (микроконтроллере), по одному за раз?Две различные программы во флэш-памяти

У меня есть код загрузчика, который является отдельной программой и находится в отдельной защищенной секции ПЗУ. Затем у меня есть моя прикладная программа, которая находится в отдельном разделе ПЗУ. Хотя, проживать в памяти не проблема, но как линкер интерпретирует это? Как переключаться между двумя программами. Это возможно?

Например: Как только я закончил загрузчик, я могу заставить его перейти к функции приложения, но как линкер знает эту функцию?

Просто добавьте, я использую Freescale HCS08 series и IDE - Codewarrior.

Далее приведена последовательность шагов: Я загружаю код загрузчика в ПЗУ. Затем этот код загрузчика требуется для загрузки моего кода приложения. И тогда мой код приложения должен взять на себя.

Загрузчик Код: Программа Область применения ROM Программа Start Application

Применение Код: Проверьте, чтобы запустить Bootloader код или само приложение.

+0

Я думаю, что ответ, если возможно, будет специфичным для микроконтроллера. Предоставьте свой целевой чип, и у вас будет больше шансов получить ответ. – nathan

ответ

0

Способ, которым я это видел, - это вставить точку входа в заголовок для приложения. Затем загрузите загрузчик с этой точки входа и перейдите к нему с помощью соответствующей встроенной команды сборки. Вам может понадобиться сценарий компоновщика, чтобы получить точку входа из приложения. Gnu ld использует ENTRY.

+0

не могли бы вы объяснить, что у меня есть две _Entrypoints, одна для загрузчика и другая для приложения. – Punit

+0

@punit: две программы связаны независимо друг от друга, а точка входа для второго - в заголовке, который первый читает. – nmichaels

1

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

Если вы не хотите переименовать основной в источнике может исказить его имя, определить или ключ компилятора:

cc -Dmain=main1 ... 

(для первой программы), и

cc -Dmain=main2 ... 

(для второго). Селекторная основная:

int main(void) { 
    if(x) return main1(); 
    else return main2(); 
} 

Затем соедините все вместе и скачайте на контроллер.

Но есть проблемы с ISR: вы не можете назначить две процедуры для одиночного вектора irq. Если векторы жестко закодированы для некоторого местоположения вспышки (как и в большинстве 8-разрядных контроллеров), вы не можете переключать ISR. Вам придется писать оболочку ISR, распознавая, какая программа запускается и вызывая соответствующий ISR.

UPD Вторая проблема заключается в том, что статически связанные переменные из первой и второй программы будут находиться в оперативной памяти одновременно, только один набор из них используется. Это может привести к слишком большому количеству ОЗУ (небольшое количество, которое часто существует в микроконтроллере).

UPD2 О, теперь я действительно понимаю. Если вы хотите связать и загрузить их отдельно, вам нужно иметь дело с картами-компоновщиками. В этом случае одинаковые имена символов (например, многие основные) не являются проблемой. В карте компоновщика вы должны определить известную точку входа [установить ее на абсолютный адрес], из которой запускается код приложения.Код запуска (обычно это код сборки) должен быть связан с этим адресом. Из селектора вы должны решить и перейти непосредственно к определенному местоположению. (Сделайте это только для загрузчика, если ваше приложение также является селектором).

Точка входа обеспечивается линкер может быть доступна программе как экстерн функция:

int app2_start(void); 

{ 
    .... /* condition check */ 
    app2_start(); /* this symbol defined in linker map, not in any source */ 
} 

Но это не адрес его основного(), потому что C RTL есть действительно делает много инициализацый (стек, инициализирован переменными , heap, IO и т. д.) до того, как начнется main().

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

+0

Спасибо за ваш вклад. Хорошо, я думаю, что не было бы проблем с Vectors, так как я сохранил их в одном месте для кода и кода приложения для загрузки. И одновременно будет выполняться либо код приложения, либо код загрузчика. Итак, ISR безопасны ?? – Punit

+0

Нет, ISR здесь небезопасны. Этот подход делает его по существу одной программой с двумя функциями. – nmichaels

+0

ISR будет так же безопасен, как вы их пишете. Я только заявил, что у вас, вероятно, не может быть двух разных ISR для одного вектора. Это одно и то же для обеих программ, это не проблема. – Vovanium

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

  • Нет связанных вопросов^_^