Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба Добрый день. У меня есть некоторый массив. Например uint8_t my_arr[10*1024]. Можно ли заставить компилятор положить этот массив в начало или конец оперативной памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SAWushka 0 30 июля, 2019 Опубликовано 30 июля, 2019 (изменено) · Жалоба Можно, используйте директиву "#pragma location=" чтобы указать адрес Изменено 30 июля, 2019 пользователем SAWushka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба Спасибо, работает вот так: 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] Не возникнет ли проблем когда оперативная память заполнится до этого значения? Компилятор повторно по этому адресу уже не будет ложить остальных переменных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 57 minutes ago, Kalyan said: Компилятор повторно по этому адресу уже не будет ложить остальных переменных? Компилятор лишь компилирует код, а вот уже линкер размещает объекты и секции по нужным адресам. Если памяти не хватит, именно линкер накидает соотв. ошибки, поэтому проект в таком случае просто не соберется. Хотя сами по себе все файлы будут успешно компилироваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба ок. спасибо. По какому закону линкер назначает переменной адрес в рам памяти? Например у меня есть два файла 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) { } } Какую переменную линкер положит по меньшему адресу и что на это влияет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 42 minutes ago, Kalyan said: По какому закону линкер назначает переменной адрес в рам памяти? В правильно спроектированной программе это не должно иметь никакого значения )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 12 minutes ago, Forger said: В правильно спроектированной программе это не должно иметь никакого значения )) ну это да. а все таки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 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. Может есть несколько базовых правил? Например в зависимости где идет первое обращение к модулю, в зависимости от размера и дт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 2 minutes ago, Kalyan said: Может есть несколько базовых правил? Скажите, а зачем вам это нужно знать? Привязывать программу к особенностям линкера - это очень плохая идея, которая всегда заканчивается так: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 9 minutes ago, Forger said: Скажите, а зачем вам это нужно знать? Привязывать программу к особенностям линкера - это очень плохая идея, которая всегда заканчивается так: да, я понимаю. По наследству досталась реализация сериал протокола. При сборке в моем проекте оно не работает. Заметил особенность - если приемный буфер этого протокола положить по младшим адресам - чудо, все работает )). Вот мне и в самом деле интересно стало как заставить линкер разложить переменные разных модулей в том или ином порядке. Какие правила использует линкер для этого и тд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 29 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба Kalyan, иары "усираются" несчётное число лет мануалами пользователя снабжают: хотите массив в начале, хотите в конце озу, а хотите во флэше, хотите переменные по возрастанию адресов, хотите по убыванию... По всякому - один раз не спеша прочитать. Редко у кого такие подробные и внятные руководства (меню Help, так на всякий случай ;-) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 3 minutes ago, Obam said: Kalyan, иары "усираются" несчётное число лет мануалами пользователя снабжают: хотите массив в начале, хотите в конце озу, а хотите во флэше, хотите переменные по возрастанию адресов, хотите по убыванию... По всякому - один раз не спеша прочитать. Редко у кого такие подробные и внятные руководства (меню Help, так на всякий случай ;-) ) да, курить маны это выход с любой ситуации. Тут не поспоришь. Хотелось бы понять как это делает сам линкер, когда я ему ничего не указываю. У меня просто есть границы RAM и модули с переменными, по каким правилам будут определяться адреса. Такой инфы с наскока не смог найти. Может Вы примерно можете подсказать название мануала или главы где бы об этом было написано. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 5 минут назад, Kalyan сказал: Такой инфы с наскока не смог найти. Может Вы примерно можете подсказать название мануала или главы где бы об этом было написано. А Вы хоть пытались его (мануал) открывать? Если его открыть, то сразу бросается в глаза глава "Linking your application", а в ней пункты "Choosing a linker configuration file" и "Placing sections". Буквально за пару секунд находится. Да и тема эта тут на форуме уже раз сто обсасывалась со всех сторон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kalyan 0 30 июля, 2019 Опубликовано 30 июля, 2019 · Жалоба 8 minutes ago, jcxz said: А Вы хоть пытались его (мануал) открывать? Если его открыть, то сразу бросается в глаза глава "Linking your application", а в ней пункты "Choosing a linker configuration file" и "Placing sections". Буквально за пару секунд находится. Да и тема эта тут на форуме уже раз сто обсасывалась со всех сторон. Извините, а почему Ваш пост начинается с претензии? Хотите ЧСВ себе прокачать. Если Вы такой великий, зачем тратили свое драгоценное время чтоб отписать. Не царское это дело. У Вас наверняка есть дела поважнее. Это же форум, на то он и придуман чтоб здесь спрашивать и получать ответы. Давайте на главной странице большими буквами напишем "Читайте доки!!!" и все, и форум тогда и не надо. Еще бы рассказали как breakpoint юзать. На аватарках себе напишите "Читайте доки" чтоб не утруждать себя любимых )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться