Do you have a question? Post it now! No Registration Necessary
Subject
- Posted on
- Sergey A. Borshch
August 31, 2004, 1:48 pm

Приветствую всех, коллеги!
Взялся таки осваивать бесплатные инструменты. Переношу прогу с 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 по
конкретному адресу?
С уважением,
Сергей Борщ
Взялся таки осваивать бесплатные инструменты. Переношу прогу с 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
Отправлено через сервер Форумы@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]
Алексей М.
... Собака - вдруг человека...
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
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
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
С наилучшими пожеланиями, Алексей Ворошень, snipped-for-privacy@gw.bsuir.unibel.by
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

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

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

Да, так все получилось. Спасибо.
С уважением,
Сергей Борщ

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

Да, так все получилось. Спасибо.
С уважением,
Сергей Борщ
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Site Timeline
- » Как работать с термопарой?
- — Next thread in » Microcontrollers (Russian)
-
- » отладка bootloader'a
- — Previous thread in » Microcontrollers (Russian)
-
- » По моему это гениально
- — Newest thread in » Microcontrollers (Russian)
-
- » (PDF) Atlas of Upper Gastrointestinal and Hepato Surgery 2nd Ed by CLAVIEN
- — The site's Newest Thread. Posted in » Electronics (Polish)
-
- » (PDF) Aesthetic Surgery Techniques - A Case-Based Approach by James D. Fra...
- — The site's Last Updated Thread. Posted in » Embedded Programming
-