Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > [ARM] Расположение функций в памяти в си


Автор: Romikgy 17.11.2010, 11:28
Доброго времени суток!

главный вопрос в названии темы ))
необходимо некоторые ф-ции (допустим) положить по адресу 0х10000
а другие ф-ции по адресу 0х20000

такое можно реализовать ?
PS подсказали что такое можно сделать через линкер  но как?
PSS допустим в среде Keil или IAR 

Автор: xvr 17.11.2010, 12:44
Цитата(Romikgy @  17.11.2010,  11:28 Найти цитируемый пост)
подсказали что такое можно сделать через линкер
Можно. 

Цитата(Romikgy @  17.11.2010,  11:28 Найти цитируемый пост)
но как?
Внимательно прочтя документацию на линкер и компилятор.
В любом случае это делается заведением отдельных сегментов для разных функций, и указанием в исходниках, в какой сегмент класть нужные функции (обычно это делается через какие то #pragma), и указанию линкеру куда клась каждый сегмент (обычно это делается через скрипт линкера или командную строку)

Цитата(Romikgy @  17.11.2010,  11:28 Найти цитируемый пост)
допустим в среде Keil или IAR 
Для них увы не подскажу, могу подсказать для gcc  smile 


Автор: Romikgy 17.11.2010, 16:58
Цитата(xvr @  17.11.2010,  11:44 Найти цитируемый пост)
Для них увы не подскажу, могу подсказать для gcc 

дафай для gcc )))

Автор: xvr 17.11.2010, 20:54
Цитата(Romikgy @ 17.11.2010,  16:58)
дафай для gcc )))

Для него все в его info написанно, вот оттуда:

Компилятор:

Помещение функции в секцию (__attribute__(section...)):
Цитата

`section ("SECTION-NAME")'
     Normally, the compiler places the code it generates in the `text'
     section.  Sometimes, however, you need additional sections, or you
     need certain particular functions to appear in special sections.
     The `section' attribute specifies that a function lives in a
     particular section.  For example, the declaration:

          extern void foobar (void) __attribute__ ((section ("bar")));

     puts the function `foobar' in the `bar' section.



Линкер:
Очень много букав  smile Весь раздел 3 из info ld
Краткие выдержки:
Цитата

3.3 Simple Linker Script Example
================================

Many linker scripts are fairly simple.

   The simplest possible linker script has just one command:
`SECTIONS'.  You use the `SECTIONS' command to describe the memory
layout of the output file.

   The `SECTIONS' command is a powerful command.  Here we will describe
a simple use of it.  Let's assume your program consists only of code,
initialized data, and uninitialized data.  These will be in the
`.text', `.data', and `.bss' sections, respectively.  Let's assume
further that these are the only sections which appear in your input
files.

   For this example, let's say that the code should be loaded at address
0x10000, and that the data should start at address 0x8000000.  Here is a
linker script which will do that:
     SECTIONS
     {
       . = 0x10000;
       .text : { *(.text) }
       . = 0x8000000;
       .data : { *(.data) }
       .bss : { *(.bss) }
     }

   You write the `SECTIONS' command as the keyword `SECTIONS', followed
by a series of symbol assignments and output section descriptions
enclosed in curly braces.

   The first line inside the `SECTIONS' command of the above example
sets the value of the special symbol `.', which is the location
counter.  If you do not specify the address of an output section in some
other way (other ways are described later), the address is set from the
current value of the location counter.  The location counter is then
incremented by the size of the output section.  At the start of the
`SECTIONS' command, the location counter has the value `0'.

   The second line defines an output section, `.text'.  The colon is
required syntax which may be ignored for now.  Within the curly braces
after the output section name, you list the names of the input sections
which should be placed into this output section.  The `*' is a wildcard
which matches any file name.  The expression `*(.text)' means all
`.text' input sections in all input files.

   Since the location counter is `0x10000' when the output section
`.text' is defined, the linker will set the address of the `.text'
section in the output file to be `0x10000'.

   The remaining lines define the `.data' and `.bss' sections in the
output file.  The linker will place the `.data' output section at
address `0x8000000'.  After the linker places the `.data' output
section, the value of the location counter will be `0x8000000' plus the
size of the `.data' output section.  The effect is that the linker will
place the `.bss' output section immediately after the `.data' output
section in memory.

   The linker will ensure that each output section has the required
alignment, by increasing the location counter if necessary.  In this
example, the specified addresses for the `.text' and `.data' sections
will probably satisfy any alignment constraints, but the linker may
have to create a small gap between the `.data' and `.bss' sections.

   That's it!  That's a simple and complete linker script.


PS. В attache info на ld целиком

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)