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

 
 
> 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
 
Start new topic
Ответов
Golikov A.
сообщение Apr 14 2015, 08:15
Сообщение #2


Гуру
******

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



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

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


Участник
*

Группа: Участник
Сообщений: 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
johnshadow
сообщение Apr 15 2015, 08:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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