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

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

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

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

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


--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: Как в GCC функцию по конкретному адресу разместить?
Привет 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]
Алексей М.
... Собака - вдруг человека...

Как в GCC функцию по конкретному адресу разместить?
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


Re: Как в 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



--
С наилучшими пожеланиями, Алексей Ворошень, snipped-for-privacy@gw.bsuir.unibel.by



Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: Как в GCC функцию по конкретному адресу разместить?
Алекс, приветствую!

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



Quoted text here. Click to load it
Да, так все получилось. Спасибо.

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

--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Site Timeline