|
|
  |
задание размера стеков, как узнать какой размер стэка нужно задавать |
|
|
|
May 15 2010, 20:21
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Цитата процессор перенес массив констант для инициализации из флэш-памяти в стек Код void f(...) { static const unsigned char a [] = {0x01, 0x02, 0x03 }; } Если кто-то забыл static написать, так и будет.
Сообщение отредактировал Genadi Zawidowski - May 15 2010, 20:21
|
|
|
|
|
May 18 2010, 19:42
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(aaarrr @ May 18 2010, 18:31)  А Вы окошечки сообщений посмотрите: он, наверное, ругается на запись/чтение левых адресов. Точно, пишет! В окне command: *** error 65: access violation at 0x6C000070 : no 'read' permission а потом и на запись аналогично ругается. Вообще, складывается впечатление, что в окне Options/Target Keil 4.10 имеется глюк. Привожу все варианты установок и результат их действия после запуска программы в симуляторе. Адрес 0x6C000070 - первый из используемых (регистр контроллера ЖКИ), адрес 0x6C020000 - память контроллера ЖКИ. Код default--Start-------Size-------NoInit--access_violation--R13(SP) ---------0x6c000000--0x40000------------0x6C000070--------0x2000041C ---------0x6c000000--0x40000-----v------0x6C000070--------0x2000041C -v-------0x6c000000--0x40000------------0x6C020000--------0x6C000414 -v-------0x6c000000--0x40000-----v------0x6C020000--------0x6C000414 Т.е., отмечаю default - там создается стек, NoInit - вообще никак не влияет. А size там в каких единицах задавать, в байтах? Придется изучать синтаксис scatter файла... Пока отформатировал данное послание, упарился...
|
|
|
|
|
May 19 2010, 11:09
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ViKo @ May 19 2010, 14:28)  Отмечаю v default регион start 0x6c000000 size 0x40000, имею в scatter файле: ... Запускаю симулятор, останавливается с ошибкой *** error 65: access violation at 0x6C020000 : no 'read' permission Это как? Разрешена же область! Scatter-файл относится к линкеру, а ошибка к симулятору. Если хотите, чтобы последний не ругался на записи по левым адресам, создайте ini-файл со строкой: Код map 0x6c000000, 0x6c0fffff READ WRITE И подцепите его в качестве Initialization File для симулятора.
|
|
|
|
|
Apr 3 2014, 03:56
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Возвращаюсь к теме. Хочу для STM32F303 в Keil задать стек в конце CCM-RAM. Но что-то не выходит. Как это сделать, и можно ли? В startup.s или в *.sct? Хочу понять строки в startup.s CODE Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ... Heap_Size EQU 0x00000000
AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit ... ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler ... ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap
LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR
ALIGN
ENDIF
|
|
|
|
|
Apr 3 2014, 08:36
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Добавляю в *.sct ARM_LIB_STACK 0x10002000 EMPTY -0x0400 { } не помогает. Вау - работает, вижу в отладчике SP = 0x10002000 Но когда всю обычную RAM (не CCMRAM) пытаюсь забрать под массив, не складывается. Т.е. теперь вопрос - как разместить остальные переменные в CCMRAM. В неё же у меня и код перегружается, и из нее выполняется. В-общем, что-то со стеком, сначала в основной памяти размещается, а потом в CCM. Приступаю штудировать доку по линкеру.
Кстати, в Keil для IRAM1 указан неправильный размер, надо A000 (40k) вместо C000 (48k). Из-за этого компилируется без ошибок, а после запуска вываливается в HardFault. А все потому, что стек размещается сразу после всех переменных (+ куча, если есть), а не в конце RAM. И когда память не была забита, хватало места и для стека.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|