Мастер ЛомастерВообще-то int занимает 16 бит, и чтобы поделить ее на 2 в восьмибитном МК одним сдвигом не обойтись.
----------
Ковырял ассемблерный листинг прошивки, и заметил в нем такую фигню:
Код: Выделить всё
;GLOBAL VARIABLES INITIALIZATION
LDI R30,LOW(__GLOBAL_INI_TBL*2)
LDI R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
LPM
ADIW R30,1
MOV R24,R0
LPM
ADIW R30,1
MOV R25,R0
SBIW R24,0
BREQ __GLOBAL_INI_END
LPM
ADIW R30,1
MOV R26,R0
LPM
ADIW R30,1
MOV R27,R0
LPM
ADIW R30,1
MOV R1,R0
LPM
ADIW R30,1
MOV R22,R30
MOV R23,R31
MOV R31,R0
MOV R30,R1
__GLOBAL_INI_LOOP:
LPM
ADIW R30,1
ST X+,R0
SBIW R24,1
BRNE __GLOBAL_INI_LOOP
MOV R30,R22
MOV R31,R23
RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:
Чтобы выяснить назначение фигни, долго игрался с начальными значениями переменных - результат был неизменным - непонятный кусок кода всегда присутствовал в листинге вне зависимости от первоначальных значений глобальных переменных.
Вопрос. Что делает данный код, и какие будут последствия если удалить его?
И еще - можно ли избавиться от этого кода при помощи настроек проекта, или без внешнего файла инициализации не обойтись?