реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Cortex M4F проблема с памятью
vanek18
сообщение Apr 14 2015, 05:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 30-01-15
Пользователь №: 84 841



Добрый день! Я работаю с процессором на ядре Cortex M4F. Среда разработки - Keil 4.23. Устройство для навигации. Проблема такая: при увеличении размера прошивки, начинаются глюки. Поясню. Отлаживаюсь я через uart. Вот как должна работать программа(вотразмер прошивки:Program Size: Code=29044 RO-data=652 RW-data=184 ZI-data=13048):
Прикрепленное изображение

Следующим шагом я раскомменчиваю вызов одной функции,размер кода увеличивается(Program Size: Code=35892 RO-data=652 RW-data=184 ZI-data=13048):
Прикрепленное изображение

Затем еще вызываю одну функцию(Program Size: Code=40528 RO-data=648 RW-data=184 ZI-data=13048):
Прикрепленное изображение.
Подскажите пожалуйста,что копать,куда смотреть.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2015, 05:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



проверьте размер стэка, потом кучи...
Я думаю дело не в размере кода, а в дополнительном вызове, и как следствие в сохранении доп данных в стэк. Стэк кончается и гадит нормальную память...
Go to the top of the page
 
+Quote Post
vanek18
сообщение Apr 14 2015, 06:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 30-01-15
Пользователь №: 84 841



Цитата(Golikov A. @ Apr 14 2015, 05:34) *
проверьте размер стэка, потом кучи...

С размерами стэка и кучи я игрался уже,не привело к результатам.
У меня на борту 128 КБайт ОЗУ. Из них на стэк и кучу максимально получается выделить около 20 КБайт. Если делаю больше,то программа просто не выполняется. На данный момент размер стэка 16 КБайт, кучи - 4 КБайт.
Дело еще в том,что те 2 функции, которыя я добавлял последовательно, в процессе выполнения программы не вызываются,до них просто не доходит. Поэиому стэк и куча, я думаю не при чем.(или все-таки может быть?)
Изначально все это дело крутилось в RTX RTOS , я на нее грешил. Поэтому перебил прошивку,упростил, сделал без RTOS. Все равно та же лажа.И почему я не могу под стэк побольше памяти выделить...может дело в ОЗУ?
Go to the top of the page
 
+Quote Post
johnshadow
сообщение Apr 14 2015, 06:49
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477



Цитата(vanek18 @ Apr 14 2015, 09:29) *
С размерами стэка и кучи я игрался уже,не привело к результатам.
У меня на борту 128 КБайт ОЗУ. Из них на стэк и кучу максимально получается выделить около 20 КБайт. Если делаю больше,то программа просто не выполняется. На данный момент размер стэка 16 КБайт, кучи - 4 КБайт.
Дело еще в том,что те 2 функции, которыя я добавлял последовательно, в процессе выполнения программы не вызываются,до них просто не доходит. Поэиому стэк и куча, я думаю не при чем.(или все-таки может быть?)
Изначально все это дело крутилось в RTX RTOS , я на нее грешил. Поэтому перебил прошивку,упростил, сделал без RTOS. Все равно та же лажа.И почему я не могу под стэк побольше памяти выделить...может дело в ОЗУ?


Вы случайно CAN, USB, etc не используете? Я встречал на других arm, что фильтра того же CAN в ram лежат. Т.ч. возможно какая-то периферия вам память портит при работе. Если с DMA работаете посмотрите правильно ли настраиваете указатели куда данные складывать, не выходите ли за границы этих участков. А вообще конечно странно, что у стек не можете увеличить. ЗЫ, вы помните, что ram чаще всего на банки делиться?
Я обычно в первом банке храню статические переменные, а второй банк отдаю под кучу и стек. Остаток первого банка можно к куче добавить, если менеджер памяти позволяет. Я пользуюсь heap by zltigo - местного форумчанина (спасибо ему).
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2015, 08:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А у вас случаем нигде не настроено так что программа выполняется из RAM? Потому что больше других логических объяснений я не вижу происходящему.

В кейле можно на файлы тыкать правой кнопкой и выбирать откуда будут исполнятся... Все должно работать из флэши
Go to the top of the page
 
+Quote Post
vanek18
сообщение Apr 14 2015, 09:48
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 30-01-15
Пользователь №: 84 841



Цитата(Golikov A. @ Apr 14 2015, 09:15) *
А у вас случаем нигде не настроено так что программа выполняется из RAM? Потому что больше других логических объяснений я не вижу происходящему.

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

Вообще это конечно да. НО в моем процессоре нет флешек.
Вот собственно описание базовых регистров процессора:
Прикрепленное изображение

А вот то,как я настраиваю проект:
Прикрепленное изображение

Все остальные настройки по умолчанию, для файлов никаких дополнительных настроек не выполнялось,все выполняется из IROM1.

Цитата(johnshadow @ Apr 14 2015, 07:49) *
Вы случайно CAN, USB, etc не используете? Я встречал на других arm, что фильтра того же CAN в ram лежат. Т.ч. возможно какая-то периферия вам память портит при работе. Если с DMA работаете посмотрите правильно ли настраиваете указатели куда данные складывать, не выходите ли за границы этих участков. А вообще конечно странно, что у стек не можете увеличить. ЗЫ, вы помните, что ram чаще всего на банки делиться?
Я обычно в первом банке храню статические переменные, а второй банк отдаю под кучу и стек. Остаток первого банка можно к куче добавить, если менеджер памяти позволяет. Я пользуюсь heap by zltigo - местного форумчанина (спасибо ему).

