gremlinable (gremlinable) wrote,
gremlinable
gremlinable

О работе с массивами

Когда в программе есть большой объём данных хочется для удобства собрать его в одну структуру. А в некоторых случаях в этой структуре хочется ещё и массивов напихать. Так вот, хочу отметить, что GCC местами туповат, по-этому надо ему понятно объяснять, как ему взять данные из этой байды. Под катом сравнение двух способов работы с массивами

Простой вариант
	int16_t arg1, arg2;
	uint16_t val;
	arg1 = G_data.channels[a_arg].A;
 49e:	a8 2f       	mov	r26, r24
 4a0:	b0 e0       	ldi	r27, 0x00	; 0
 4a2:	aa 0f       	add	r26, r26
 4a4:	bb 1f       	adc	r27, r27
 4a6:	fd 01       	movw	r30, r26
 4a8:	31 96       	adiw	r30, 0x01	; 1
 4aa:	85 e8       	ldi	r24, 0x85	; 133
 4ac:	91 e0       	ldi	r25, 0x01	; 1
 4ae:	ee 0f       	add	r30, r30
 4b0:	ff 1f       	adc	r31, r31
 4b2:	ee 0f       	add	r30, r30
 4b4:	ff 1f       	adc	r31, r31
 4b6:	ee 0f       	add	r30, r30
 4b8:	ff 1f       	adc	r31, r31
 4ba:	e8 0f       	add	r30, r24
 4bc:	f9 1f       	adc	r31, r25
 4be:	20 81       	ld	r18, Z
 4c0:	31 81       	ldd	r19, Z+1	; 0x01
	arg2 = G_data.channels[a_arg].B;
 4c2:	aa 0f       	add	r26, r26
 4c4:	bb 1f       	adc	r27, r27
 4c6:	aa 0f       	add	r26, r26
 4c8:	bb 1f       	adc	r27, r27
 4ca:	aa 0f       	add	r26, r26
 4cc:	bb 1f       	adc	r27, r27
 4ce:	a8 0f       	add	r26, r24
 4d0:	b9 1f       	adc	r27, r25
 4d2:	1a 96       	adiw	r26, 0x0a	; 10
 4d4:	8d 91       	ld	r24, X+
 4d6:	9c 91       	ld	r25, X
 4d8:	1b 97       	sbiw	r26, 0x0b	; 11
	SQRT_SQ_SUMM_16(arg1, arg2, val);


Хитрый вариант
	int16_t arg1, arg2;
	uint16_t val;
	struct t_data_chan *chan_data = G_data.channels+a_arg;
 49e:	e8 2f       	mov	r30, r24
 4a0:	f0 e0       	ldi	r31, 0x00	; 0
 4a2:	e2 95       	swap	r30
 4a4:	f2 95       	swap	r31
 4a6:	f0 7f       	andi	r31, 0xF0	; 240
 4a8:	fe 27       	eor	r31, r30
 4aa:	e0 7f       	andi	r30, 0xF0	; 240
 4ac:	fe 27       	eor	r31, r30
 4ae:	eb 57       	subi	r30, 0x7B	; 123
 4b0:	fe 4f       	sbci	r31, 0xFE	; 254
	arg1 = chan_data->A;
	arg2 = chan_data->B;
	SQRT_SQ_SUMM_16(arg1, arg2, val);
 4b2:	20 85       	ldd	r18, Z+8	; 0x08
 4b4:	31 85       	ldd	r19, Z+9	; 0x09
 4b6:	82 85       	ldd	r24, Z+10	; 0x0a
 4b8:	93 85       	ldd	r25, Z+11	; 0x0b
Tags: avr, gcc, памятка, программирование
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments