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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия?
IgorKossak
сообщение Apr 25 2008, 19:23
Сообщение #16


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(singlskv @ Apr 25 2008, 21:42) *
кажись Вы не внимательно читали топик,
задачка не экономить а сохранить значения после перезагрузки, например после WDT

Надо не только топик читать, но и ответы, например #4 и #6
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 25 2008, 19:33
Сообщение #17


дятел
*****

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



Цитата(IgorKossak @ Apr 25 2008, 23:23) *
Надо не только топик читать, но и ответы, например #4 и #6
Не понял как это относится ко мне 07.gif
Вроде как я сам давал ссылки в #8, но потом пришел наш любимый модератор и сказал
что надо фсе делать на арм biggrin.gif шучу...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 25 2008, 19:40
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Apr 25 2008, 20:42) *
Ну ваще-то бывает, ну ни как не получится разместить 16 армов на одной плате,

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

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

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

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



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

Попробуйте найти в моих постах хоть абревиатуру ARM, хоть вообше намек, хоть на какую-либо архитектуру. Куда Вас понесло? А?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Apr 25 2008, 19:56
Сообщение #19


дятел
*****

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



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


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(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) *
С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, <...>


Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью?

Сообщение отредактировал 777777 - Apr 28 2008, 04:19
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 28 2008, 05:47
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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

И учтите, Ваши постфактум толкования и попытки выкручиваться лично мне совершено неинтересны, посему, дальнейшию "дискуссию" поддерживать не буду.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Apr 28 2008, 06:00
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



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


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

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


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

Компилятор всего лишь предоставляет шаблон, устраивающий 99 и 9 в периоде процентов разработчиков.
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 28 2008, 06:52
Сообщение #23


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

QUOTE

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

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

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


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

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

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

PS. еще интересно бы проверить, как он относится к объектам классов в режиме С++, неужели тоже сначала все их обнуляет, а потом начинает вызывать конструкторы для настоящей инициализации?

Сообщение отредактировал 777777 - Apr 28 2008, 06:54
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 07:08
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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. еще интересно бы проверить, как он относится к объектам классов в режиме С++,
Интересно - проверяйте. Мне достаточно прочитать об этом в учебнике по С++.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 28 2008, 07:26
Сообщение #25


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Сергей Борщ @ Apr 28 2008, 11:08) *
Код
uint8_t Buffer[3] = { 0xFF, 0xFF,0xFF };
Где инициализируется дважды?

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

А такой код я тоже пробовал. В этом случае, поскольку все байты в общем случае могут быть разными, он создает в памяти программ массив из инициализируемых байт и при старте переписывает их в этот массив. Когда он состоит из 3 байт - это еще терпимо, но если их штук 16-20, я начинаю нервничать, т.к. простой цикл, заполняющий их ff-ами, мог быть и короче.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 07:47
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Сделать можно практически все, однако для этого придется изучить язык С, изучить gcc, изучить линкер ld и формат его скриптовых файлов. Но в 99 и 9 в периоде процентах случаев этого не требуется - достаточно выбрать правильный алгоритм.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
xelax
сообщение Apr 28 2008, 07:52
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(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>
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 28 2008, 09:39
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Сергей Борщ @ Apr 28 2008, 09:47) *
В таком случае он будет сначала заполнен нулями вместе со всеми остальными обнуляемыми переменными,

Не будет smile.gif это разные сегменты. Таким образом доболнительных затрат - ни кода, ни тактов нет вообще никаких...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2008, 11:24
Сообщение #29


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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 и инициализируется нулем по стандарту), а потом программист в нее врукопашную заносит другие значения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 28 2008, 11:36
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Ну тогда могу только добавить, что memset() обычно более выигрышно по скорости, нежели побайтовое заполнение.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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