0

サイズが 28 kb のフラッシュの「.hex」ファイルを、サイズが 32 kb の内部フラッシュ ROM に書き込みたいと考えています。上記の質問は、フラッシュ ROM を初期化するためのものです。そのファイルとコードを書くために私がしていることは以下のとおりです。

  • At91(8051) マイクロコントローラの内部 FlashROM を読み書きする必要がある Intel hex 形式の .hex ファイルがあります。
  • 「rb+」モードで .hex ファイルを開きます。
  • ファイルの長さを取得し、ポインターを開始アドレス (0 番目のアドレス) に設定します。
  • そのファイルをページごとに書き込む必要があり、私の場合のページサイズは 256 バイトであるため、ファイルを 256 で除算しました。
  • その後、そのファイルを書き込もうとしました。

どこが間違っているのか教えてください。コードを以下に示します。

int a,b; int size,last_chunk; FILE *file; char *buffer1,name[20]; unsigned long fileLen;

file = fopen("flashROM.hex", "rb+");
if (!file)
{
    fprintf(stderr, "Unable to open file %s", name);
    return;
}

fseek(file, 0, SEEK_END);
fileLen=ftell(file);
printf("the file length is:%d\n",fileLen);
fseek(file, 0, SEEK_SET);

//Allocate memory
buffer1 =(char *)malloc(fileLen+1);

if (!buffer1)
{
    fprintf(stderr, "Memory error!");
            fclose(file);
    return;
}

//Read file contents into buffer
fread(buffer1, fileLen, 1, file);
/* We have to divide the entire file into chunks of 256 bytes*/
size = fileLen/256;
printf("\nsize = %d\n",size);
last_chunk = fileLen%256;
printf("\nlast chunk = %d bytes\n",last_chunk);

address = 0x0000;
printf("File upgradation should start from :%.4x",address);

for(a=0;a<=size;a++)
{
    write(fd,&buffer1,size);
    printf("Iteration=[%d]\t Data=[%x]\n",a,*buffer1);
    usleep(5000);
}
for(b=0;b<=last_chunk;b++)
{
    write(fd,&buffer1,1);
    usleep(5000);
}

上記のプログラムのバイナリを実行した後、私の結果は以下のとおりです。

    Writing upgrade file
    the file length is:30855

    size = 120

    last chunk = 135 bytes
    File upgradation should start from :0000
    Iteration=[0]    Data=[3a]
    Iteration=[1]    Data=[3a]
    Iteration=[2]    Data=[3a]
    Iteration=[3]    Data=[3a]
    Iteration=[4]    Data=[3a]
    Iteration=[5]    Data=[3a]
    Iteration=[6]    Data=[3a]
    Iteration=[7]    Data=[3a]

データが常に「3a」である理由はわかりません。明確ではありません。プログラミングでどこが間違っているか教えてください。

4

2 に答える 2

5

ファイルを読み取り、.hexコントローラーのフラッシュメモリに書き込むために必要なことをすべて実行する特別なツールが必要です(JTAG、通信手段を介してブートローダーと通信するなど)。

このツールは、特定のマイクロコントローラー ファミリによって異なります。8051 は十分な情報ではありません。多くのベンダーから多種多様な 8051 が提供されています。

于 2012-12-06T11:59:55.840 に答える
2

fopen"wb+"のモードとして使用してみてください

ファイルを書き込み可能として開くと、ファイルがまだ存在しない場合は作成されます。

データを書き込むコードも疑わしいようです。writeバッファーへの単純なポインターではなく、バッファーへのポインターへのポインターを渡しています。また、ポインタがインクリメントされているのがわからないので、同じデータを繰り返し書き込んでいます。

書き込みコードを次のようなものに置き換えてみてください。

char* ptr = buffer1;
for(a=0;a<=size;a++)
{
    write(fd,ptr,size);
    ptr+=size;
    printf("Iteration=[%d]\t Data=[%x]\n",a,*buffer1);
    usleep(5000);
}
for(b=0;b<=last_chunk;b++)
{
    write(fd,ptr,1);
    usleep(5000);
}
于 2012-12-06T11:16:14.373 に答える