Из периферии используется только UART,+ коррелятор через внешнюю шину.
А вот про менеджер памяти можно поподробнее? Я всегда память распределял стандартными средствами keil.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2015, 10:58
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А почему у вас IRAM зарезан? на 0х400?

А вы на функции поставили чтобы они из RАМ запускались? Или же все же из IROM?

ну еще хорошо бы поглядеть карту памяти, что там куда легло в итоге.
Go to the top of the page
 
+Quote Post
seniorandre
сообщение Apr 14 2015, 11:06
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-07-12
Из: г.Нижний Новгород
Пользователь №: 72 651



У меня такое было по молодости. Я тогда неправильный размер для переменной хранения указателя сделал, например int16 хранит адрес максимум 65535 иесли переменная уезжает из этого диапазона, то все падает. Появилось с ростом программы.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 14 2015, 11:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Я тогда неправильный размер для переменной хранения указателя сделал

А как вы это умудрились сделать? то есть

int16_t *pointer; - это указатель на 16 битное число, но я не вижу никакой возможности задать размер самого указателя? Я как то думал что это определяется архитектурой, битностью процессора и сделать это как-то самому нереально...

или же вы делали int16_t pointer;

а потом вызывали *((int *)pointer) = 10; ?

но и так беды не будет... что-то я не понимаю что вы сделали, можно чуть подробнее?
Go to the top of the page
 
+Quote Post
seniorandre
сообщение Apr 14 2015, 11:22
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-07-12
Из: г.Нижний Новгород
Пользователь №: 72 651



ну да в лоб сделал что подобное, потом инкремент или смещение.
Цитата(Golikov A. @ Apr 14 2015, 14:14) *
или же вы делали int16_t pointer;


Это было очень давно еще на Pic16, я даже не вспомню какого там было все размера, может и int8, но искал очень долго.
Мне просто с планшета тяжко описывать.
Я в polnter сохранил указатель на массив, потом взял указатель на элемент массива и записал туда значение. Ну и естественно записал не туда, т.к. массив с ростом программы уехал выше верхнего значения указателя.

Сообщение отредактировал seniorandre - Apr 14 2015, 11:30
Go to the top of the page
 
+Quote Post
vanek18
сообщение Apr 15 2015, 04:55
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 30-01-15
Пользователь №: 84 841



Цитата(Golikov A. @ Apr 14 2015, 10:58) *
А почему у вас IRAM зарезан? на 0х400?

А вы на функции поставили чтобы они из RАМ запускались? Или же все же из IROM?

ну еще хорошо бы поглядеть карту памяти, что там куда легло в итоге.

Первый КБайт зарезервинован... для каких-то тестов разработчика процессора.
И как явно для функции указать чтобы она из ROM запускалась,я думал это только для файла можно сделать?
Прикрепленный файл  Memory_map.txt ( 14.69 килобайт ) Кол-во скачиваний: 261


Цитата(seniorandre @ Apr 14 2015, 11:22) *
Я в polnter сохранил указатель на массив, потом взял указатель на элемент массива и записал туда значение. Ну и естественно записал не туда, т.к. массив с ростом программы уехал выше верхнего значения указателя.

Я к такими хитрыми способам не прибегал. Да и вообще указателями пользуюсь очень редко.

Еще исключил обработчик прерывания,где собственно все и крутилось. Просто зарядил вызов всех функций в main.
Те же самые симптомы.sad.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 15 2015, 05:00
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



0x200026b0 0x00001000 Zero RW 2 HEAP startup.o
0x200036b0 0x00004000 Zero RW 1 STACK startup.o

у вас память до адреса 20000, а вы используете ее до адреса 76B0, странно это...
может у вас табличка с памятью не от того проца, по идее у вас на стэк еще дофига места...





про первый килобайт памяти занятый разработчиком проца - тоже не очень понятно...
что за проц то такой?
Go to the top of the page
 
+Quote Post
vanek18
сообщение Apr 15 2015, 05:33
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 30-01-15
Пользователь №: 84 841



Цитата(Golikov A. @ Apr 15 2015, 05:00) *
0x200026b0 0x00001000 Zero RW 2 HEAP startup.o
0x200036b0 0x00004000 Zero RW 1 STACK startup.o

у вас память до адреса 20000, а вы используете ее до адреса 76B0, странно это...
может у вас табличка с памятью не от того проца, по идее у вас на стэк еще дофига места...

про первый килобайт памяти занятый разработчиком проца - тоже не очень понятно...
что за проц то такой?

Детище местного подразделения микроэлектроники.
Это опытный образец,поэтому косяки быть могут. Моя задача либо сделать рабочую прошивку,либо указать где косяк,и почему я не могу эту прошивку написать.
Может быть проблема в ОЗУ?
Go to the top of the page
 
+Quote Post
редактор
сообщение Apr 15 2015, 06:09
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Может данные в UART идут из локального буфера, поэтому и портятся другими функциями??


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
vanek18
сообщение Apr 15 2015, 06:24
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 30-01-15
Пользователь №: 84 841



Цитата(редактор @ Apr 15 2015, 06:09) *
Может данные в UART идут из локального буфера, поэтому и портятся другими функциями??

Дело точно не в uart,потому как я делал прошивку без его использования, и просто через порт на одну из ног процессора посылал единичку, и осциллографом смотрел, выполняется прога или нет. Она НЕ выполнялась.
Еще вопрос...хочу просто протестить RAM. Ограничение на размер стэка или кучи есть какое то?
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016