ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
625567 Топик полностью
Точка опоры (18.10.2015 12:48, просмотров: 281) ответил SciFi на Судя по описанию, компилятор не прав. Наверное, что-то недоговариваете. Код привели урезанный или важные обстоятельства опустили.
Ответы всем: Что хочу получить. Пилу значений uint32_t act_freq от значения start_freq до start_freq + sweep_freq * sweep_counter. SciFi Да, код урезанный. Но результат воспроизводится полностью. При помещении указанных жирным шрифтом констант ххх_freq перед основным циклом while - компилятор их учитывает, а при помещении внутри него - нет. В полной программе - тот-же результат. Mahagam А константы эти, только сейчас записаны константами. В расширеннной версии они будут рассчитываться при изменении режимов работы заново. Олдфаг Вроде я и не заикаюсь про атомарность. Компилятор выкидывает нахуй занесение данных в переменные и я не понимаю, почему. AU08 Всегда. Си я знаю по прежнему херово и как только что-то идёт не так, как ожидаю - лезу в .lss P.S. avr-gcc (WinAVR 20100110) 4.3.3. На всякий случай - .lss для случая "константы внутри while":
Sweeper.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000130  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          0000000f  00800060  00800060  000001a4  2**0
                  ALLOC
  2 .debug_aranges 00000020  00000000  00000000  000001a4  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_pubnames 00000071  00000000  00000000  000001c4  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   0000010f  00000000  00000000  00000235  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_abbrev 0000007b  00000000  00000000  00000344  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   000000f3  00000000  00000000  000003bf  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_frame  00000030  00000000  00000000  000004b4  2**2
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_str    000000b8  00000000  00000000  000004e4  2**0
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54	; 0x54 <__ctors_end>
   4:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
   8:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
   c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  10:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  14:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  18:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  1c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  20:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  24:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__vector_9>
  28:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  2c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  30:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  34:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  38:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  3c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  40:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  44:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  48:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  4c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  50:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d8 e0       	ldi	r29, 0x08	; 8
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_clear_bss>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	01 c0       	rjmp	.+2      	; 0x6a <.do_clear_bss_start>

00000068 <.do_clear_bss_loop>:
  68:	1d 92       	st	X+, r1

0000006a <.do_clear_bss_start>:
  6a:	af 36       	cpi	r26, 0x6F	; 111
  6c:	b1 07       	cpc	r27, r17
  6e:	e1 f7       	brne	.-8      	; 0x68 <.do_clear_bss_loop>
  70:	0e 94 6f 00 	call	0xde	; 0xde <main>
  74:	0c 94 96 00 	jmp	0x12c	; 0x12c <_exit>

00000078 <__bad_interrupt>:
  78:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

0000007c <__vector_9>:
volatile uint8_t	sweep_counter;
uint16_t			timer;
uint32_t			start_freq, sweep_freq;
volatile uint32_t	act_freq;

ISR(TIMER1_OVF_vect)	{	// Прерывание по переполнению Timer1
  7c:	1f 92       	push	r1
  7e:	0f 92       	push	r0
  80:	0f b6       	in	r0, 0x3f	; 63
  82:	0f 92       	push	r0
  84:	11 24       	eor	r1, r1
  86:	8f 93       	push	r24
  88:	9f 93       	push	r25
  8a:	af 93       	push	r26
  8c:	bf 93       	push	r27
	TCNT1 = timer;
  8e:	80 91 60 00 	lds	r24, 0x0060
  92:	90 91 61 00 	lds	r25, 0x0061
  96:	9d bd       	out	0x2d, r25	; 45
  98:	8c bd       	out	0x2c, r24	; 44

	if (++sweep_counter == 0)
  9a:	80 91 6e 00 	lds	r24, 0x006E
  9e:	8f 5f       	subi	r24, 0xFF	; 255
  a0:	80 93 6e 00 	sts	0x006E, r24
  a4:	80 91 6e 00 	lds	r24, 0x006E
  a8:	88 23       	and	r24, r24
  aa:	81 f4       	brne	.+32     	; 0xcc <__vector_9+0x50>
		act_freq = start_freq;	// reset frequency to new cycle
  ac:	80 91 66 00 	lds	r24, 0x0066
  b0:	90 91 67 00 	lds	r25, 0x0067
  b4:	a0 91 68 00 	lds	r26, 0x0068
  b8:	b0 91 69 00 	lds	r27, 0x0069
  bc:	80 93 6a 00 	sts	0x006A, r24
  c0:	90 93 6b 00 	sts	0x006B, r25
  c4:	a0 93 6c 00 	sts	0x006C, r26
  c8:	b0 93 6d 00 	sts	0x006D, r27

}
  cc:	bf 91       	pop	r27
  ce:	af 91       	pop	r26
  d0:	9f 91       	pop	r25
  d2:	8f 91       	pop	r24
  d4:	0f 90       	pop	r0
  d6:	0f be       	out	0x3f, r0	; 63
  d8:	0f 90       	pop	r0
  da:	1f 90       	pop	r1
  dc:	18 95       	reti

