6 votos

¿Cómo puedo instruir a mi compilador a utilizar 8 bits bytes en lugar de enteros de 16 bits?

Tengo el siguiente código en mi microcontroler programa:

int analogValue = ADCH;        // ADC Data Register

//
// Simple analog comparator. 
// If analogValue lower than threshold then toggle output high,
// Otherwise toggle it low.
//
if ( analogValue > 128 ) {
    PORTB = 0;                 // Port B Data Register
} else {
    PORTB = _BS( outputPin );  // Port B Data Register
}

Donde:

  • ADCH es el registro que contiene el valor de la ADC
  • PORTB es un dital puerto de salida que activa un LED

Mirando el resultado de la asamblea de código, me di cuenta de que se está haciendo un 16 bits comparar (líneas 40-44) donde, estrictamente hablando, sólo 8 bits habría sido suficiente:

40:   90 e0           ldi     r25, 0x00       ; 0
42:   81 38           cpi     r24, 0x81       ; 129
44:   91 05           cpc     r25, r1
46:   14 f0           brlt    .+4             ; 0x4c <__SREG__+0xd>
48:   18 ba           out     0x18, r1        ; PORTB
4a:   f5 cf           rjmp    .-22            ; 0x36 <__CCP__+0x2>
4c:   28 bb           out     0x18, r18       ; PORTB
4e:   f3 cf           rjmp    .-26            ; 0x36 <__CCP__+0x2>

Me doy cuenta de que declaró analogValue como int, que de hecho es de 16 bits en AVR, pero ...

¿Cómo puedo indicar al compilador a utilizar 8 bits comparación? El Arduino IDE me permite utilizar byte, pero avr-gcc por defecto no.

Revise esta página para completar el programa y sus desmontado código resultante.

EDIT1:

Cambiando int a char cambios en el código ensamblador:

14:   11 24           eor     r1, r1          ; r1 = 0
3e:   18 ba           out     0x18, r1        ; PORTB

Básicamente saltarse la prueba en su totalidad.

EDIT2: (Thnx: Wouter van Ooijen)

Cambiando int a unsigned char cambios en el código ensamblador:

3c:   85 b1           in      r24, 0x05       ; ADCH
3e:   ...
40:   87 fd           sbrc    r24, 7          ; compare < 128 (well optimized)
42:   02 c0           rjmp    .+4             ; 0x48 <__SREG__+0x9>
44:   18 ba           out     0x18, r1        ; 24
46:   f7 cf           rjmp    .-18            ; 0x36 <__CCP__+0x2>
48:   98 bb           out     0x18, r25       ; 24
4a:   f5 cf           rjmp    .-22            ; 0x36 <__CCP__+0x2>

18voto

JW. Puntos 145

En realidad creo que es una mejor práctica que evita este arquitectónica ambigüedad es incluir <stdint.h> , a continuación, utilizar declarativa de tipos como:

  • uint8_t de 8 bits sin signo enteros
  • int8_t para firma de 8 bits enteros
  • uint16_t de 16 bits sin signo enteros
  • uint32_t para unsigned enteros de 32 bits

y así sucesivamente...

8voto

GetFree Puntos 495

Más o menos estándar de definición de un byte en C es 'unsigned char'.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X