Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR инициализирует все переменные!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
777777
сабж, собсно...
aesok
Цитата(777777 @ Apr 25 2008, 15:27) *
сабж, собсно...


Это гупостью он занимаеться, для того чтобы соответствовать стандарту языка С.

Анатолий.
777777
Цитата(aesok @ Apr 25 2008, 15:39) *
Это гупостью он занимаеться, для того чтобы соответствовать стандарту языка С.


Да ну, давно ли? Может еще пунктик стандарта укажете, в котором это предписывается? Значит такое понятие как "неинициализированная переменная" уже не существует? А если мне нужно инициализировать не нулем, а другим числом?

А в С++ он тоже инициализирует? Сначала обнуляет всю память, а котом начинает вызывать конструкторы? Несколько глупо, не так ли?
MrYuran
где-то я это уже видел...
не помню где...
вроде как перед объявлением переменной без инициализации надо писать _no_init или чё-то в этом духе
zltigo
Цитата(777777 @ Apr 25 2008, 13:56) *
Значит такое понятие как "неинициализированная переменная" уже не существует?

Существует - для определенности она инициализируется нулем. Для инициализвции случайным числом существуют генераторы случайных чисел, однако.
Цитата
А если мне нужно инициализировать не нулем, а другим числом?

Инициализируйте. Никто не запрещает.
Цитата
Несколько глупо, не так ли?

Глупо, это то, что Вы тут пропагандируете.



Цитата(MrYuran @ Apr 25 2008, 14:56) *
вроде как перед объявлением переменной без инициализации надо писать _no_init или чё-то в этом духе

Смотреть документацию на конкретный компилятор в части расширений языка. Для садомазохистов правится startup и убирается инициализация, вообще.
Aleksandr Baranov
Так ведь это уже обсуждалось пару дней назад.

The .noinit Section
This sections is a part of the .bss section. What makes the .noinit section special is that variables which are defined as such:

int foo __attribute__ ((section (".noinit")));
will not be initialized to zero during startup as would normal .bss data.


Все, что не подлежит инициализации размещается а секции noinit. Подробности - в avr-libc/avr-libc-user-manual/mem_sections.html
aesok
Цитата(777777 @ Apr 25 2008, 15:56) *
Да ну, давно ли? Может еще пунктик стандарта укажете, в котором это предписывается?


JTC1/SC22/WG14 - C

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

Цитата
WG14/N1124 Committee Draft — May 6, 2005 ISO/IEC 9899:TC2
...
6.7.8 Initialization
...
10 If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these
rules.
singlskv
Цитата(Aleksandr Baranov @ Apr 25 2008, 17:43) *
Так ведь это уже обсуждалось пару дней назад.
А вот здесь более подробно обсуждалось про секции и их размещение:
http://electronix.ru/forum/index.php?showtopic=44607
ReAl
Цитата(777777 @ Apr 25 2008, 14:56) *
Да ну, давно ли? Может еще пунктик стандарта укажете, в котором это предписывается?
...
А в С++ он тоже инициализирует? Сначала обнуляет всю память, а котом начинает вызывать конструкторы? Несколько глупо, не так ли?

А разве avr-gcc зануляет ВСЮ память?


Цитата(aesok @ Apr 25 2008, 16:56) *
До кучи, стандарт С 1989 года (почти 20 лет!):
http://megaton.obfuscated.net/~orange/deve...raft.html#3.5.7
Цитата
3.5.7 Initialization
...
If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every ember that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant. If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.

Насколько я помню, в до-ansi-шном С на "Электронике-60" было так же.

Теперь стандарт С++
Цитата
8.5 Initializers
...
5 To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
— if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;
— if T is a union type, the object’s first named data member89) is zero-initialized;
— if T is an array type, each element is zero-initialized;
— if T is a reference type, no initialization is performed.
To default-initialize an object of type T means:
— if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, the object is zero-initialized.
default-инициализация применяется тогда, когда инициализатор не задан явно.
777777
Цитата(zltigo @ Apr 25 2008, 17:16) *
Существует - для определенности она инициализируется нулем. Для инициализвции случайным числом существуют генераторы случайных чисел, однако.