000000de <main>:


int main(void)	{

	sweep_counter = 0;
  de:	10 92 6e 00 	sts	0x006E, r1
	TCCR1B = 2;		// Метки времени Fclk/nnn
  e2:	82 e0       	ldi	r24, 0x02	; 2
  e4:	8e bd       	out	0x2e, r24	; 46
	TIMSK |= _BV(TOIE1);	// Прерывания по переполнению (счёт времени)
  e6:	89 b7       	in	r24, 0x39	; 57
  e8:	84 60       	ori	r24, 0x04	; 4
  ea:	89 bf       	out	0x39, r24	; 57
	MCUCR	|= _BV(SE);		// IDLE mode
  ec:	85 b7       	in	r24, 0x35	; 53
  ee:	80 68       	ori	r24, 0x80	; 128
  f0:	85 bf       	out	0x35, r24	; 53

/*	sweep_freq = 0x218E;
	start_freq = 0x250B524;
*/	timer = 2700;
  f2:	8c e8       	ldi	r24, 0x8C	; 140
  f4:	9a e0       	ldi	r25, 0x0A	; 10
  f6:	90 93 61 00 	sts	0x0061, r25
  fa:	80 93 60 00 	sts	0x0060, r24
	sei();
  fe:	78 94       	sei

    while(1)	{
		sweep_freq = 0x218E;
		start_freq = 0x250B524;

		sleep_cpu();
 100:	88 95       	sleep
		act_freq += sweep_freq;
 102:	80 91 6a 00 	lds	r24, 0x006A
 106:	90 91 6b 00 	lds	r25, 0x006B
 10a:	a0 91 6c 00 	lds	r26, 0x006C
 10e:	b0 91 6d 00 	lds	r27, 0x006D
 112:	82 57       	subi	r24, 0x72	; 114
 114:	9e 4d       	sbci	r25, 0xDE	; 222
 116:	af 4f       	sbci	r26, 0xFF	; 255
 118:	bf 4f       	sbci	r27, 0xFF	; 255
 11a:	80 93 6a 00 	sts	0x006A, r24
 11e:	90 93 6b 00 	sts	0x006B, r25
 122:	a0 93 6c 00 	sts	0x006C, r26
 126:	b0 93 6d 00 	sts	0x006D, r27
 12a:	ea cf       	rjmp	.-44     	; 0x100 <main+0x22>

0000012c <_exit>:
 12c:	f8 94       	cli

0000012e <__stop_program>:
 12e:	ff cf       	rjmp	.-2      	; 0x12e <__stop_program>
и "константы снаружи while":
Sweeper.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000160  00000000  00000000  00000074  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss          0000000f  00800060  00800060  000001d4  2**0
                  ALLOC
  2 .debug_aranges 00000020  00000000  00000000  000001d4  2**0
                  CONTENTS, READONLY, DEBUGGING
  3 .debug_pubnames 00000071  00000000  00000000  000001f4  2**0
                  CONTENTS, READONLY, DEBUGGING
  4 .debug_info   0000010f  00000000  00000000  00000265  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_abbrev 0000007b  00000000  00000000  00000374  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   00000103  00000000  00000000  000003ef  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_frame  00000030  00000000  00000000  000004f4  2**2
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_str    000000b8  00000000  00000000  00000524  2**0
                  CONTENTS, READONLY, DEBUGGING

Disassembly of section .text:

00000000 <__vectors>:
   0:	0c 94 2a 00 	jmp	0x54	; 0x54 <__ctors_end>
   4:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
   8:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
   c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  10:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  14:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  18:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  1c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  20:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  24:	0c 94 3e 00 	jmp	0x7c	; 0x7c <__vector_9>
  28:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  2c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  30:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  34:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  38:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  3c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  40:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  44:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  48:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  4c:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>
  50:	0c 94 3c 00 	jmp	0x78	; 0x78 <__bad_interrupt>

00000054 <__ctors_end>:
  54:	11 24       	eor	r1, r1
  56:	1f be       	out	0x3f, r1	; 63
  58:	cf e5       	ldi	r28, 0x5F	; 95
  5a:	d8 e0       	ldi	r29, 0x08	; 8
  5c:	de bf       	out	0x3e, r29	; 62
  5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_clear_bss>:
  60:	10 e0       	ldi	r17, 0x00	; 0
  62:	a0 e6       	ldi	r26, 0x60	; 96
  64:	b0 e0       	ldi	r27, 0x00	; 0
  66:	01 c0       	rjmp	.+2      	; 0x6a <.do_clear_bss_start>

00000068 <.do_clear_bss_loop>:
  68:	1d 92       	st	X+, r1

0000006a <.do_clear_bss_start>:
  6a:	af 36       	cpi	r26, 0x6F	; 111
  6c:	b1 07       	cpc	r27, r17
  6e:	e1 f7       	brne	.-8      	; 0x68 <.do_clear_bss_loop>
  70:	0e 94 6f 00 	call	0xde	; 0xde <main>
  74:	0c 94 ae 00 	jmp	0x15c	; 0x15c <_exit>

00000078 <__bad_interrupt>:
  78:	0c 94 00 00 	jmp	0	; 0x0 <__vectors>

0000007c <__vector_9>:
volatile uint8_t	sweep_counter;
uint16_t			timer;
uint32_t			start_freq, sweep_freq;
volatile uint32_t	act_freq;

ISR(TIMER1_OVF_vect)	{	// Прерывание по переполнению Timer1
  7c:	1f 92       	push	r1
  7e:	0f 92       	push	r0
  80:	0f b6       	in	r0, 0x3f	; 63
  82:	0f 92       	push	r0
  84:	11 24       	eor	r1, r1
  86:	8f 93       	push	r24
  88:	9f 93       	push	r25
  8a:	af 93       	push	r26
  8c:	bf 93       	push	r27
	TCNT1 = timer;
  8e:	80 91 60 00 	lds	r24, 0x0060
  92:	90 91 61 00 	lds	r25, 0x0061
  96:	9d bd       	out	0x2d, r25	; 45
  98:	8c bd       	out	0x2c, r24	; 44

	if (++sweep_counter == 0)
  9a:	80 91 6e 00 	lds	r24, 0x006E
  9e:	8f 5f       	subi	r24, 0xFF	; 255
  a0:	80 93 6e 00 	sts	0x006E, r24
  a4:	80 91 6e 00 	lds	r24, 0x006E
  a8:	88 23       	and	r24, r24
  aa:	81 f4       	brne	.+32     	; 0xcc <__vector_9+0x50>
		act_freq = start_freq;	// reset frequency to new cycle
  ac:	80 91 66 00 	lds	r24, 0x0066
  b0:	90 91 67 00 	lds	r25, 0x0067
  b4:	a0 91 68 00 	lds	r26, 0x0068
  b8:	b0 91 69 00 	lds	r27, 0x0069
  bc:	80 93 6a 00 	sts	0x006A, r24
  c0:	90 93 6b 00 	sts	0x006B, r25
  c4:	a0 93 6c 00 	sts	0x006C, r26
  c8:	b0 93 6d 00 	sts	0x006D, r27

}
  cc:	bf 91       	pop	r27
  ce:	af 91       	pop	r26
  d0:	9f 91       	pop	r25
  d2:	8f 91       	pop	r24
  d4:	0f 90       	pop	r0
  d6:	0f be       	out	0x3f, r0	; 63
  d8:	0f 90       	pop	r0
  da:	1f 90       	pop	r1
  dc:	18 95       	reti

000000de <main>:


int main(void)	{

	sweep_counter = 0;
  de:	10 92 6e 00 	sts	0x006E, r1
	TCCR1B = 2;		// Метки времени Fclk/nnn
  e2:	82 e0       	ldi	r24, 0x02	; 2
  e4:	8e bd       	out	0x2e, r24	; 46
	TIMSK |= _BV(TOIE1);	// Прерывания по переполнению (счёт времени)
  e6:	89 b7       	in	r24, 0x39	; 57
  e8:	84 60       	ori	r24, 0x04	; 4
  ea:	89 bf       	out	0x39, r24	; 57
	MCUCR	|= _BV(SE);		// IDLE mode
  ec:	85 b7       	in	r24, 0x35	; 53
  ee:	80 68       	ori	r24, 0x80	; 128
  f0:	85 bf       	out	0x35, r24	; 53

	sweep_freq = 0x218E;
  f2:	8e e8       	ldi	r24, 0x8E	; 142
  f4:	91 e2       	ldi	r25, 0x21	; 33
  f6:	a0 e0       	ldi	r26, 0x00	; 0
  f8:	b0 e0       	ldi	r27, 0x00	; 0
  fa:	80 93 62 00 	sts	0x0062, r24
  fe:	90 93 63 00 	sts	0x0063, r25
 102:	a0 93 64 00 	sts	0x0064, r26
 106:	b0 93 65 00 	sts	0x0065, r27
	start_freq = 0x250B524;
 10a:	84 e2       	ldi	r24, 0x24	; 36
 10c:	95 eb       	ldi	r25, 0xB5	; 181
 10e:	a0 e5       	ldi	r26, 0x50	; 80
 110:	b2 e0       	ldi	r27, 0x02	; 2
 112:	80 93 66 00 	sts	0x0066, r24
 116:	90 93 67 00 	sts	0x0067, r25
 11a:	a0 93 68 00 	sts	0x0068, r26
 11e:	b0 93 69 00 	sts	0x0069, r27
	timer = 2700;
 122:	8c e8       	ldi	r24, 0x8C	; 140
 124:	9a e0       	ldi	r25, 0x0A	; 10
 126:	90 93 61 00 	sts	0x0061, r25
 12a:	80 93 60 00 	sts	0x0060, r24
	sei();
 12e:	78 94       	sei

    while(1)	{
/*		sweep_freq = 0x218E;
		start_freq = 0x250B524;
*/
		sleep_cpu();
 130:	88 95       	sleep
		act_freq += sweep_freq;
 132:	80 91 6a 00 	lds	r24, 0x006A
 136:	90 91 6b 00 	lds	r25, 0x006B
 13a:	a0 91 6c 00 	lds	r26, 0x006C
 13e:	b0 91 6d 00 	lds	r27, 0x006D
 142:	82 57       	subi	r24, 0x72	; 114
 144:	9e 4d       	sbci	r25, 0xDE	; 222
 146:	af 4f       	sbci	r26, 0xFF	; 255
 148:	bf 4f       	sbci	r27, 0xFF	; 255
 14a:	80 93 6a 00 	sts	0x006A, r24
 14e:	90 93 6b 00 	sts	0x006B, r25
 152:	a0 93 6c 00 	sts	0x006C, r26
 156:	b0 93 6d 00 	sts	0x006D, r27
 15a:	ea cf       	rjmp	.-44     	; 0x130 <main+0x52>

0000015c <_exit>:
 15c:	f8 94       	cli

0000015e <__stop_program>:
 15e:	ff cf       	rjmp	.-2      	; 0x15e <__stop_program>
1. Изо всех сил стараюсь не кормить троллей. 2. Продаю импортные ЭК - https://shop.fulcrum.ru/buy