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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> задание размера стеков, как узнать какой размер стэка нужно задавать
Genadi Zawidowsk...
сообщение May 15 2010, 20:21
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 15 2010, 21:46
Сообщение #17


Универсальный солдатик
******

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



Неправильно сказал - не через стек переписывает, а через память, отведенную под стек. Переносит указатель на 0x040, и в свободной области создает буфер для этих констант. Потом обратно стек восстанавливает.
А за static - спасибо, попробую.
upd. Попробовал - помогло. И размер кода уменьшился (естественно smile.gif)
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 18 2010, 07:55
Сообщение #18


Универсальный солдатик
******

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



Можно вопрос, не по теме, но непосредственно вытекающий из предыдущего.
Почему симулятор Keil останавливается на командах, которыми я инициализирую контроллер ЖКИ на внешней шине, и ходит только по шагам?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2010, 15:31
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А Вы окошечки сообщений посмотрите: он, наверное, ругается на запись/чтение левых адресов.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 18 2010, 19:42
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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 файла...
Пока отформатировал данное послание, упарился...
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 19 2010, 10:28
Сообщение #21


Универсальный солдатик
******

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



А на такой вопрос подскажите, в чем дело (может, и предыдущий разрешится):
Отмечаю v default регион start 0x6c000000 size 0x40000, имею в scatter файле:
RW_RAM3 0x6C000000 UNINIT 0x00040000 { ; RW data
.ANY (+RW +ZI)
Стек, как и раньше, закидывается в 0x6c000414.
Запускаю симулятор, останавливается с ошибкой
*** error 65: access violation at 0x6C020000 : no 'read' permission
Это как? Разрешена же область! Или со стеком связано? Ведь перед этим обращался к адресам 0x6c000000... без ошибок.
А еще есть эта... куча...!?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 19 2010, 11:09
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 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 для симулятора.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 19 2010, 11:21
Сообщение #23


Универсальный солдатик
******

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



Цитата(aaarrr @ May 19 2010, 14:09) *
Scatter-файл относится к линкеру, а ошибка к симулятору.

Я думаю, симулятор знает, что сделал линкер. Иначе он бы останавливался при первом же обращении в эту область, по адресу 0x6c000070.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 19 2010, 11:35
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 19 2010, 15:21) *
Я думаю, симулятор знает, что сделал линкер.

А вот линкеру как раз знать об этой области ничего не надо - вы же не хотите, чтобы по адресам регистров LCD он распихал данные программы.
Просто объясните симулятору, что такая область есть. Как это делается я написал выше, только диапазон адресов расширьте.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 19 2010, 11:49
Сообщение #25


Универсальный солдатик
******

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



Цитата(aaarrr @ May 19 2010, 14:35) *
А вот линкеру как раз знать об этой области ничего не надо - вы же не хотите, чтобы по адресам регистров LCD он распихал данные программы.
Просто объясните симулятору, что такая область есть. Как это делается я написал выше, только диапазон адресов расширьте.

Спасибо, получилось! А я еще недоумевал, почему в симуляторе останавливается, а в железе работает.
А внешние ОЗУ и ПЗУ мне линкеру указывать?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 19 2010, 11:54
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 19 2010, 15:49) *
А внешние ОЗУ и ПЗУ мне линкеру указывать?

Если в них надо разместить код/данные - то указывать. Если они просто существуют, но не используются, то и указывать не за чем.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 19 2010, 12:07
Сообщение #27


Универсальный солдатик
******

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



В-общем, эта птичка default именно для этого и создана - подключать или отключать заданный регион памяти в проект. Если ее убрать в опциях Target, в scatter файле заданной цифрами области не будет.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 3 2014, 03:56
Сообщение #28


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 3 2014, 07:32
Сообщение #29


Универсальный солдатик
******

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



Ого, блин! В AN4296 "Overview and tips for using STM32F303/313xx CCM RAM..." Rev.2 в разделе KEIL ошибочно заменили Figure 11 на такую же из IAR (Figure 2). Без этой картинки нихрена не понять.
К счастью, нашел в корзине удаленный файл Rev.1.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 3 2014, 08:36
Сообщение #30


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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. И когда память не была забита, хватало места и для стека.
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 June 2025 - 18:06
Рейтинг@Mail.ru


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