- ベストアンサー
あるメモリ番地からあるメモリ番地へそっくりコピーする方法
現在、動作確認を行っている基板があるのですが、経験が少なく、いろいろとわかる方に聞く日々が続いています。いろいろと教わった結果、メモリ領域の操作方法や、どのようにメモリ領域を使っているのかを把握することがとても重要と考えて来るようになりました。そこで、テストボードで、CPUにつながったメモリの番地を聞いてみたところ、開発で使用している”memmap.h”というファイルがあると教わりました。それを閲覧してみると次のようにかかれていました。 #include "comm.h" #include "event.h" #include "ethernet/dhcp.h" /* FALSE Memory Map */ #define FLASH_BASE 0x200000 #define FLASH_FONT_ADDR FLASH_BASE #define FLASH_AUDIO_ADDR FLASH_BASE + 0x0B0000 #define FLASH_NUMBER_ADDR FLASH_BASE + 0x1F0000 #define FLASH_ENV_ADDR FLASH_BASE + 0x1F8000 /* SRAM Memory Map */ #define SRAM_BASE 0x400000 #define SARM_TCP_PVC_BUF (BYTE *)(SRAM_BASE + 0x008000) //8 #define SRAM_NUMBER_BUF (BYTE *)(SRAM_BASE + 0x010000) //8 #define SRAM_ENV_BUF (BYTE *)(SRAM_BASE + 0x018000) //8 #define SRAM_FLASH_BUF (BYTE *)(SRAM_BASE + 0x020000) //8 #define SRAM_NET_BUF (BYTE *)(SRAM_BASE + 0x030000) //1 #define SRAM_AUDIO_BUF (BYTE *)(SRAM_BASE + 0x040000) //2 #define SRAM_MISC_USE (BYTE *)(SRAM_BASE + 0x060000) //8 #define SRAM_STACK_BUF (BYTE *)(SRAM_BASE + 0x069000) //8 #define SRAM_JURNEL_BUF (BYTE *)(SRAM_BASE + 0x070000) #define SRAM_JURNEL_BUF2 (BYTE *)(SRAM_BASE + 0x078000) それで、0x400000番地からのSRAMは常に基板の電源を切っても電池で守られているためデータは消えないのですが、ここにパスワード関連の410000番地からのSRAM_NUMBER_BUFでいったんデータを登録したら、FLASH領域のSRAM_NUMBER_BUF(3F0000番地から)に丸ごとコピーしているそうなのですが、そのように丸ごとコピーできるC言語の関数は内でしょうか?また、丸ごとコピーできるような簡単な書き方はないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
memcpyはだめですか?
その他の回答 (2)
- rabbit_cat
- ベストアンサー率40% (829/2062)
どんなCPUなのかわかりまんが、 一般的には、FLASH領域に書き込むのは、単にメモリ転送すればいいわけではなくて、それ専用のAPIを使う必要があると思います。
- nda23
- ベストアンサー率54% (777/1415)
#include<string.h> memmove(void *distination,void *source,size_t size); memcpyと異なり、メモリ領域が重複していても安全にコピーできます。 現在はコピー領域が重複していなくても、仕様変更が無いとは言え ないので、注意しておくべきでしょう。 コピー元とコピー先が重複していて、コピー元が下位アドレスに あると、memcpyではデータが壊れることがあります。
お礼
回答ありがとうございます。 http://www.geocities.jp/ky_webid/c/058.htmlここのWEBサイトでmemcpy関数の使い方をみたのですが、 今回の場合だと、SRAM_NUMBER_BUF(0x410000番地)から0x8000分のデータをFLASH_NUMBER_ADDR(0x3F0000番地)から書き込むという風にするには memcpy(FLASH_NUMBER_ADDR,SRAM_NUMBER_BUF,0x8000);と記述すればよいということでしょうか?