まず、下記簡単な経緯になります。
CS+ for CA, CX (V4.04.00)にて、安全機能のひとつのCRCを実装したく調査・実験を繰り返しておりました。
CRC計算には、ルネサス様から提供されているセルフテストライブラリ(Ver1.30)を使用しております。
( https://www.renesas.com/jp/ja/software/D6003884.html )
その中で、CRC演算を下図のように設定しているのですが、肝心の期待値をうまく参照することができずエラーとなりました。
期待値は【アドレス0x0FFFCに2byte】で、【コンパイル/HEX生成時に計算・格納される】という認識でしたが、
ダミーデータを付加して数十パターンほど試しましたが、当該アドレスの値はポインタ参照しても'0x0000'のままでした。
例:アドレス0x0FFFCの2byteを参照したいとき、【 *(unsigned short *)0x0FFFC 】として参照しています。
これまでにもCRC演算設定に関してはご質問されている方がいたため、自身で検索・対応できる範囲は参考にしてきました。(オンチップデバッグ無効など)
ここ数日はコードデータそのものを漁っていたのですが、ふとアドレス0x0FE20に、ライブラリ処理より算出されるCRC計算値と同じ値があることを見つけました。
(こちらも数十パターンで確認済みです。)
さて、前置きが長くなりましたが、下記3点について何卒ご教示ください。
① アドレス0x0FE20の値は、想定している期待値で間違いないのか?もしくは別モノか?
② アドレスのポインタ参照時に、そもそも勘違い/誤りがないか?(オフセットのようなものが働く?)
③ CS+設定時およびライブラリ利用時に、気を付けて設定すべき項目はあるか?
上記以外でも、懸念される項目等ありましたら併せてご教示いただけますと幸いです。
以上、よろしくお願い致します。
自己レスになります。
まずは当方の確認作業不足がありました。訂正してお詫び致します。
https://japan.renesasrulz.com/cafe_rene/f/forum18/1605/rl78-g13-crc/7038#7038
上記URL(チョコ様)の通り、HEXファイル中にCRC期待値らしきものを確認しました。
ただ、ライブラリ関数から算出された値とは異なっているため、そもそも比較チェック時にNGになってはしまうのですが、
これが目当てのCRC期待値としたとき、ライブラリの算出方法とは別の方法で算出されたものということになるのでしょうか?
・期待値の参照方法(アドレス/ポインタ)が誤っているのか?
・CRCの算出方法が異なっているのか?
・アドレス"0x0FE20"の値は何なのか?ライブラリ関数中の変数値をただ読み出してしまっているのか?
(同じものを見ているから、CRCが正しく出ていると思い込んでいるのか?)
といった部分が未だにモヤモヤしたままではあります。
もしご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
Saladbarさん、こんにちは。NoMaYと申します。> 例:アドレス0x0FFFCの2byteを参照したいとき、【 *(unsigned short *)0x0FFFC 】として参照しています。farポインタとして参照しないといけないのではないでしょうか。
Saladbarさん、こんにちは。NoMaYです。もう一点あるかもと思います。オブジェクトコンバーターで生成しますので、デバッグ時にlmfファイルをダウンロードしても、そのアドレスに存在しないと思います。(オブジェクトコンバーターは(ROM化プロセッサ実行後の)lmfファイルを読み込んでHEXファイルを出力するものだからです。)
Saladbarさん、こんにちは。NoMaYです。> (特にダウンロード等はしていない認識です)今回の件では、デバッガは使用していない、ということでよいですか?RFP等で書き込んでいるということでよいすか?アドレス0x0FFFCの2byteの値の確認などは、printf等で外部に出力するなどしているということでよいですか?デバッガを使用していれば、HEXファイルではなくLMFファイルをダウンロードするのですが、アドレス0x0FFFCの2byteの値の確認にデバッガを使っていないことが分からなかったので、あのように書いたのです。以前に以下のスレッドがありましたが、LMFファイルにCRC値が入っていないのはCA78K0Rの落とし穴ですので、あのように書いたのです。オブジェクトコンバーターによるCRC演算の結果出力機能についてjapan.renesasrulz.com/cafe_rene/f/forum18/5841/crc[追記]最初の投稿の以下の部分で、デバッガではダウンロードしていなかった、ということになりますね。すみません、今、把握しました。> これまでにもCRC演算設定に関してはご質問されている方がいたため、自身で検索・対応できる範囲は参考にしてきました。(オンチップデバッグ無効など)
NoMay様、fujita nozomu様 お世話になっております。お二方のおかげで、課題を一段階ブレークスルーできたように思います。 こちらの拙い情報からご推察いただきながらも、適宜ご助言いただきまして感謝申し上げます。ありがとうございます。 あれからお二方にご教示いただいた内容を確認し、またマニュアル類も関連しそうなキーワードで改めて確認しました。 以下、拙文ですが中途報告させていただきます。 ① far領域指定ですが、無事に目的アドレス値を参照できました。(探していたCRC期待値でした) (X) *(unsigned short *)0x0000FFFCUL (O) *(unsigned short __far *)0x0000FFFCUL ② デバッガによるダウンロードは実施しておりませんでした。 いずれ折を見て確認・勉強致します。 (実はまだ一度もデバッグエミュレーションをしたことがないので、お恥ずかしい限りです。。。) ③ CRC演算における設定/処理上の留意事項が想像以上に多いことが今回わかりまして、 大変参考になりました。(みなさんも色々と新しいことに試行錯誤されてるのが励みです。。。) 今後も実装を続けながら、少しずつ周辺のコーディングも固めていけるように精進します。 ④ 個人的に悲しい文言をマニュアル中に見つけてしまったので、共有させていただきます。 セルフテストライブラリのマニュアル "RL78 MCUのためのIEC60730/60335セルフテスト・ライブラリ(R01AN1062JJ0130), Rev.1.30, p.28"中段 『本ライブラリで実施しているソフトウェアCRC(stl_RL78_sw_crc_asm関数)の基準CRC値は、 CubeSuite+で生成できません。ソフトウェアCRCのアセンブラ・コードを参考にして、 ユーザ自身で準備する必要があります。』 このあたりの記述はこの資料でしか見付けられなかったため、やはり時間をかけて様々な資料に 目を通していくしかないなぁ、と調査不足の自戒も込めて思い知りました。 大変お騒がせいたしました。 // 今回、高速CRC演算をライブラリ関数(stl_RL78_sw_crc_asm)利用で解決したかったのですが、 CS+の設定で自動的に吐き出し/埋め込みされる期待値と互換性がないということがわかりました。(恐らく) 汎用CRC設定で試しに確認したところ、上記①アドレス中の値とライブラリ関数(stl_RL78_peripheral_crc)利用で 算出された計算値がピッタリ合いまして、やはりチョロっと書いてあった内容の通りなのか…とやや落胆しております。 少なくとも、汎用CRCに関しては特段手を加えずにライブラリ利用可能な事までは結果的に理解が深まったのが幸いです。 高速CRC実装の実験(自力の埋め込み方法含めて)は今後も合間を見て継続していく予定ですので、 色々と至らない部分もございますが、またお目にかかる機会がございましたらご教示いただけますと幸いです。 以上、長文失礼致しました。
Saladbarさん、こんにちは。NoMaYです。> 高速CRC演算をライブラリ関数(stl_RL78_sw_crc_asm)利用で解決したかったのですが、stl_RL78_sw_crc_asmはハードウェアCRC演算器を内蔵していないマイコン向けのライブラリかと思うのです。RL78/G14は、ハードウェアCRC演算器(ハードウェア高速CRCとハードウェア汎用CRCが可能)を内蔵していますので、この目的自体が何かおかしいというか矛盾しているというか、そんな印象がします。RL78/G14では、以下の組み合わせではないでしょうか?(1) ハードウェアCRC演算器直接操作で高速CRCとする(CA78K0Rで高速CRC CRC-16-CCITTとして期待値を生成可能)(2) ハードウェアCRC演算器直接操作で汎用CRCとする(CA78K0Rで汎用CRC(ビット並び反転のCRC-16-CCITT)として期待値を生成可能)(3) ハードウェアCRC演算器ライブラリ(stl_RL78_peripheral_crc)操作で汎用CRCとする(CA78K0Rで汎用CRC(ビット並び反転のCRC-16-CCITT)として期待値を生成可能)なお、CA78K0Rで生成可能なSENT準拠による高速CRCに関しては、CS+のヘルプにはデバイスのユーザーズ・マニュアルに記載されていると書かれているものの、RL78/G14のハードウェア・マニュアルの高速CRCには実際にはSENTに関する記載が無くて、何なのか不明です。)[追記]ハードウェアCRC演算器を内蔵していないマイコンで、以下となるのではないでしょうか。(a) ソフトウェアCRC演算ライブラリ(stl_RL78_sw_crc)でCRCを求める(CA78K0Rでは期待値の生成不可)