|
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, 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 15 2015, 08:53
|
Участник

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

|
Цитата(vanek18 @ Apr 14 2015, 12:48)  А вот про менеджер памяти можно поподробнее? Я всегда память распределял стандартными средствами keil. Брал в этой теме. Остаток памяти для первого банка берется из переменных в скрипте линковщика (пример для lpc1754): CODE OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") SEARCH_DIR(.) /*INCLUDE "memory.ld"*/
MEMORY { rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00020000 ram (rwx) : ORIGIN = 0x10000000, LENGTH = 0x00004000 ram1 (rwx) : ORIGIN = 0x2007C000, LENGTH = 0x00004000 }
_eram = 0x10000000 + 0x00004000;
/* Section Definitions */ SECTIONS { .text : { KEEP(*(.isr_vector)) KEEP(*(.hware)) KEEP(*(.offset)) KEEP(*(.templ)) KEEP(*(.swvers1)) KEEP(*(.swvers2)) KEEP(*(.swvers3))
*(.text*)
KEEP(*(.init)) KEEP(*(.fini))
/* .ctors */ *crtbegin.o(.ctors) *crtbegin?.o(.ctors) *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) *(SORT(.ctors.*)) *(.ctors)
/* .dtors */ *crtbegin.o(.dtors) *crtbegin?.o(.dtors) *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) *(SORT(.dtors.*)) *(.dtors)
*(.rodata*)
KEEP(*(.eh_frame*)) } > rom
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > rom __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > rom __exidx_end = .; . = ALIGN(4); _etext = .; _sidata = .; .data : AT (_etext) { _sdata = .; *(.data .data.*) . = ALIGN(4); _edata = .; } > ram
/* .bss section which is used for uninitialized data */ .bss (NOLOAD) : { _sbss = .; *(.bss .bss.*) *(COMMON) . = ALIGN(4); _ebss = .; } > ram /* heap section */ .heap (COPY): { __Heap_Start = .; _end = __Heap_Start; end = __Heap_Start; *(.heap*) __Heap_End = .;
} > ram
/* .stack_dummy section doesn't contains any symbols. It is only * used for linker to calculate size of stack sections, and assign * values to stack symbols later */ .co_stack (NOLOAD): { . = ALIGN(8); *(.co_stack .co_stack.*) } > ram /* Set stack top to end of ram , and stack limit move down by * size of stack_dummy section */ __StackTop = ORIGIN(ram ) + LENGTH(ram ); __StackLimit = __StackTop - SIZEOF(.co_stack); PROVIDE(__stack = __StackTop); /* Check if data + heap + stack exceeds ram limit */ ASSERT(__StackLimit >= __Heap_End, "region ram overflowed with stack") .data_dma (COPY): ALIGN(4) { __data_dma_start = .; KEEP(*(.dma_vars)) } > ram1 . = ALIGN(4);
__data_dma_finish = .; } а дальше: Код #define SECOND_BANK_END (0x2007FFFFUL)
void init_system_heap(void) { extern unsigned long __Heap_Start; extern unsigned long __Heap_End; extern unsigned long __data_dma_finish; system_heap.start = (heap_mcb *) (&__Heap_Start); system_heap.freem = (heap_mcb *) (&__Heap_Start); system_heap.hsize = (unsigned long) (&__Heap_End) - (unsigned long) (&__Heap_Start) + (unsigned long) 1;
heapinit(&system_heap); heapadd(&system_heap, (heap_mcb *) (&__data_dma_finish), (unsigned long) SECOND_BANK_END - (unsigned long) (&__data_dma_finish)); } второй банк добавляю соответственно после памяти выделенной для DMA буферов (__data_dma_finish) и до конца второго банка. Для себя добавлял еще обертки для freeRTOS. Только сейчас понял что SECOND_BANK_END можно считать из ram1_ORIGIN+ram1_LENGTH. Секция .co_stack соответственно используются для стека - т.к. я использую rtos то этот стек используется насколько я понимаю только функцией main до старта шедулера и в обработчиках прерываний). Код из startup_LPC17xx.c: Код #define STACK_SIZE 0x00000100 /*!< The Stack size suggest using even number */ __attribute__ ((section(".co_stack"))) unsigned long pulStack[STACK_SIZE];
...... __attribute__ ((used,section(".isr_vector"))) void (* const g_pfnVectors[])(void) = { /*----------Core Exceptions------------------------------------------------ */ (void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */ Reset_Handler, /*!< Reset Handler */ NMI_Handler, /*!< NMI Handler */ HardFault_Handler, /*!< Hard Fault Handler */ MemManage_Handler, /*!< MPU Fault Handler */ BusFault_Handler, /*!< Bus Fault Handler */ UsageFault_Handler, /*!< Usage Fault Handler */ 0,0,0,0, /*!< Reserved */ SVC_Handler, /*!< SVCall Handler */ DebugMon_Handler, /*!< Debug Monitor Handler */ 0, /*!< Reserved */ PendSV_Handler, /*!< PendSV Handler */ SysTick_Handler, /*!< SysTick Handler */ ....
Сообщение отредактировал IgorKossak - Apr 15 2015, 14:14
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
Сообщений в этой теме
vanek18 Cortex M4F проблема с памятью Apr 14 2015, 05:28 Golikov A. проверьте размер стэка, потом кучи...
Я думаю дело... Apr 14 2015, 05:34 vanek18 Цитата(Golikov A. @ Apr 14 2015, 05:34) п... Apr 14 2015, 06:29  johnshadow Цитата(vanek18 @ Apr 14 2015, 09:29) С ра... Apr 14 2015, 06:49 Golikov A. А почему у вас IRAM зарезан? на 0х400?
А вы на фу... Apr 14 2015, 10:58 seniorandre У меня такое было по молодости. Я тогда неправильн... Apr 14 2015, 11:06  seniorandre Цитата(seniorandre @ Apr 14 2015, 14:06) ... Apr 23 2015, 17:35 vanek18 Цитата(Golikov A. @ Apr 14 2015, 10:58) А... Apr 15 2015, 04:55 Golikov A. ЦитатаЯ тогда неправильный размер для переменной х... Apr 14 2015, 11:14 seniorandre ну да в лоб сделал что подобное, потом инкремент и... Apr 14 2015, 11:22 Golikov A. 0x200026b0 0x00001000 Zero RW 2 ... Apr 15 2015, 05:00 vanek18 Цитата(Golikov A. @ Apr 15 2015, 05:00) 0... Apr 15 2015, 05:33 редактор Может данные в UART идут из локального буфера, поэ... Apr 15 2015, 06:09 vanek18 Цитата(редактор @ Apr 15 2015, 06:09) Мож... Apr 15 2015, 06:24 Golikov A. на кучу нет, можно вообще без нее,
А стек какой-то... Apr 15 2015, 07:52 vanek18 Цитата(Golikov A. @ Apr 15 2015, 07:52) н... Apr 15 2015, 09:49 scifi Цитата(vanek18 @ Apr 15 2015, 12:49) Итак... Apr 15 2015, 10:15 Golikov A. ЦитатаКакой ужас! Как можно так жить? К чему э... Apr 15 2015, 10:54 vanek18 Цитата(Golikov A. @ Apr 15 2015, 10:54) А... Apr 15 2015, 11:34 scifi Кстати, выстрел наугад: у меня когда стек не был в... Apr 15 2015, 11:50 johnshadow Цитата(scifi @ Apr 15 2015, 14:50) Кстати... Apr 15 2015, 18:48 Golikov A. А стэк пишется с конца, тут ничего не изменилось?... Apr 15 2015, 11:56 aaarrr Для ARM выравнивание стека производится по границе... Apr 15 2015, 18:56 vanek18 Цитата(aaarrr @ Apr 15 2015, 18:56) Для A... Apr 23 2015, 11:46  aaarrr Цитата(vanek18 @ Apr 23 2015, 14:46) И он... Apr 23 2015, 11:56   vanek18 Цитата(aaarrr @ Apr 23 2015, 11:56) Может... Apr 23 2015, 12:06    aaarrr Цитата(vanek18 @ Apr 23 2015, 15:06) Он ч... Apr 23 2015, 12:10     vanek18 Цитата(aaarrr @ Apr 23 2015, 13:10) Вот т... Apr 23 2015, 12:18      aaarrr Цитата(vanek18 @ Apr 23 2015, 15:18) Это ... Apr 23 2015, 12:28       vanek18 Цитата(aaarrr @ Apr 23 2015, 12:28) С той... Apr 24 2015, 05:16 Golikov A. ЦитатаСдается что у Вас все таки проблема по работ... Apr 23 2015, 17:46
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|