Очень смешно.
Цитата(zltigo @ Apr 25 2008, 17:16) *
Инициализируйте. Никто не запрещает.
Глупо, это то, что Вы тут пропагандируете.

Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?
MrYuran
Цитата(777777 @ Apr 25 2008, 18:16) *
Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?

Откройте любой учебник по си.
ВСЕГДА рекомендуется инициализировать переменные, иначе в них может находиться всё что угодно.
Хорошо, если компилятор туда хотя бы 0 занесёт.
ЗАТО:
будет 100% уверенность в том, что находится в переменной
zltigo
Цитата(777777 @ Apr 25 2008, 17:16) *
Вообще-то инициализация занимает программную память, которой и так немного.

Программной памяти по нынешним временам "немного" бывает крайне редко. Процедура инициализации занимает порядка 5-10 команд.
Цитата
Вы считаете глупостью желание ее сэкономить?

С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, то ручная индивидуальная инициализация (даже нескольких переменных) займет ресурсов больше, нежели простейшее обнуление всего массива переменных чохом в цикле. И это уже глупость в квадрате.
singlskv
Цитата(zltigo @ Apr 25 2008, 20:08) *
Программной памяти по нынешним временам "немного" бывает крайне редко.
бывает и еще как...
Цитата
С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, то ручная индивидуальная инициализация (даже нескольких переменных) займет ресурсов больше, нежели простейшее обнуление всего массива переменных чохом в цикле. И это уже глупость в квадрате.
Атлична, тогда попробуйте обосновать наличие Retention памяти на некотоорых продвинутых
чипах ...
This LSI has an on-chip high-speed RAM, which achieves fast access, and an on-chip RAM for
data retention, which can retain data in deep standby mode. These memory units can be used to
store instructions or data.
zltigo
Цитата(singlskv @ Apr 25 2008, 18:40) *
бывает и еще как...

Типа пишите на "C", не хватает 10 байт, где ужать не знаете - последний шанс убрать инициализацию памяти и посмотреть что получится. Извините, так, не бывает. (От комментариев у кого так бывает воздержусь smile.gif )
Цитата
Атлична, тогда попробуйте обосновать наличие Retention памяти на некотоорых продвинутых
чипах ...

Это вы вообще к чему а? К тому, что бывает неинициализированная память? Так я ее десять раз на дню пользую - получаю от мененджера памяти на любом, а не только на 'продвинутом' чипе и пользую с ОСТОРОЖНОСТЬЮ и трачу РЕСУРСЫ на начальную инициализацию, там где не обойтись. Какое это отношение имеет к желанию "сэкономить" на инициализации сегмента с "неициализированными" переменными в startup?
singlskv
Цитата(zltigo @ Apr 25 2008, 20:55) *
Типа пишите на "C", не хватает 10 байт, где ужать не знаете - последний шанс убрать инициализацию памяти и посмотреть что получится. Извините, так, не бывает. (От комментариев у кого так бывает воздержусь smile.gif )
Ну ваще-то бывает, ну ни как не получится разместить 16 армов на одной плате,
вот 16 тини24 влезают, а 16 даже минимальных арм + обвязка ну ни как не влезут sad.gif
Цитата
Это вы вообще к чему а? К тому, что бывает неинициализированная память? Так я ее десять раз на дню пользую - получаю от мененджера памяти на любом, а не только на 'продвинутом' чипе и пользую с ОСТОРОЖНОСТЬЮ и трачу РЕСУРСЫ на начальную инициализацию, там где не обойтись. Какое это отношение имеет к желанию "сэкономить" на инициализации сегмента с "неициализированными" переменными в startup?
А разьве кто-то собирался экономить ? кажись Вы не внимательно читали топик,
задачка не экономить а сохранить значения после перезагрузки, например после WDT
IgorKossak
Цитата(singlskv @ Apr 25 2008, 21:42) *
кажись Вы не внимательно читали топик,
задачка не экономить а сохранить значения после перезагрузки, например после WDT

