История изменений
Исправление Zubok, (текущая версия) :
прошивка
Так, слушай! Я тут сел и еще раз проанализировал твой код. Вернее, то, что сгенерировал компилятор. И внезапно мне показалось странным, что компилятор вставляет rjmp .+0
. Вроде бы ничего странного: это по сути 'nop', то есть переход на следующую инструкцию. Зачем он в коде - это вопрос. Допустим, что причуда компилятора, холостая инструкция. У меня появилось подозрение, что именно на этой инструкции происходит проблема.
000000c0 <setup>:
c0: 14 b8 out 0x04, r1 ; 4
c2: 17 b8 out 0x07, r1 ; 7
c4: 1a b8 out 0x0a, r1 ; 10
c6: 39 9a sbi 0x07, 1 ; 7
c8: 3a 9a sbi 0x07, 2 ; 7
ca: 82 e0 ldi r24, 0x02 ; 2
cc: 90 e0 ldi r25, 0x00 ; 0
ce: 16 d0 rcall .+44 ; 0xfc <beep>
d0: 83 e0 ldi r24, 0x03 ; 3
d2: 90 e0 ldi r25, 0x00 ; 0
d4: 00 c0 rjmp .+0 ; 0xd6
^^^^^^^^^^^^
beep уже отработал, а flash_led уже не будет.
<flash_led>
000000d6 <flash_led>:
d6: 00 97 sbiw r24, 0x00 ; 0
d8: 81 f0 breq .+32 ; 0xfa <flash_led+0x24
Полез я в гугл, решив на всякий случай проверить эту гипотезу, не сталкивался ли кто, и нахожу это:
http://www.avrfreaks.net/forum/strange-problem-generated-code-rjmp-0
Если внимательно почитаешь, то у человека эта «странная» инструкция вызывает проблемы. Он отметил (вот тут), что если изменить код, чтобы эта инструкция не генерировалась, то у него все начинает работать нормально.
И вот в финале два последних сообщения: тестовый код и человек приходит к выводу, что у него просто глючный кристалл. То есть работает нормально, но только без этой инструкции.
http://www.avrfreaks.net/comment/296941#comment-296941
Я утвердился в подозрении, что твой код именно на этой инструкции спотыкается. Глюк это кристалла или описанное где-то поведение, надо глянуть. В первый раз такое вижу.
UPD: Попробуй разные опции оптимизации и проконтролируй в коде, всегда ли эта инструкция появляется.
Исправление Zubok, :
прошивка
Так, слушай! Я тут сел и еще раз проанализировал твой код. Вернее, то, что сгенерировал компилятор. И внезапно мне показалось странным, что компилятор вставляет rjmp .+0
. Вроде бы ничего странного: это по сути 'nop', то есть переход на следующую инструкцию. Зачем он в коде - это вопрос. Допустим, что причуда компилятора, холостая инструкция. У меня появилось подозрение, что именно на этой инструкции происходит проблема.
000000c0 <setup>:
c0: 14 b8 out 0x04, r1 ; 4
c2: 17 b8 out 0x07, r1 ; 7
c4: 1a b8 out 0x0a, r1 ; 10
c6: 39 9a sbi 0x07, 1 ; 7
c8: 3a 9a sbi 0x07, 2 ; 7
ca: 82 e0 ldi r24, 0x02 ; 2
cc: 90 e0 ldi r25, 0x00 ; 0
ce: 16 d0 rcall .+44 ; 0xfc <beep>
d0: 83 e0 ldi r24, 0x03 ; 3
d2: 90 e0 ldi r25, 0x00 ; 0
d4: 00 c0 rjmp .+0 ; 0xd6
^^^^^^^^^^^^
beep уже отработал, а flash_led уже не будет.
<flash_led>
000000d6 <flash_led>:
d6: 00 97 sbiw r24, 0x00 ; 0
d8: 81 f0 breq .+32 ; 0xfa <flash_led+0x24
Полез я в гугл, решив на всякий случай проверить эту гипотезу, не сталкивался ли кто, и нахожу это:
http://www.avrfreaks.net/forum/strange-problem-generated-code-rjmp-0
Если внимательно почитаешь, то у человека эта «странная» инструкция вызывает проблемы. Он отметил (вот тут), что если изменить код, чтобы эта инструкция не генерировалась, то у него все начинает работать нормально.
И вот в финале два последних сообщения: тестовый код и человек приходит к выводу, что у него просто глючный кристалл. То есть работает нормально, но только без этой инструкции.
http://www.avrfreaks.net/comment/296941#comment-296941
Я утвердился в подозрении, что твой код именно на этой инструкции спотыкается. Глюк это кристалла или описанное где-то поведение, надо глянуть. В первый раз такое вижу.
Исправление Zubok, :
прошивка
Так, слушай! Я тут сел и еще раз проанализировал твой код. Вернее, то, что сгенерировал компилятор. И внезапно мне показалось странным, что компилятор вставляет rjmp .+0
. Вроде бы ничего странного: это по сути 'nop', то есть переход на следующую инструкцию. Зачем он в коде - это вопрос. Допустим, что причуда компилятора, холостая инструкция. У меня появилось подозрение, что именно на этой инструкции происходит проблема.
000000c0 <setup>:
c0: 14 b8 out 0x04, r1 ; 4
c2: 17 b8 out 0x07, r1 ; 7
c4: 1a b8 out 0x0a, r1 ; 10
c6: 39 9a sbi 0x07, 1 ; 7
c8: 3a 9a sbi 0x07, 2 ; 7
ca: 82 e0 ldi r24, 0x02 ; 2
cc: 90 e0 ldi r25, 0x00 ; 0
ce: 16 d0 rcall .+44 ; 0xfc <beep>
d0: 83 e0 ldi r24, 0x03 ; 3
d2: 90 e0 ldi r25, 0x00 ; 0
d4: 00 c0 rjmp .+0 ; 0xd6
^^^^^^^^^^^^
beep уже отработал, а flash_led уже не будет.
<flash_led>
000000d6 <flash_led>:
d6: 00 97 sbiw r24, 0x00 ; 0
d8: 81 f0 breq .+32 ; 0xfa <flash_led+0x24
Полез я в гугл и решил на всякий случай проверить эту гипотезу, не сталкивался ли кто, и нахожу это:
http://www.avrfreaks.net/forum/strange-problem-generated-code-rjmp-0
Если внимательно почитаешь, то у человека эта «странная» инструкция вызывает проблемы. Он отметил (вот тут), что если изменить код, чтобы эта инструкция не генерировалась, то у него все начинает работать нормально.
И вот в финале два последних сообщения: тестовый код и человек приходит к выводу, что у него просто глючный кристалл. То есть работает нормально, но только без этой инструкции.
http://www.avrfreaks.net/comment/296941#comment-296941
Я утвердился в подозрении, что твой код именно на этой инструкции спотыкается. Глюк это кристалла или описанное где-то поведение, надо глянуть. В первый раз такое вижу.
Исходная версия Zubok, :
прошивка
Так, слушай! Я тут сел и еще раз проанализировал твой код. Вернее, то, что сгенерировал компилятор. И внезапно мне показалось странным, что компилятор вставляет rjmp .+0
. Вроде бы ничего странного: это по сути 'nop', то есть переход на следующую инструкцию. Зачем он в коде - это вопрос. Допустим, что причуда компилятора, холостая инструкция. У меня появилось подозрение, что именно на этой инструкции происходит проблема. Полез я в гугл и решил на всякий случай проверить эту гипотезу, не сталкивался ли кто, и нахожу это:
http://www.avrfreaks.net/forum/strange-problem-generated-code-rjmp-0
Если внимательно почитаешь, то у человека эта «странная» инструкция вызывает проблемы. Он отметил (вот тут), что если изменить код, чтобы эта инструкция не генерировалась, то у него все начинает работать нормально.
И вот в финале два последних сообщения: тестовый код и человек приходит к выводу, что у него просто глючный кристалл. То есть работает нормально, но только без этой инструкции.
http://www.avrfreaks.net/comment/296941#comment-296941
Я утвердился в подозрении, что твой код именно на этой инструкции спотыкается. Глюк это кристалла или описанное где-то поведение, надо глянуть. В первый раз такое вижу.
000000c0 <setup>:
c0: 14 b8 out 0x04, r1 ; 4
c2: 17 b8 out 0x07, r1 ; 7
c4: 1a b8 out 0x0a, r1 ; 10
c6: 39 9a sbi 0x07, 1 ; 7
c8: 3a 9a sbi 0x07, 2 ; 7
ca: 82 e0 ldi r24, 0x02 ; 2
cc: 90 e0 ldi r25, 0x00 ; 0
ce: 16 d0 rcall .+44 ; 0xfc <beep>
d0: 83 e0 ldi r24, 0x03 ; 3
d2: 90 e0 ldi r25, 0x00 ; 0
d4: 00 c0 rjmp .+0 ; 0xd6
^^^^^^^^^^^^
beep отработает, а flash_led нет.
<flash_led>
000000d6 <flash_led>:
d6: 00 97 sbiw r24, 0x00 ; 0
d8: 81 f0 breq .+32 ; 0xfa <flash_led+0x24