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

 
 
 
Reply to this topicStart new topic
> STM32F103 - Кейл. (3.85), ZI DATA - что это такое и как им управлять
Serj78
сообщение Jun 21 2010, 08:07
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



при работе линкера после успешной сборки появляется сообщение
о размере программы:
Code= .... это размер самого кода
RO-data - это, очевидно константы во флеш
RW-data размер памяти переменных в SRAM

ZI data - мне непонятно. нечто, инициализируемое нулем.Если пытаться объявить массив его размер прибавляется к этой области.
Это понять можно, эти данные по умолчанию 0.

Нашел как управлять этой областью и включить предупреждение когда она больше чем RAM..
Но почему при минимуме переменных это значение около 8000 !
Куда зарезервировано столько памяти и как это отключить?

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2010, 08:11
Сообщение #2


Гуру
******

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



Цитата(Serj78 @ Jun 21 2010, 12:07) *
Но почему при минимуме переменных это значение около 8000 !
Куда зарезервировано столько памяти и как это отключить?

Посмотрите map-файл.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2010, 09:22
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



В ZI область попадает стек и куча.
Проверьте в асмовом стартапе, какого они размера?
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jun 21 2010, 10:11
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(sonycman @ Jun 21 2010, 13:22) *
В ZI область попадает стек и куча.
Проверьте в асмовом стартапе, какого они размера?


Хм.. асмового не нашел а в подключенном сишном стек и куча по 1000
Код
;// <h> Stack Configuration
;//   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Stack_Size      EQU     0x00001000

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


;// <h> Heap Configuration
;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Heap_Size       EQU     0x00001000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2010, 10:38
Сообщение #5


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Serj78 @ Jun 21 2010, 14:11) *
Хм.. асмового не нашел а в подключенном сишном стек и куча по 1000

Ну вот Ваши 8 килобайт и нашлись - 0х1000 равно 4096 байт.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jun 21 2010, 11:01
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(sonycman @ Jun 21 2010, 14:38) *
Ну вот Ваши 8 килобайт и нашлись - 0х1000 равно 4096 байт.


Спасибо!! как говорится, сам дурак smile.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 21 2010, 12:54
Сообщение #7


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

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



Что-то в Keil какая-то путаница (а может, в моей голове).
Что означает zero-initialized?
Разве стек нужно инициализировать нулями? Или это просто подразумевается?


Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2010, 12:58
Сообщение #8


Гуру
******

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



Цитата(ViKo @ Jun 21 2010, 16:54) *
Разве стек нужно инициализировать нулями? Или это просто подразумевается?

Просто запихнули стек в ZI. Можно этого и не делать.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 21 2010, 13:05
Сообщение #9


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

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



Нашел в одной из статей хэлпа:
Uninitialized variables are placed in a section with type ZI

Может быть, ZI означает, что в этой области не размещены конкретные (статические) переменные? Стек - как раз такое...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2010, 13:44
Сообщение #10


Гуру
******

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



Цитата(ViKo @ Jun 21 2010, 17:05) *
Может быть, ZI означает, что в этой области не размещены конкретные (статические) переменные? Стек - как раз такое...

Нет. К ZI относятся как раз статические объекты без инициализаторов, например:
Код
int a;

int main(void)
{
...
}

Переменная a будет расположена в секции ZI и обнулена во время стартапа.

Стек в данном случае оказался в ZI из-за атрибута NOINIT.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 21 2010, 21:07
Сообщение #11


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aaarrr @ Jun 21 2010, 17:44) *
Стек в данном случае оказался в ZI из-за атрибута NOINIT.

То есть он обнуляться не будет, не смотря на то, что расположен в области ZI?
Или опция NOINIT просто игнорируется?

Действительно, путаница получается... sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2010, 21:17
Сообщение #12


Гуру
******

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



Цитата(sonycman @ Jun 22 2010, 01:07) *
То есть он обнуляться не будет, не смотря на то, что расположен в области ZI?

Будет, как и все остальное в ZI.

Цитата(sonycman @ Jun 22 2010, 01:07) *
Или опция NOINIT просто игнорируется?

Почему же? Просто в контексте ассемблера он означает совсем не то, что схожий по звучанию атрибут региона из скрипта линкера (UNINIT)

Assembler:
Цитата
NOINIT
Indicates that the data section is uninitialized, or initialized to zero. It contains only space reservation directives SPACE or DCB, DCD, DCDU, DCQ, DCQU, DCW, or DCWU with initialized values of zero. You can decide at link time whether an area is uninitialized or zero initialized.


Linker:
Цитата
UNINIT
Use to create execution regions containing uninitialized data or memory-mapped I/O.
Go to the top of the page
 
+Quote Post

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

 


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


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