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

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

"IAR C/C++Development Guide", а для общей ориентировки "EmbeddedWorkbench IDE Guide". Всё что "...Reference Guide" - всё в жилу ;-)
В C/C++DevGuide в части 2 "The linker configuration file" и "Section reference" это прям вот "по каким правилам будут определяться адреса", что самое занятное вы же их и будете себе устанавливать, а не "мифический" линкер.

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


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

18 minutes ago, Kalyan said:

Давайте на главной странице  большими буквами напишем "Читайте доки!!!"

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

4 hours ago, Kalyan said:

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

Конкретно этот вопрос на форуме поднимался "сотни раз". Достаточно просто поискать. Пример поиска.

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


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

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

Это же форум, на то он и придуман

Это форум да, но форум профессионалов. А не детсадовская песочница. И вопросы типа "лень прочитать доку" - тут не приветствуются. Да и раздел "для начинающих" здесь в другом месте.

Кроме того - вы утверждали что читали мануал, а судя по вашим вопросам - даже не открывали его.

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


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

1 час назад, Kalyan сказал:

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

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

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


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

2 hours ago, jcxz said:

Это форум да, но форум профессионалов. А не детсадовская песочница. И вопросы типа "лень прочитать доку" - тут не приветствуются. Да и раздел "для начинающих" здесь в другом месте.

Кроме того - вы утверждали что читали мануал, а судя по вашим вопросам - даже не открывали его.

Я думаю Вы в корне не правы.  

Есть правила этого форума. Вот ссылкочка. В правилах не написано что это закрытый клуб професиональных дядек к которому нету доступа лицам коие такими не являются. На главной странице тоже нету предупреждений о запрете задавать те или иные вопросы (типо "Ламер - иди отсюдова! Не пиши здесь постов" и тд.). Согласитесь, ведь тогда упадет трафик и будут изымать плату за доступ к ресурсу. Это свободный ресурс, Вы не есть владельцем ресурса (я надеюсь) и  у меня здесь столько же прав сколько и у Вас. 

Следовательно, должен быть конструктив, а не хамское отношение и попытка навязывать свои нарцисссические представления (так написано в правилах). 

Если вопрос уже здесь неоднократно обсуждался - заблокируйте мой пост с самого начала. Или же в пример могу привести  http://www.cyberforum.ru. Там в такой ситуации не оскорбляют своего пользователя, а приводят ссылки на подобные темы. 

Модераторов прошу обратить внимание на нарушения правил данного форума, а именно - оскорбления в мой адрес. 

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


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

16 hours ago, Kalyan said:

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

Это пляски с бубном. Правильные пацаны сначала находят первопричину, а потом её устраняют. Например, бывает DMA, и оно не в любой памяти работает. Или особо укуренная адресная арифметика. В общем, копайте отсюда и до обеда.

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


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

14 minutes ago, scifi said:

Это пляски с бубном. Правильные пацаны сначала находят первопричину, а потом её устраняют. Например, бывает DMA, и оно не в любой памяти работает. Или особо укуренная адресная арифметика. В общем, копайте отсюда и до обеда.

да, вы правы. Первопричина найдена. Это как раз таки и DMA. Теряются байты с потока. Идет поток байт, заполняется буфер, дма останавливается, перекидает их со своего буфера в логику, потом опять начинает складывать байты с потока. Это узкое место в реализации, и с увеличением адреса буфера происходить задержка перед следующим включением дма, и оно теряет несколько байт (1 байт) с потока. 

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


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

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

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

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


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

9 часов назад, Kalyan сказал:

Теряются байты с потока. Идет поток байт, заполняется буфер, дма останавливается, перекидает их со своего буфера в логику, потом опять начинает складывать байты с потока. Это узкое место в реализации, и с увеличением адреса буфера происходить задержка перед следующим включением дма, и оно теряет несколько байт (1 байт) с потока. 

У DMA есть  Circular mode и прерывания по заполнению половины буфера (HTIE: Half transfer interrupt enable) и всего буфера (TCIE: Transfer complete interrupt enable).

С ними DMA запустив один раз можно потом вообще не трогать, только в прерываниях обрабатывать очередную половинку буфера.

 

 

 

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


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

Походу, тому программисту, который после вас будет работать придётся ещё сложнее ...

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


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

On 7/30/2019 at 6:28 PM, Kalyan said:

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

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

On 7/30/2019 at 6:28 PM, Kalyan said:

Вот мне и в самом деле интересно стало как заставить линкер разложить переменные разных модулей в том или ином порядке. Какие правила использует линкер для этого и тд.

    Линкер следует правилам описанным в линкер скрипте(где-то это называется скаттер файл) который формируется Вами(разработчиком), в простых случаях используется стандартный линкер скрипт где описана все FLASH, RAM и прочая память + ее возможности read\write\executeble. Так же, в линкер скрипте присутствует описание секций(регионов\сегментов) которые размещают в соответствующей памяти.
    Например, секция .text, данная секция содержит код программы и это все складывается во FLASH память, есть такие секции .data или .cstack или .bss или .ZI, в данные секции помещаются определенные типы R\W переменных а секции размещаются в RAM. Назначение и название секций могут быть разные в зависимости от используемой системы сборки(gcc, armcc, iar, clang). Главное понимать что определенный тип данных лежит в той или иной области. И никогда нельзя сказать какая глобальная переменная будет лежать реньше\позже другой так это уже зависит от реализации самого линкера и таких опций как оптимизация, упаковка, выравнивание данных и пр.
    А вот про назначение секций, боюсь я тоже отправлю Вас почитать manual, тут двумя словами не обойтись.
 
image.png.147cd92f37140347b8fba54b110de88a.png

On 7/30/2019 at 7:20 PM, Kalyan said:

Извините, а почему Ваш пост начинается с претензии?

    Есть здесь такие, не стот брать в голову. Бог им судья! :acute:

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


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

On 7/30/2019 at 9:50 PM, Kalyan said:

Добрый день.

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

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

 

 

u8 *my_arr=(u8*)0xC0000000;

for(u32 i=0;i<10*1024UL;i++)my_arr[i]=i;

Кросс-платформенный код, независящий от компиляторов и сред.

ЗдОрово, да :)

Только sizeof(my_arr) вернёт 4 на 32-битной платформе, а не 10*1024UL как хотелось... Но мы не ищем лёгких путей, да?? :)

 

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


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

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

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

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

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

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

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

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

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

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