Как в GCC функцию по конкретному адресу разместить?

Aug 31, 2004 4 Replies

Приветствую всех, коллеги!



Взялся таки осваивать бесплатные инструменты. Переношу прогу с IAR под WinAVR. Есть у меня несколько функций, которые от заказчика к заказчику (от таргета к таргету) меняются местами. Сделано так потому, что моя часть кода находится в адресах загрузчика и закрыта от чтения заказчиком. А он свою прогу заливает в остальную память и вызывает мои функции по одному ему известным адресам. А я нужную мне информацию беру вызывая их функции по известным мне и назначенных им адресам. Это чтобы заказчики друг у друга устройства не воровали. Ну вот захотели они так. Итак у меня есть несколько функции, и есть файл в котором собраны все "заказчикозависимые" константы: customer1.h: #define _POLY_ 0x8408 #define _CRC_INIT_ 0x0000 // User Routines remap #define _INC_PTR_ 0x17E4 #define _SHIFT_MASK_ 0x17EE #define _BITRATE_ 0x17F2 #define _FREQ_0_ 0x17F6 #define _FREQ_1_ 0x17FA // Driver Routines remap #define _SYNTH_INIT_ 0x1832 #define _TX_PUTCHAR_ 0x1834 #define _GET_SERIAL_ 0x1836



теперь мне надо функцию LDI R16,0 RET разместить по абсолютному адресу _FREQ_1_. Я пробую .section .text .align 2 .org _FREQ_1_ LDI R16,0 RET он почему-то _FREQ_1_ отсчитывает не от начала секции .text, а от первого свободного байта в этой секции, т.е. .org работает как .skip, да еще к тому же без .align вставляет nop перед моим кодом. В общем, как мне правильно описать компилятору то, что я хочу. И второй аналогичный вопрос будет - как его заставить кое-какие переменные разместить в секции .bss по конкретному адресу?



С уважением, Сергей Борщ



Привет Sergey!

31 Aug 04 17:48, Sergey A. Borshch писал All:

SB> Взялся таки осваивать бесплатные инструменты.

[...]

SB> #define _FREQ_1_ 0x17FA

SB> теперь мне надо функцию SB> LDI R16,0 SB> RET SB> разместить по абсолютному адресу _FREQ_1_. Я пробую SB> .section .text SB> .align 2 SB> .org _FREQ_1_ SB> LDI R16,0 SB> RET

Если ты пишешь на ассемблере, то при чем тут GCC?

Во-первых, как мне кажется, для размещения чего-либо по фиксированным адресам не надо использовать секцию .text - ее использует обычно весь перемещаемый код. Размести свои функции в какую-нибудь другую секцию, например .freq_1_section, а в линкерном скрипте линкеру укажи, что секцию .freq_1_section надо разместить по адресу 0x17fa. ИМХО это наиболее прямой путь.

SB> И второй SB> аналогичный вопрос будет - как его заставить кое-какие переменные SB> разместить в секции .bss по конкретному адресу?

И на второй вопрос ответ аналогичный - никак. Использую другую секцию.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Собака - вдруг человека...

Hello Sergey.

31 Aug 04 19:35, Alex Mogilnikov wrote to you:

AM> Во-первых, как мне кажется, для размещения чего-либо по AM> фиксированным адресам не надо использовать секцию .text - ее AM> использует обычно весь перемещаемый код. Размести свои функции в AM> какую-нибудь другую секцию, например .freq_1_section, а в линкерном AM> скрипте линкеру укажи, что секцию .freq_1_section надо разместить по AM> адресу 0x17fa. ИМХО это наиболее прямой путь.

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

Alexey

Алекс, приветствую!

Ну если из make вызывается только GCC, то как мне его обзывать? :-) Я же написал, что только начал :-) К тому же на асме только небольшой модуль, "связывающий" две части проекта, остальное на С

Да, так все получилось. Спасибо.

С уважением, Сергей Борщ

Добрый день!

AB> Hello Sergey. AB> 31 Aug 04 19:35, Alex Mogilnikov wrote to you: AM>> Во-первых, как мне кажется, для размещения чего-либо по AM>> фиксированным адресам не надо использовать секцию .text - ее AM>> использует обычно весь перемещаемый код. Размести свои функции в AM>> какую-нибудь другую секцию, например .freq_1_section, а в линкерном AM>> скрипте линкеру укажи, что секцию .freq_1_section надо разместить по AM>> адресу 0x17fa. ИМХО это наиболее прямой путь. AB> Подтверждаю. Hужно изучить язык скриптов LD. Скопировать стандартный линкерный AB> скрипт, и подправить под свои нужды, размещая секции где угодно. AB> Alexey

вот Вам работающий пример на последнем WinAVR (ATmega32):

С:

// Один сектор отведем для сохранения количества записей U8 WriteCounter[ SPM_PAGESIZE-2 ] // хранение данных __attribute__ ((section (".writecounter")));

BOOTLOADER_SECTION // расположение функции void CalibrationData_Write( U8 num ) { }

Make:

# Linker flags (passed via GCC). LDFLAGS = -Wl,-Map=$(TARGET).map,--cref,--section-start=.bootloader=0x7200,--section-start=.calibration=0x7400,--section-start=.writecounter=0x7F80

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required