Надо не только топик читать, но и ответы, например #4 и #6
singlskv
Цитата(IgorKossak @ Apr 25 2008, 23:23) *
Надо не только топик читать, но и ответы, например #4 и #6
Не понял как это относится ко мне 07.gif
Вроде как я сам давал ссылки в #8, но потом пришел наш любимый модератор и сказал
что надо фсе делать на арм biggrin.gif шучу...
zltigo
Цитата(singlskv @ Apr 25 2008, 20:42) *
Ну ваще-то бывает, ну ни как не получится разместить 16 армов на одной плате,

Это в огороде бузина а в Киеве - в Киеве дядька. К чему относится поток сознания? Уж точно не к вопросам экономии памяти. А почему 16? Почему не десять тысяч курьеров "тини24" и в каждой в ее 2K и 128 байтах RAM чего-нибудь на "C" c бодуна написать. И в книгу рекордов.
Цитата
А разьве кто-то собирался экономить ? кажись Вы не внимательно читали топик,

Читайте:
Цитата
Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?

А вот это:
Цитата
задачка не экономить а сохранить значения после перезагрузки, например после WDT

эту задачу никто в ЭТОМ топике не поднимал. Будте внимательнее.



Цитата(singlskv @ Apr 25 2008, 21:33) *
..но потом пришел наш любимый модератор и сказал
что надо фсе делать на арм biggrin.gif шучу...

Попробуйте найти в моих постах хоть абревиатуру ARM, хоть вообше намек, хоть на какую-либо архитектуру. Куда Вас понесло? А?
singlskv
Цитата(zltigo @ Apr 25 2008, 23:40) *
Это в огороде бузина а в Киеве - в Киеве дядька. К чему относится поток сознания? Уж точно не к вопросам экономии памяти. А почему 16? Почему не десять тысяч курьеров "тини24" и в каждой в ее 2K и 128 байтах RAM чего-нибудь на "C" c бодуна написать. И в книгу рекордов.
Патамушта на 2K и 128 байтах RAM на С пишется вполне адекватный софт, но память
(и рам и флеш)приходиться экономить , а 16шт потому что столько их стоит на одной плате,
а сколько будет плат всего,.... много...
Цитата
эту задачу никто в ЭТОМ топике не поднимал. Будте внимательнее.
Ээю... ну если Вам название топика "WinAVR инициализирует все переменные!,
Нельзя ли избавить его от этого глупого занятия?"
Не говорит о том что автор хочет сделать часть своих переменных НЕИНИЦИАЛИЗИРУЕММЫМИ
при старте/перезагрузке, тогда прошу прощения, наверное я как-то не так чего-то прочитал... 07.gif
777777
Цитата(MrYuran @ Apr 25 2008, 19:24) *
Откройте любой учебник по си.
ВСЕГДА рекомендуется инициализировать переменные

Во-первых, далеко не всегда это требуется. Например переменные, в которые считываются данные с каких-либо устройств ввода. Простейший пример
if((c = getchar()) != EOF) putchar( с );
Это "выхолощенный" пример, но таких примеров может быть масса. Другой случай - когда в функцию передаются адреса переменных, в которые эта функция поместит некие вычисленные значения (т.е. фактически случай, когда функция возващает несколько значений).
int a, b;
getvalues(&a, &b);
Случай, когда она возвращает одно значение, также не требует предварительной инициализации:
int n = getvalue();
Во-вторых, не всегда требуется инициализировать именно нулем, бывает необходимость и в других значениях, в том числе инициализация значением функции (см. выше)
В-третьих, твое высказывание "ВСЕГДА рекомендуется инициализировать переменные" предполагает, что это должен делать программист, а не компилятор. С этим я полностью согласен.
Цитата(MrYuran @ Apr 25 2008, 19:24) *
иначе в них может находиться всё что угодно.
Хорошо, если компилятор туда хотя бы 0 занесёт.

Наконец, в-четвертых, если переменную надо инициализировать, а ты забыл это сделать, то не стоит надеяться, что от инициалиации ее компилятором программа будет работать правильно. Может случиться, что 0 - такое же недопустимое значение, как и множество других. А может и нет - и тогда программа будет работать, но выдавать неправильный результат, и ты будешь долго искать ошибку.


