Ir al contenido


Diferencia entre un IntelHex creado por un copilador y uno leido de un Chip.


  • Por favor identifícate para responder
4 respuestas en este tema

#1 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 28 diciembre 2008 - 05:11

Pues aqui te pongo este ejemplo para que veas como esta la cosa:

Esto es un intelhex creado por un copilador:

:020000000140BD
:0600230020982D209942F7
:10004000C298C299C2ACC20175183012006E30015C
:10005000FD80FEC0E0C0D0D2D3D2D4E599F608B47A
:100060000D02D201C298D0D0D0E032C29932758D43
:0F007000FD7589207588C0759852D2ACD2AF2229
:00000001FF


y ahora te muestro como quedaria en la memoria del chip:
Imagen Enviada

Ok si miramos la primera linea del intelhex:
:020000000140BD

Tenemos que esa linea solo tiene dos bytes de data (01 40) y que la direcion de esa data comenzara en la '0000'
Tal como ves en la imagen del buffer 01 40 en sus dos primeras casillas.

Segunda linea del file intelhex:
:0600230020982D209942F7

Tenemos 6 bytes de data (20 98 2D 20 99 42) y comienza a partir de la direcion '0023'  Tal como esta en la imagen del buffer.

Tercera linea del file intelhex:
:10004000C298C299C2ACC20175183012006E30015C

Tenemos 16 bytes de data (C2 98 C2 99 C2 AC C2 01 75 18 30 12 00 6E 30 01) que comienzan a partir de la direcion '0040' Tal como se puede ver en la imagen del buffer.

Espero que este claro esto.¿? ;)

Ahora y aqui la confucion. ¿Que de donde se generan las address a la hora de leer de un chip? Cuando leemos de un chip y guardamos el file en formato IntelHex la cosa cambia y no se parece en nada a uno generado por un copilador.Eso si mantiene su funcionalidad, a pesar que cambia su extructura.Si ese file lo programas dentro de un micro otra ves todo quedara donde tiene que quedar. :) ;)




Un Saludo.
Continua....

#2 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 28 diciembre 2008 - 05:51

Aqui esta el codigo usado para insertar el file en el stringgrid:



delphi
  1. function Insertar(Str: String; var Buffer: TBuffer): String;
  2. var
  3.   i,j,k: Integer;
  4. begin
  5.   Result:= EmptyStr;
  6.   Str:= Trim(Str);
  7.   if Copy(Str,1,1) = ':' then
  8.     if TryStrToInt('$' + Copy(Str,2,2),i) then
  9.       if Length(Str) = ((2*i) + 11) then
  10.         if TryStrToInt('$' + Copy(Str,4,4),j) then
  11.           if TryStrToInt('$' + Copy(Str,8,2),k) then
  12.             if k = 0 then
  13.               begin
  14.                 Str:= Copy(Str,10,2*i);
  15.                 for k:= j to (j + i - 1) do
  16.                   begin
  17.                     Buffer[k]:= StrToInt('$' + Copy(Str,1,2));
  18.                     Delete(Str,1,2);
  19.                   end;
  20.               end;
  21. end;





delphi
  1. // Open File ///////////////////////////////////////////////
  2. procedure TForm1.OpenFileClick(Sender: TObject);
  3. var
  4.   i,j,indice: integer;
  5. Str: String;
  6. begin
  7. if OpenDialog1.Execute then
  8. Edit1.Text:=OpenDialog1.FileName;
  9.   Memo1.Clear;
  10.   //Inicializo las columnas y filas de el stringgrid donde se inicia la escritura
  11.     with TStringList.Create do
  12.     try
  13.     if FileExists(Edit1.Text) then
  14.     begin
  15.     LoadFromFile(Edit1.Text);
  16. FillChar(Buffer,Sizeof(Buffer),#00);
  17. for i:= 0 to Count - 1 do
  18. Insertar(Strings[i],Buffer);
  19. j:= StrToInt(Bufsize.caption);
  20. Str:= EmptyStr;
  21. end;
  22.   indice := 0; //Suponiendo que buffer sea un array de 1...x
  23.   for i := 1 to 255 do begin  //2 renglones, cambialo a los renglones que esperas
  24.     for j := 1 to 16 do begin //15 columnas
  25.         stringgrid1.Cells[j,i] := inttohex(Buffer[indice],2);
  26.         inc(indice);
  27.     end;
  28.   end;
  29.   Str:= Str + #32 + IntToHex(Buffer[i],2);
  30.             if ((i+1) mod 16 = 0) then
  31.               begin
  32.                 Memo1.Lines.Add(Str);
  33.                 Str:= EmptyStr;
  34.               end;
  35.  
  36.  
  37.       if Str <> EmptyStr then
  38.         Memo1.Lines.Add(Str);
  39.  
  40.     finally
  41.       Free;
  42.     end;
  43. end;



Un Saludo.

PD:Este codigo fue proporcionado por seoane " Gracias por su colaboracion".

#3 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 28 diciembre 2008 - 06:00

Como puedes ver el tiene en cuenta a la hora de llenar las address la direcion.Por eso es que decimos llenar todo el buffer con (00H) para las address que salte que ya esten con el byte 00 que quiere decir "hacer nada".
Por eso no existe conflicto alguno si esta procesando un intelhex file creado por un copilador o uno que fue leido de un chip y salvado en el PC como intelhex file. ;)

¿Capiche?

Un Saludo.

PD: Si estoy equivocado pues a los Maestros que me rectifiquen.

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 29 diciembre 2008 - 08:23

El formato intelhex permite modificar solo un par de bytes y dejar el resto intactos. Cuando un compilador genera el código a grabar solo solo incluye los bytes que el sabe que tienen que grabarse, el resto le dan igual.

La cosa cambia cuando leemos el chip, en este caso no sabemos nada sobre el programa que esta grabado en el, no sabemos que bytes son importantes y cuales pueden ser ignorados, por eso se copia toda la memoria.

Lo mismo pasa con la función que te pase para escribir un fichero intelhex. La función escribe todo el buffer al archivo porque no puede distinguir entre los bytes que son necesarios y los que están "de relleno".
  • 0

#5 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 29 diciembre 2008 - 06:02

El formato intelhex permite modificar solo un par de bytes y dejar el resto intactos. Cuando un compilador genera el código a grabar solo solo incluye los bytes que el sabe que tienen que grabarse, el resto le dan igual.

La cosa cambia cuando leemos el chip, en este caso no sabemos nada sobre el programa que esta grabado en el, no sabemos que bytes son importantes y cuales pueden ser ignorados, por eso se copia toda la memoria.

Lo mismo pasa con la función que te pase para escribir un fichero intelhex. La función escribe todo el buffer al archivo porque no puede distinguir entre los bytes que son necesarios y los que están "de relleno".


Gracias Maestro, si asi lo entendi y por eso estaba poniendo el ejemplo.Queria que un amigo entendiera una pregunta que me estaba realizando al respecto.
¿Que de donde sacaria las address a la hora de leer el file de un chip? Por eso intente explicar la diferencia entre uno creado por un copilador y otro leido de un chip.
Es que el que se pone a ver un file intelhex creado por un copilador y estudia el formato.¿Entonces la pregunta luego luego es y como se puede reconstruia de regreso ese formato?
Mision impocible. ;)

Un Saludo y Gracias maestro. (y) (b) (b) (b) (b) (b) (b)




IP.Board spam blocked by CleanTalk.