質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1421閲覧

【C言語】特定アドレスのデータを転送したい

takac1961

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/12/14 00:37

前提・実現したいこと

お忙しい中、何方か回答をお願いしたく。
C言語のポインタがらみで、ROMの特定アドレス(例えば、0x2000)から数バイトのデータをRAMに転送したいのですが、うまくいきません。

発生している問題・エラーメッセージ

想定しているアドレスの内容がコピーされません。

該当のソースコード

以下が該当ソース箇所の抜粋です。

typedef struct {
unsigned long int duwAplPrgSize;
unsigned char dubAplVersion[6];
unsigned char dubAplKind;
unsigned int dubAplChksum;
} SAM_HEAD_APL_T;
SAM_HEAD_APL_T fsl_apl_prg_buffer;
unsigned char *pubCodePrg;   // データ情報アドレス

/* データ(2000H-200CH)読込み */
pubCodePrg = SAM_MINADRESS;
memset( &fsl_apl_prg_buffer, 0x00, 20);
memcpy( &fsl_apl_prg_buffer, (unsigned char)(*pubCodePrg), 20 );

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

開発環境は、renesas CS+ for CA,CX V4.02.00です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

これですかねえ。

c

1memcpy( &fsl_apl_prg_buffer, (unsigned char)(*pubCodePrg), 20 ); 23memcpy( &fsl_apl_prg_buffer, (unsigned char*)pubCodePrg, 20 );

いや、そもそも
pubCodePrg = SAM_MINADRESS;
としているので、
memcpy( &fsl_apl_prg_buffer, pubCodePrg, 20 );
これでいいはず。

ちなみに折角構造体を使っているのだから、マジックナンバーで20と書かないで、sizeof(fsl_apl_prg_buffer)と書くべきです。
またmemsetしたあと、同じサイズをmemcpyしているのだから、memsetは不要かと思います。

SAM_MINADRESSの定義が書かれていないので不明ですが、単に0x00000000みたいな定義なら、pubCodePrg に代入するときにキャストしたほうがいいですね。

ごちゃごちゃ書きましたが、まとめるとこうなります。

c

1pubCodePrg = (unsigned char*)SAM_MINADRESS; 2memcpy( &fsl_apl_prg_buffer, pubCodePrg, sizeof(fsl_apl_prg_buffer) );

投稿2018/12/14 00:53

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takac1961

2018/12/14 01:10

ご丁寧な回答有難うございました。 無事解決できました。また何かありましたら、宜しくお願いします。
guest

0

SAM_MINADRESSとはどういう定義なんでしょうか。
また、コピーされないとはどうなるんでしょうか


memcpy( &fsl_apl_prg_buffer, (unsigned char)(*pubCodePrg), 20 );

ああ、これじゃダメです

memcpy( &fsl_apl_prg_buffer, pubCodePrg, 20 );

でどうでしょう

投稿2018/12/14 00:47

編集2018/12/14 00:52
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takac1961

2018/12/14 00:53

早速のレス有難うございます。 >SAM_MINADRESSとはどういう定義なんでしょうか。 転送元のアドレスです。 >また、コピーされないとはどうなるんでしょうか 転送元ではないデータがコピーされてしまいます。
takac1961

2018/12/14 01:10

ご丁寧な回答有難うございました。 無事解決できました。また何かありましたら、宜しくお願いします。
guest

0

こういうことでしょうか?

C

1/* 正 */ 2memcpy( &fsl_apl_prg_buffer, (unsigned char*)pubCodePrg, 20 ); 3 4/* 誤 pubCodePrgがポイントする中身をアドレスとして参照している */ 5//memcpy( &fsl_apl_prg_buffer, (unsigned char)(*pubCodePrg), 20 );

ご質問とは関係ないですが、memset( &fsl_apl_prg_buffer, 0x00, 20)はいらないのでは。どうせ下のmemcpyで同じサイズ分上書きしてしまうのだし。あと、構造体のパッキングを考えて、20バイトとは確実なのでしょうか。sizeof(fsl_apl_prg_buffer)がより適切な気がします。

投稿2018/12/14 00:51

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takac1961

2018/12/14 01:10

ご丁寧な回答有難うございました。 無事解決できました。また何かありましたら、宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問