Contenido>Indice>Intro CursoC51

FUNCIONES INTRÍNSECAS


Hay un número de instrucciones especiales del 8051 que normalmente no utiliza el compilador C51. Por razones de velocidad, a veces resulta útil tener acceso a las mismas.

A diferencia del operador ">>", la función _cror_ permite utilizar la instrucción del 8051 "RR A" (rotate accumulator right) para rotar un char. Esto proporciona un resultado mucho más rápido que el que puede obtenerse mediante el operador >>. De igual forma las funciones intrínsecas _iror_ y _lror_ sirven para rotar a la derecha valores de tipo int y long respectivamente.

La función _nop_ añade simplemente una instrucción NOP para generar un retardo de tiempo corto y predecible. Otra función _testbit_, utiliza la instrucción JBC para comprobar el estado de un bit y en caso de que se encuentre a "1", borrarlo y saltar a otra región del programa.

Las funciones intrínsecas incluyen su código en el lugar donde se las nombra, eliminando las instrucciones de llamada y retorno que siempre están presentes en las llamadas normales a funciones. Para hacer uso de las mismas se necesita incluir el fichero "intrins.h" en el fichero fuente. 

El siguiente ejemplo utiliza la función intrínseca _testbit_() ahorrando una instrucción CLR:

; #include <intrins.h>
; 
; 
; unsigned int shift_reg = 0 ; 
; 
; bit test_flag ; 
; 
; void main(void) {
    RSEG  ?PR?main?T
    USING    0
main:
            ; SOURCE LINE # 12
; 
; /* Utilizando la forma normal */ 
; 
;    test_flag = 1 ;
            ; SOURCE LINE # 14
    SETB     test_flag
; 
;    if(test_flag == 1) {
            ; SOURCE LINE # 16
    JNB      test_flag,?C0001
;       test_flag = 0 ;
            ; SOURCE LINE # 17
    CLR      test_flag
;       P1 = 0xff     ;
            ; SOURCE LINE # 18
    MOV      P1,#0FFH
;       }
            ; SOURCE LINE # 19
?C0001: 
; 
; /* Utilizando una función intrínseca */ 
; 
;    test_flag = 1 ;
            ; SOURCE LINE # 21
    SETB     test_flag
; 
;   if(!_testbit_(test_flag)) {
            ; SOURCE LINE # 23
    JBC      test_flag,?C0003
;       P1 = 0xff     ;
            ; SOURCE LINE # 24
    MOV      P1,#0FFH
;       }            ; SOURCE LINE # 25
; 
;    }
            ; SOURCE LINE # 27
?C0003:
    RET      
; END OF main
    END 

   Contenido>Indice>Intro CursoC51