Цитата(zltigo @ Apr 25 2008, 20:08) *
С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, <...>


Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью?
zltigo
Цитата(777777 @ Apr 28 2008, 06:12) *
Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью?

Можно:
Цитата
WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия?
....инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?

И учтите, Ваши постфактум толкования и попытки выкручиваться лично мне совершено неинтересны, посему, дальнейшию "дискуссию" поддерживать не буду.
xelax
Цитата(777777 @ Apr 28 2008, 08:12) *
Во-вторых, не всегда требуется инициализировать именно нулем, бывает необходимость и в других значениях, в том числе инициализация значением функции (см. выше)


А для чего по Вашему Winavr лепит функцию <__do_copy_data>???

Цитата(777777 @ Apr 28 2008, 08:12) *
В-третьих, твое высказывание "ВСЕГДА рекомендуется инициализировать переменные" предполагает, что это должен делать программист, а не компилятор. С этим я полностью согласен.


Я немного изменю Вашу мысль. Если нужна какая-то специальная инициализация памяти, отличная от устоявшейся, то это должен делать программист, а не компилятор.

Компилятор всего лишь предоставляет шаблон, устраивающий 99 и 9 в периоде процентов разработчиков.
777777
Цитата(zltigo @ Apr 28 2008, 09:47) *
Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью?
Можно:

QUOTE

WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия?
....инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?

И из этого вы делаете вывод, что я предлагаю работать с неинициализированными переменными? Неплохо...
Постом выше я подробно разъяснил, в каких именно случаях переменные нет смысла инициализировать, но и там где это требоется, это долже делать программист, а не компилятор.
Цитата
И учтите, Ваши постфактум толкования и попытки выкручиваться лично мне совершено неинтересны, посему, дальнейшию "дискуссию" поддерживать не буду.

Очень осмотрительно.


Цитата(xelax @ Apr 28 2008, 10:00) *
Я немного изменю Вашу мысль. Если нужна какая-то специальная инициализация памяти, отличная от устоявшейся, то это должен делать программист, а не компилятор.

Компилятор всего лишь предоставляет шаблон, устраивающий 99 и 9 в периоде процентов разработчиков.

Я полагаю, в 99 и 9 в периоде процентах проектов есть переменные, которые не требуется инициализировать или которые нужно инициализировать не нулем, следовательно код в них будет избыточным.
Например массив, в котором хранятся данные для вывода на 7-сегментные индикаторы - для их выключения туда нужно записать все единицы. Комплятор генерирует код, который заполняет их нулями. Вы видите какой-то смысл в том чтобы дважды инициализировать эту область памяти?

PS. еще интересно бы проверить, как он относится к объектам классов в режиме С++, неужели тоже сначала все их обнуляет, а потом начинает вызывать конструкторы для настоящей инициализации?
Сергей Борщ
Цитата(777777 @ Apr 28 2008, 09:40) *
Постом выше я подробно разъяснил, в каких именно случаях переменные нет смысла инициализировать, но и там где это требоется, это долже делать программист, а не компилятор.
Еще неплохо бы подумать, должны ли все перечисленные в ваших примерах переменные быть глобальными или статическими. Если ответ "да", то о какой экономии вы тут нас пытаетесь агитировать? Если ответ "нет" - идем читать учебник или стандарт об инициализации автоматических переменных - очень удивитесь.
Двигаемся дальше.
Цитата(777777 @ Apr 28 2008, 09:40) *
но и там где это требоется, это долже делать программист
Теперь берите в руки дизассемблированный листинг той самой инициализации и смотрите, как реализовывается желание программиста: для каждой такой переменной начальное значение должно где-то храниться, чтобы при старте программы было известно, каким именно значением захотел инициализировать программист. Вы знаете более другой способ чем копирование начальных значений? Тогда нам интересно будет вас послушать. Развиваем эту мысль. Очень много (подавляющее большинство) переменных программист захочет проинициализировать нулем (поверьте, это так). Вы предлагаете в этом случае хранить во флеше по нулю для каждой переменной вместо того, чтобы очистить их всех скопом в цикле? О какой экономии вы тогда нас агитируете снова?


