Перейти к содержанию

    

STM32F103 - Кейл. (3.85)

при работе линкера после успешной сборки появляется сообщение

о размере программы:

Code= .... это размер самого кода

RO-data - это, очевидно константы во флеш

RW-data размер памяти переменных в SRAM

 

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

Это понять можно, эти данные по умолчанию 0.

 

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

Но почему при минимуме переменных это значение около 8000 !

Куда зарезервировано столько памяти и как это отключить?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Но почему при минимуме переменных это значение около 8000 !

Куда зарезервировано столько памяти и как это отключить?

Посмотрите map-файл.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ZI область попадает стек и куча.

Проверьте в асмовом стартапе, какого они размера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Хм.. асмового не нашел а в подключенном сишном стек и куча по 1000

Ну вот Ваши 8 килобайт и нашлись - 0х1000 равно 4096 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ну вот Ваши 8 килобайт и нашлись - 0х1000 равно 4096 байт.

 

Спасибо!! как говорится, сам дурак :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то в Keil какая-то путаница (а может, в моей голове).

Что означает zero-initialized?

Разве стек нужно инициализировать нулями? Или это просто подразумевается?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Разве стек нужно инициализировать нулями? Или это просто подразумевается?

Просто запихнули стек в ZI. Можно этого и не делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нашел в одной из статей хэлпа:

Uninitialized variables are placed in a section with type ZI

 

Может быть, ZI означает, что в этой области не размещены конкретные (статические) переменные? Стек - как раз такое...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Может быть, ZI означает, что в этой области не размещены конкретные (статические) переменные? Стек - как раз такое...

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

int a;

int main(void)
{
...
}

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

 

Стек в данном случае оказался в ZI из-за атрибута NOINIT.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Стек в данном случае оказался в ZI из-за атрибута NOINIT.

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

Или опция NOINIT просто игнорируется?

 

Действительно, путаница получается... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
То есть он обнуляться не будет, не смотря на то, что расположен в области ZI?

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

 

Или опция 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация