Главное - это просто функция. Вы можете переименовать его и написать другой файл, который вызывает любой из них.
Если вы не хотите переименовать основной в источнике может исказить его имя, определить или ключ компилятора:
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 может стать недоступным.
Я думаю, что ответ, если возможно, будет специфичным для микроконтроллера. Предоставьте свой целевой чип, и у вас будет больше шансов получить ответ. – nathan