Цитата(777777 @ Apr 28 2008, 09:52) *
Я полагаю, в 99 и 9 в периоде процентах проектов есть переменные, которые не требуется инициализировать или которые нужно инициализировать не нулем, следовательно код в них будет избыточным.
Вы полагаете неправильно. С точностью до наоборот, в 99 и 9 в периоде процентах глобальные и статические переменные требуется инициализировать нулем.
Цитата(777777 @ Apr 28 2008, 09:52) *
Например массив, в котором хранятся данные для вывода на 7-сегментные индикаторы - для их выключения туда нужно записать все единицы.
Кому как. Это уже от прямоты рук зависит. У меня они гасятся нулями, поэтому массив очищается в цикле вместе с остальными глобальными и статическими переменными (представляете экономию кода - мне не нужно тратить место на еще один цикл заполнения массива единицами)

Цитата(777777 @ Apr 28 2008, 09:52) *
Комплятор генерирует код, который заполняет их нулями. Вы видите какой-то смысл в том чтобы дважды инициализировать эту область памяти?
Код
uint8_t Buffer[3] = { 0xFF, 0xFF,0xFF };
Где инициализируется дважды? Я вижу смысл в изучении языка и документации, а также алгоритмов. Вы можете ругать компилятор - от этого ваши программы "прямее" не станут.
Цитата(777777 @ Apr 28 2008, 09:52) *
PS. еще интересно бы проверить, как он относится к объектам классов в режиме С++,
Интересно - проверяйте. Мне достаточно прочитать об этом в учебнике по С++.
777777
Цитата(Сергей Борщ @ Apr 28 2008, 11:08) *
Код
uint8_t Buffer[3] = { 0xFF, 0xFF,0xFF };
Где инициализируется дважды?

Дважды - если их не инициализировать сразу, а написать свой код для инициализации. Тогда он будет сначала заполнен нулями, а потом моим кодом.

А такой код я тоже пробовал. В этом случае, поскольку все байты в общем случае могут быть разными, он создает в памяти программ массив из инициализируемых байт и при старте переписывает их в этот массив. Когда он состоит из 3 байт - это еще терпимо, но если их штук 16-20, я начинаю нервничать, т.к. простой цикл, заполняющий их ff-ами, мог быть и короче.
Сергей Борщ
Цитата(777777 @ Apr 28 2008, 10:26) *
Дважды - если их не инициализировать сразу, а написать свой код для инициализации. Тогда он будет сначала заполнен нулями, а потом моим кодом.
В таком случае он будет сначала заполнен нулями вместе со всеми остальными обнуляемыми переменными, на это не будет потрачено ни байта дополнительной памяти. Что вы хотите здесь сэкономить?
Цитата(777777 @ Apr 28 2008, 10:26) *
но если их штук 16-20, я начинаю нервничать,
Пейте ромашковый чай. А еще можете попытаться изменить алгоритм, чтобы погашенному состоянию соответствовали нули. На крайний случай можно посоветовать чтение документации, в частности на avr-libc (описание секции .noinit), но, во-первых, такой совет вы стойко игнорируете, а во-вторых, эта секция придумана и реализована совсем для другого и если вы сейчас с ее помощью начнете ставить распорки и расчалки в свою программу, она еще долго будет далека от совершенства.

Сделать можно практически все, однако для этого придется изучить язык С, изучить gcc, изучить линкер ld и формат его скриптовых файлов. Но в 99 и 9 в периоде процентах случаев этого не требуется - достаточно выбрать правильный алгоритм.
xelax
Цитата(777777 @ Apr 28 2008, 11:26) *
Дважды - если их не инициализировать сразу, а написать свой код для инициализации. Тогда он будет сначала заполнен нулями, а потом моим кодом.

А такой код я тоже пробовал. В этом случае, поскольку все байты в общем случае могут быть разными, он создает в памяти программ массив из инициализируемых байт и при старте переписывает их в этот массив. Когда он состоит из 3 байт - это еще терпимо, но если их штук 16-20, я начинаю нервничать, т.к. простой цикл, заполняющий их ff-ами, мог быть и короче.


