compilación de manipulación de bits AVR en GCC: no se puede obtener SEI en lugar de lectura-modificación-escritura

3

Estoy intentando configurar el bit 2 en el registro TIMSK y usando el siguiente código C:

TIMSK |= (1<<2);

El compilador crea el siguiente código:

TIMSK |= (1<<TOIE1);
108:    89 b7           in  r24, 0x39   ; 57
10a:    84 60           ori r24, 0x04   ; 4
10c:    89 bf           out 0x39, r24   ; 57

Por lo tanto, es una operación de lectura-modificación-escritura que es a) lenta, b) no muy consistente, ya que a veces es mejor no molestar a los bits en exceso.

Sin embargo, si reemplazara TIMSK por digamos PORTA obtendré SEI como se esperaba:

PORTA |= (1<<2);
108:    da 9a           sbi 0x1b, 2 ; 27

Entonces, ¿cómo puedo forzar al compilador a compilar la instrucción anterior como instrucción de bit en lugar de RMW?

¿O este registro ( TIMSK ) no es accesible a bits?

    
pregunta Roman Matveev

1 respuesta

4

Lo encontré:

Cita de la hoja de datos original (página 20):

Los registros de E / S dentro del rango de direcciones 0x00 - 0x1F son directamente accesibles a través de las instrucciones SBI y CBI

Por lo tanto, solo los primeros 32 registros son accesibles a los bits. TIMSK tiene una dirección 0x39, por lo que está bastante por encima del rango :(

    
respondido por el Roman Matveev

Lea otras preguntas en las etiquetas