|
Stm32f7 stack pointer, Медленная работа езернета при нестандартной разметке памяти |
|
|
|
Jul 17 2018, 12:43
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Всем привет.
Столкнулся с очень непонятной штукой. GCC под Stm32F767, оптимизация О2, никакой линкер оптимизации.
Разметка памяти: RAM = 0x20000000, size 0x80000, data и bss - лежит с начала RAM stack poitner задается на 0x20080000
тут все работает прекрасно, если сделать RAM = 0x20000000, size 0x80000, data и bss - лежит с 0x20010000 stack poitner задается на 0x20010000
тоже все работает хорошо, но если сделать RAM = 0x20010000, size 0x70000, data и bss - лежит с 0x20010000 (с начала RAM) stack poitner задается на 0x20010000
то никаких падений нет, но начинаются проблемы в обмене по езернету. Пакеты застревают, причем не теряются, они все есть, но почему то временами не отправляются. То есть приходит UDP запрос, ответа нет, а со следующим запросом приходит ответ на этот и на предыдущий.
При этом в разметке RAM = 0x20000000, size 0x20000, data и bss - лежит с начала RAM stack poitner задается на 0x20080000 тоже есть проблемы, но значительно реже проявляющиеся.
размеры областей роли особой не играют, то есть никаких невлезаний в область памяти нет. Из вещей мной неуправляемых это кусок работы с езернетом забранный из куба. Есть у кого какие-то идеи как может разметка памяти так драматически влиять?
|
|
|
|
|
Jul 17 2018, 14:48
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(Golikov A. @ Jul 17 2018, 17:26)  Там есть кривое место при заправке дма езернета, вероятно там и косяк... напишите плис, если разберетесь
|
|
|
|
|
Jul 18 2018, 18:14
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(jcxz @ Jul 18 2018, 12:09)  Всё тривиально: какая-то переменная наезжает на другую и пакостит ей. Когда меняете размётку, то она наезжает или на пустое место или на некритичную переменную. Вангую активное использование кучи и указателей в вашем проекте  несостоятельная теория. Регионы большие я их двигал и вместе и отдельно, там общих данных меньше чем расстояния между регионами. И не понятно почему если граница 0x10000 не наезжают, а если граница 0x20000 наезжают. Куча расположена в конце памяти после bss, и стек она не может достать.... Цитата(scifi @ Jul 18 2018, 12:17)  Там, где Ethernet, там и DMA. Если сделано криво, DMA тоже может напакостить там, куда ему лезть не положено. не объясняет изменение поведения от передвижки границы стек-память.
|
|
|
|
|
Jul 18 2018, 19:15
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Golikov A. @ Jul 18 2018, 21:14)  Куча расположена в конце памяти после bss, и стек она не может достать.... Хех!... молодо-зелено-наивно... Любая операция адресации памяти по указателю в ARM может "достать" куда угодно в пределах 4гиг. Что-то на что-то залезло внутри этих ваших больших регионов, и это "второе что-то" вдруг оказалось указателем, по которому потом выполнилась запись, куда угодно в пределах 4гиг. Повезло - попала в пустое место, не повезло - снесла нафиг что-нить полезное или не очень. А потом это полезное или не очень опять оказалось указателем (ну или каким-то индексом, по которому указатель вычисляется; или счётчиком цикла, от которого зависит размер записываемой области памяти; и ещё 100500 вариантов....). И пострадало ещё нечто полезно-бесполезное. Строите Вы своё ПО, строите как здание из доминошек, а потом одну доминошку криво ставите - и всё насмарку  PS: А насчёт дин.памяти я был прав.  И MPU наверняка даже не инициализирован. Вангую
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|