|
Cortex M4F проблема с памятью |
|
|
|
Apr 14 2015, 05:28
|
Участник

Группа: Участник
Сообщений: 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):  . Подскажите пожалуйста,что копать,куда смотреть.
|
|
|
|
|
Apr 14 2015, 06:29
|
Участник

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

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

Группа: Участник
Сообщений: 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 - местного форумчанина (спасибо ему).
|
|
|
|
|
Apr 14 2015, 09:48
|
Участник

Группа: Участник
Сообщений: 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.
|
|
|
|
|
Apr 14 2015, 11:06
|
Участник

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

|
У меня такое было по молодости. Я тогда неправильный размер для переменной хранения указателя сделал, например int16 хранит адрес максимум 65535 иесли переменная уезжает из этого диапазона, то все падает. Появилось с ростом программы.
|
|
|
|
|
Apr 14 2015, 11:14
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Я тогда неправильный размер для переменной хранения указателя сделал А как вы это умудрились сделать? то есть int16_t *pointer; - это указатель на 16 битное число, но я не вижу никакой возможности задать размер самого указателя? Я как то думал что это определяется архитектурой, битностью процессора и сделать это как-то самому нереально... или же вы делали int16_t pointer; а потом вызывали *((int *)pointer) = 10; ? но и так беды не будет... что-то я не понимаю что вы сделали, можно чуть подробнее?
|
|
|
|
|
Apr 14 2015, 11:22
|
Участник

Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 15 2015, 04:55
|
Участник

Группа: Участник
Сообщений: 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. Те же самые симптомы.
|
|
|
|
|
Apr 15 2015, 05:33
|
Участник

Группа: Участник
Сообщений: 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, странно это... может у вас табличка с памятью не от того проца, по идее у вас на стэк еще дофига места...
про первый килобайт памяти занятый разработчиком проца - тоже не очень понятно... что за проц то такой? Детище местного подразделения микроэлектроники. Это опытный образец,поэтому косяки быть могут. Моя задача либо сделать рабочую прошивку,либо указать где косяк,и почему я не могу эту прошивку написать. Может быть проблема в ОЗУ?
|
|
|
|
|
Apr 15 2015, 06:24
|
Участник

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

|
Цитата(редактор @ Apr 15 2015, 06:09)  Может данные в UART идут из локального буфера, поэтому и портятся другими функциями?? Дело точно не в uart,потому как я делал прошивку без его использования, и просто через порт на одну из ног процессора посылал единичку, и осциллографом смотрел, выполняется прога или нет. Она НЕ выполнялась. Еще вопрос...хочу просто протестить RAM. Ограничение на размер стэка или кучи есть какое то?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|