Serj78 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба при работе линкера после успешной сборки появляется сообщение о размере программы: Code= .... это размер самого кода RO-data - это, очевидно константы во флеш RW-data размер памяти переменных в SRAM ZI data - мне непонятно. нечто, инициализируемое нулем.Если пытаться объявить массив его размер прибавляется к этой области. Это понять можно, эти данные по умолчанию 0. Нашел как управлять этой областью и включить предупреждение когда она больше чем RAM.. Но почему при минимуме переменных это значение около 8000 ! Куда зарезервировано столько памяти и как это отключить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Но почему при минимуме переменных это значение около 8000 ! Куда зарезервировано столько памяти и как это отключить? Посмотрите map-файл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба В ZI область попадает стек и куча. Проверьте в асмовом стартапе, какого они размера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба В 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Хм.. асмового не нашел а в подключенном сишном стек и куча по 1000 Ну вот Ваши 8 килобайт и нашлись - 0х1000 равно 4096 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Ну вот Ваши 8 килобайт и нашлись - 0х1000 равно 4096 байт. Спасибо!! как говорится, сам дурак :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Что-то в Keil какая-то путаница (а может, в моей голове). Что означает zero-initialized? Разве стек нужно инициализировать нулями? Или это просто подразумевается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Разве стек нужно инициализировать нулями? Или это просто подразумевается? Просто запихнули стек в ZI. Можно этого и не делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Нашел в одной из статей хэлпа: Uninitialized variables are placed in a section with type ZI Может быть, ZI означает, что в этой области не размещены конкретные (статические) переменные? Стек - как раз такое... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Может быть, ZI означает, что в этой области не размещены конкретные (статические) переменные? Стек - как раз такое... Нет. К ZI относятся как раз статические объекты без инициализаторов, например: int a; int main(void) { ... } Переменная a будет расположена в секции ZI и обнулена во время стартапа. Стек в данном случае оказался в ZI из-за атрибута NOINIT. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 1 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба Стек в данном случае оказался в ZI из-за атрибута NOINIT. То есть он обнуляться не будет, не смотря на то, что расположен в области ZI? Или опция NOINIT просто игнорируется? Действительно, путаница получается... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 21 июня, 2010 Опубликовано 21 июня, 2010 · Жалоба То есть он обнуляться не будет, не смотря на то, что расположен в области 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться