LINUX.ORG.RU

История изменений

Исправление 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