Перейти к содержанию
    

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

Добрый день.

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем SAWushka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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]

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 minutes ago, Kalyan said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ок. спасибо.

По какому закону линкер назначает переменной адрес в рам памяти? Например у меня есть два файла 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) {
    }
}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 minutes ago, Kalyan said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, Forger said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Kalyan said:

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Forger said:

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Obam said:

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

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

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

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

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Kalyan сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, jcxz said:

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...