я разбираюсь в ассемблере, но вы думаете, это мне прибавляет энтузиазма для ковыряния в листинге из-под WinAVR? однако, вы меня вынудили это сделать...
Код: Выделить всё
00000048 <__do_clear_bss>:
48: 10 e0 ldi r17, 0x00 ; 0
4a: a2 e6 ldi r26, 0x62 ; 98
4c: b0 e0 ldi r27, 0x00 ; 0
4e: 01 c0 rjmp .+2 ; 0x52 <do_clear_bss_start>
00000050 <do_clear_bss_loop>:
50: 1d 92 st X+, r1
00000052 <do_clear_bss_start>:
52: a4 36 cpi r26, 0x64 ; 100
54: b1 07 cpc r27, r17
56: e1 f7 brne .-8 ; 0x50 <do_clear_bss_loop>
58: 02 d0 rcall .+4 ; 0x5e <main>
5a: 0b c0 rjmp .+22 ; 0x72 <_exit>
вот этот участок инициализирует нулями все переменные, которые объявлены, но им явно не указаны значения. даже по имени меток do_clear_bss_хххх вы можете догадаться, что речь идет об очистке памяти... .bss - это имя секции памяти WinAVR, отводимой для статических и глобальных переменных. Память тупо обнуляется, не взирая на размеры переменных.
теперь несколько слов в ответ на ваши эмоции.
нет, его можно вручную намусорить в область ОЗУ - это не протеус, "виртуальная" память в студии доступна для редактирования. намусорьте туда сами - сколько хотите и куда хотите, потом проимитируйте сброс - и поглядите, что стало с переменными внутри main()...Ваааааааааааще ОТЖИХХХХХ ! Корки отмачиваете не шуточные ! Откудаж в СИМУЛЯТОРЕ возьметься мусор в ячейках памяти ? Симулятор РОДИТ его чтоль ?
я не знаю тоже, но если CVAVR следует закону - то обязательно должен задействовать!В листинге CVAVR есть специальный макрос очищающий всю оперативн память - не знаю задействует ли он его в каждой проге или нет.
с точки зрения программиста - да, так и есть. но реально микроконтроллер выполняет еще немало предварительных действий, так называемый "пролог" или "инициализацию", и лишь потом вызывается main(). Если обраться к более крутым примерам - программам для Windows или даже DOS, то там объем предварительного кода (выполняемого до main()) может в разы превосходить код собственно main()!Так оно и есть на самом деле - программа на Си начинает выполняться с мэйн обычно.
ну, во-первых, оптимизацию и выключить недолго, во-вторых, можно объявить переменную volatile - и тогда компилятор ее обязан будет проинициализировать... но и в первом, и во втором случае в листинге main() вы не увидите команд, делающих этого! все будет сделано до входа в главную функцию...WinAVR имдиЁт чтоль ? Он чтоль не видит что переменная не считвается в коде до записи в нее, нафигаж он будет писать в нее то что не требуется - ОПТИМИЗАЦИЯ то включена !