Когда он их дважды инициализирует???? Покажите место... Ткнимте носом, я в упор не вижу этого места.
Вот сделал дизасм, своего простенького тестового проекта. Стартапный код winavr.
Код
00000000 <__vectors>:
       0:    0c 94 48 03     jmp    0x690; 0x690 <WdtInit>
.// здесь остальная таблица векторов
.
.
.
00000690 <WdtInit>:
Returns:
  none.
******************************************************************************/
void WdtInit(void)
{
     690:    80 91 0e 05     lds    r24, 0x050E
     694:    82 31           cpi    r24, 0x12; 18
     696:    71 f0           breq    .+28     ; 0x6b4 <WdtInit+0x24>
.  // тело функции (инициализаци wdt, чтение источника сброса)
.
.
.
.
     78e:    de bf           out    0x3e, r29; 62
     790:    cd bf           out    0x3d, r28; 61

00000792 <__do_copy_data>:
     792:    12 e0           ldi    r17, 0x02; 2
     794:    a0 e0           ldi    r26, 0x00; 0
     796:    b2 e0           ldi    r27, 0x02; 2
     798:    e2 eb           ldi    r30, 0xB2; 178
     79a:    f9 e4           ldi    r31, 0x49; 73
     79c:    00 e0           ldi    r16, 0x00; 0
     79e:    0b bf           out    0x3b, r16; 59
     7a0:    02 c0           rjmp    .+4      ; 0x7a6 <__do_copy_data+0x14>
     7a2:    07 90           elpm    r0, Z+
     7a4:    0d 92           st    X+, r0
     7a6:    a2 36           cpi    r26, 0x62; 98
     7a8:    b1 07           cpc    r27, r17
     7aa:    d9 f7           brne    .-10     ; 0x7a2 <__do_copy_data+0x10>

000007ac <__do_clear_bss>:
     7ac:    15 e0           ldi    r17, 0x05; 5
     7ae:    a2 e6           ldi    r26, 0x62; 98
     7b0:    b2 e0           ldi    r27, 0x02; 2
     7b2:    01 c0           rjmp    .+2      ; 0x7b6 <.do_clear_bss_start>

000007b4 <.do_clear_bss_loop>:
     7b4:    1d 92           st    X+, r1

000007b6 <.do_clear_bss_start>:
     7b6:    ae 30           cpi    r26, 0x0E; 14
     7b8:    b1 07           cpc    r27, r17
     7ba:    e1 f7           brne    .-8      ; 0x7b4 <.do_clear_bss_loop>
     7bc:    0e 94 de 0c     call    0x19bc; 0x19bc <main>
     7c0:    0c 94 d8 24     jmp    0x49b0; 0x49b0 <_exit>
zltigo
Цитата(Сергей Борщ @ Apr 28 2008, 09:47) *
В таком случае он будет сначала заполнен нулями вместе со всеми остальными обнуляемыми переменными,

Не будет smile.gif это разные сегменты. Таким образом доболнительных затрат - ни кода, ни тактов нет вообще никаких...
Сергей Борщ
Цитата(zltigo @ Apr 28 2008, 12:39) *
Не будет smile.gif это разные сегменты. Таким образом доболнительных затрат - ни кода, ни тактов нет вообще никаких...
Стоп. Мы, похоже, по-разному телепатируем исходную задачу. Я проблему автора представляю так:
Код
uint8_t buffer[16];
void main()
{
    uint8_t i;
    for(i = 0; i < sizeof(buffer); ++i)
        buffer[i] = 0xff;

    ........
}
В результате buffer сначала инициализируется нулем во время исполнения стартап-кода, (поскольку явно не проинициализированная глобальная переменная попадает в .bss и инициализируется нулем по стандарту), а потом программист в нее врукопашную заносит другие значения.
zltigo
Цитата(Сергей Борщ @ Apr 28 2008, 13:24) *
Стоп. Мы, похоже, по-разному телепатируем исходную задачу. Я проблему автора представляю так:
...а потом программист в нее врукопашную заносит другие значения.

Ну тогда могу только добавить, что memset() обычно более выигрышно по скорости, нежели побайтовое заполнение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.