Jump to content

    

IAR stm32. массив по определенному адресу в RAM

Добрый день.

У меня есть некоторый массив. Например uint8_t my_arr[10*1024].

Можно ли заставить компилятор положить этот массив в начало или конец оперативной памяти? 

 

Share this post


Link to post
Share on other sites

Можно, используйте директиву "#pragma location=" чтобы указать адрес

Edited by SAWushka

Share this post


Link to post
Share on other sites

Спасибо, работает вот так:

define symbol __ICFEDIT_region_RAM_start__          = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__            = 0x20017FFF;
#pragma location= 0x20017BFF
__no_init  uint8_t my_arr[1024];

 

my_arr                  0x2001'7bff   0x400  Data  Gb  main.o [1]

Не возникнет ли проблем когда оперативная память заполнится до этого значения? Компилятор повторно по этому адресу уже не будет ложить остальных переменных?

Share this post


Link to post
Share on other sites
57 minutes ago, Kalyan said:

Компилятор повторно по этому адресу уже не будет ложить остальных переменных?

Компилятор лишь компилирует код, а вот уже линкер размещает объекты и секции по нужным адресам.

Если памяти не хватит, именно линкер накидает соотв. ошибки, поэтому проект в таком случае просто не соберется. Хотя сами по себе все файлы будут успешно компилироваться.

Share this post


Link to post
Share on other sites

ок. спасибо.

По какому закону линкер назначает переменной адрес в рам памяти? Например у меня есть два файла module1.c и module2.c. В этих файлах соответственно переменные uint8_t module1 = 0; module2 = 0; Листинг:

// module1.c
uint8_t module1 = 0;

void module1_init(void) {
	module1 = 1;
}

// module2.c
uint8_t module2 = 0;

void module2_init(void) {
	module2 = 2;
}

// main.c

void main(void) {
  
	module1_init();
 	module2_init();
	
  	while(1) {
    }
}

Какую переменную линкер положит по меньшему адресу и что на это влияет?

Share this post


Link to post
Share on other sites
42 minutes ago, Kalyan said:

По какому закону линкер назначает переменной адрес в рам памяти? 

В правильно спроектированной программе это не должно иметь никакого значения ))

Share this post


Link to post
Share on other sites
12 minutes ago, Forger said:

В правильно спроектированной программе это не должно иметь никакого значения ))

ну это да. а все таки?

Share this post


Link to post
Share on other sites
10 minutes ago, Kalyan said:

ну это да. а все таки?

Это ж исследовать надо. Кто будет этим заниматься? Там вполне могут быть сюрпризы. Вот, например:

When static clustering is enabled, static and global variables that are defined within the same module are arranged so that variables that are accessed in the same function are stored close to each other. This makes it possible for the compiler to use the same base pointer for several accesses.

Share this post


Link to post
Share on other sites
2 minutes ago, scifi said:

Это ж исследовать надо. Кто будет этим заниматься? Там вполне могут быть сюрпризы. Вот, например:

When static clustering is enabled, static and global variables that are defined within the same module are arranged so that variables that are accessed in the same function are stored close to each other. This makes it possible for the compiler to use the same base pointer for several accesses.

Может есть несколько базовых правил? Например в зависимости где идет первое обращение к модулю, в зависимости от размера и дт.

Share this post


Link to post
Share on other sites
2 minutes ago, Kalyan said:

Может есть несколько базовых правил? 

Скажите, а зачем вам это нужно знать?

Привязывать программу к особенностям линкера - это очень плохая идея, которая всегда заканчивается так: :dash2:

 

Share this post


Link to post
Share on other sites
9 minutes ago, Forger said:

Скажите, а зачем вам это нужно знать?

Привязывать программу к особенностям линкера - это очень плохая идея, которая всегда заканчивается так: :dash2:

 

да, я понимаю. По наследству досталась реализация сериал протокола. При сборке в моем проекте оно не работает. Заметил особенность - если приемный буфер этого протокола положить по младшим адресам - чудо, все работает )). Вот мне и в самом деле интересно стало как заставить линкер разложить переменные разных модулей в том или ином порядке. Какие правила использует линкер для этого и тд.

Share this post


Link to post
Share on other sites

Kalyan, иары "усираются" несчётное число лет мануалами пользователя снабжают: хотите массив в начале, хотите в конце озу, а хотите во флэше, хотите переменные по возрастанию адресов, хотите по убыванию... По всякому - один раз не спеша прочитать. Редко у кого такие подробные и внятные руководства (меню Help, так на всякий случай ;-) )

Share this post


Link to post
Share on other sites
3 minutes ago, Obam said:

Kalyan, иары "усираются" несчётное число лет мануалами пользователя снабжают: хотите массив в начале, хотите в конце озу, а хотите во флэше, хотите переменные по возрастанию адресов, хотите по убыванию... По всякому - один раз не спеша прочитать. Редко у кого такие подробные и внятные руководства (меню Help, так на всякий случай ;-) )

да, курить маны это выход с любой ситуации. Тут не поспоришь.

Хотелось бы понять как это делает сам линкер, когда я ему ничего не указываю. У меня просто есть границы RAM и модули с переменными, по каким правилам будут определяться  адреса.

Такой инфы с наскока не смог найти. Может Вы примерно можете подсказать название мануала или главы где бы об этом было написано. 

Спасибо

Share this post


Link to post
Share on other sites
5 минут назад, Kalyan сказал:

Такой инфы с наскока не смог найти. Может Вы примерно можете подсказать название мануала или главы где бы об этом было написано. 

А Вы хоть пытались его (мануал) открывать? Если его открыть, то сразу бросается в глаза глава "Linking your application", а в ней пункты "Choosing a linker configuration file" и "Placing sections". Буквально за пару секунд находится.

Да и тема эта тут на форуме уже раз сто обсасывалась со всех сторон.

Share this post


Link to post
Share on other sites
8 minutes ago, jcxz said:

А Вы хоть пытались его (мануал) открывать? Если его открыть, то сразу бросается в глаза глава "Linking your application", а в ней пункты "Choosing a linker configuration file" и "Placing sections". Буквально за пару секунд находится.

Да и тема эта тут на форуме уже раз сто обсасывалась со всех сторон.

Извините, а почему Ваш пост начинается с претензии? Хотите ЧСВ себе прокачать. Если Вы такой великий, зачем тратили свое драгоценное время чтоб отписать. Не царское это дело. У Вас наверняка есть дела поважнее. 

Это же форум, на то он и придуман чтоб здесь спрашивать и получать ответы. Давайте на главной странице  большими буквами напишем "Читайте доки!!!"  и все, и форум тогда и не надо. 

Еще бы рассказали как breakpoint юзать.

На аватарках себе напишите "Читайте доки" чтоб не утруждать себя любимых ))

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now