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

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

Взялся таки осваивать бесплатные инструменты. Переношу прогу с 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 по конкретному адресу?

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

Reply to
Sergey A. Borshch
Loading thread data ...

Привет 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] Алексей М. ... Собака - вдруг человека...

Reply to
Alex Mogilnikov

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

Reply to
Alexey Boyko

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

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

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

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

Reply to
Sergey A. Borshch

Добрый день!

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

Reply to
Alexey Voroshen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.