2014-10-01 3 views
1

Я использую S5PV210, чип Sum8 cortexA8. В своем документе программа начнет выполнение с 0xd0200010. Теперь мне удалось запустить мою программу. Но у меня все еще есть некоторые вопросы.Как обеспечить функцию входа по фиксированному адресу руки с открытым металлом?

Сначала я использовал ссылку «-Ttext 0xd02000010 -e main» и подумал, что она поместит главную функцию в адрес 0xd0200010. Но я обнаружил, что он просто поместил раздел .text на 0xd0200010. Если я изменил порядок функции в моем .c файле, хотя раздел .text все равно будет помещен в 0xd0200010, но основная функция не будет на этом адресе, а «-e main» вообще не работает.

Итак, как я могу сделать главную функцию на 0xd0200010? Могу ли я сделать это просто командой компилятора и компоновщика?

+0

Как правило, вы пишете ассемблер, который устанавливает среду «C» (например, обнуление данных BSS, установка стека и т. Д.). Затем вы переходите к основной рутине 'bl _main'. Этот ассемблерный код находится в уникальном разделе, и вы используете собственный скрипт компоновщика, который позиционирует этот код в начале изображения. Для изображений * ELF * (не двоичных) вы можете использовать компоновщик 'ENTRY (start)', чтобы указать, куда идет начальный контроль. Это не работает для двоичного кода, и в значительной степени вы должны использовать [собственный скрипт компоновщика] (https://sourceware.org/binutils/docs/ld/Scripts.html). В Интернете есть различные примеры. –

+0

Да, ты прав ... Я тоже понял, спасибо – demonguy

ответ

1

Я работал его ..

эльф файл используется для платформы OS, то точка входа определяется является заголовок эльфа файла.

Но для системы с неподвижным металлом он не может прочитать информацию об эльфийском файле, поэтому он должен быть преобразован в двоичный файл, который не содержит информации о точке входа. Иными словами, не имеет понятия «точка входа». Таким образом, основной параметр не будет работать для двоичного файла.

Есть много способов, чтобы поместить функцию C на фиксированной address.I просто опубликовать свое решение об этом

  1. объявить основную функцию в определенной пользователем секции

    INT основной() атрибут ((раздел (". main")))

  2. Используйте скрипт компоновщика, поместите раздел .main по нужному адресу.

    СЕКЦИИ { = 0x0000 .text:. (. Текст) { led.o (.main) * } ........ }