Как ускорить преобразование int8 to char

O'NeiLL
Offline
Зарегистрирован: 13.08.2014

Привет заметил что такой код работает очень медленно:



uint8_t Random_numbers(uint8_t a, uint8_t b)
{
  return random(a, b);
}
 

char a[17]
a[8] = Random_numbers(0, 255);

Путём замеров, проб и ошибок понял, что дело тут не в считывании с аналоговой ножки, а имнно в присвоении uint8_t  char'у.

Можно ли как-то ускорить это преобразование?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Как на счет доказательств? Каким именно образом производились измерения?

Ускорить - это до какого уровня?

Вот код преобразования int8_t в char:

     2b4:	77 27       	eor	r23, r23
     2b6:	67 fd       	sbrc	r22, 7
     2b8:	70 95       	com	r23

Куда уж быстрее?

А это код random (фрагмент):

long random(long howsmall, long howbig)
{
     e1e:	cf 92       	push	r12
     e20:	df 92       	push	r13
     e22:	ef 92       	push	r14
     e24:	ff 92       	push	r15
     e26:	6b 01       	movw	r12, r22
     e28:	7c 01       	movw	r14, r24
  if (howsmall >= howbig) {
     e2a:	62 17       	cp	r22, r18
     e2c:	73 07       	cpc	r23, r19
     e2e:	84 07       	cpc	r24, r20
     e30:	95 07       	cpc	r25, r21
     e32:	64 f4       	brge	.+24     	; 0xe4c <_Z6randomll+0x2e>
    return howsmall;
  }
  long diff = howbig - howsmall;
     e34:	ca 01       	movw	r24, r20
     e36:	b9 01       	movw	r22, r18
     e38:	6c 19       	sub	r22, r12
     e3a:	7d 09       	sbc	r23, r13
     e3c:	8e 09       	sbc	r24, r14
     e3e:	9f 09       	sbc	r25, r15
  return random(diff) + howsmall;
     e40:	0e 94 eb 06 	call	0xdd6	; 0xdd6 <_Z6randoml>
     e44:	6c 0d       	add	r22, r12
     e46:	7d 1d       	adc	r23, r13
     e48:	8e 1d       	adc	r24, r14
     e4a:	9f 1d       	adc	r25, r15
}
     e4c:	ff 90       	pop	r15
     e4e:	ef 90       	pop	r14
     e50:	df 90       	pop	r13
     e52:	cf 90       	pop	r12
     e54:	08 95       	ret