Contenido>Indice>Intro CursoC51

DISPOSITIVO DE CONMUTACIÓN DE MEMORIA DE CÓDIGO


Este truco se utilizó durante el desarrollo de un módulo cargador de ficheros HEX para un monitor sencillo de 8051. Tras recibir un fichero HEX en RAM, a través del puerto serie, debía ejecutarse el programa recibido comenzando en la dirección 0000H. La complicación estaba en que había que conmutar la memoria antes de ejecutar el nuevo programa.

La solución consistió en colocar la sección de conmutación de memoria en la dirección 0xFFFD para que la búsqueda de la siguiente instrucción se realizara en la dirección 0x0000, simulando de esta forma un reset. Idealmente todos los registros y flags deberían haber sido borrados previamente.

#include "reg.h" 
#include "cemb537.h" 
#include <stdio.h>

void main(void)
   {
   unsigned char tx_char,rx_char,i ;
   P4 = map2 ;
   v24ini_537() ;
   timer0_init_537() ;
   hexload_ini() ;
   EAL = 1 ;
   while(download_completed == 0)
      {
      while(char_received_fl == 0)
         { receive_byte() ; }
      tx_byte = rx_byte ; /* Eco */
      hexload() ;
      send_byte(tx_byte) ;
      char_received_fl = 0 ;
      } 
   real_time_count = 0 ;
   while(real_time_count < 200) 
      { ; }
   i = ((unsigned char (code*)(void)) 0xFFFD) () ;  
       /* Salto a la dirección absoluta 0xfffd. */
   }
//^^^^^^^^^^^^^^^^^^^^^^^ Final del Módulo


;
   NAME SWITCH
; 
; Hace que PC rebase la dirección 0xFFFF simulando un reset 
;
   P4      DATA 0E8H
;
   CSEG AT 0FFFDH
;
   MOV  P4,#02Fh  ; 
;
   END

//^^^^^^^^^^^^^^^^^^^^^^^ Final del Módulo "MAPCON"

 

Hay otras formas de hacer esto. Por ejemplo, el código del módulo MAPCON podría ubicarse durante el linkado así: CODE(SWITCH(0FFFDH)), evitando el uso de "CSEG AT". 


   Contenido>Indice>Intro CursoC51