組込プログラム(基礎)の学習媒体について

お世話になっています。太郎です。

以前投稿させて頂いたテレワーク対応として
R5F563NBDxFCから、RX65N Target Boardへ既存PGの移植を行った際
セクション指定をしている変数へ値が設定できない事象が発生しました。(未初期化セクション領域)
単純に、セクション指定を外せば自動的に割り当てられるかもと試したりしても動作しません。

そもそもセクション指定の意味・意義が分からず。
調べるとやり方は見つかるものの、利点/なぜやるのかは見つけられませんでした。
(おそらくコンパイラ ユーザーズマニュアルが回答に近いのでしょうか)


こういったことについて、1つ1つをQAでお尋ねするのは宜しくないとは思うので、
Web上やQAから出来る限り探しているのですが中々辿り着けなかったり、1つ1つの単語が不明だったりします。
私のようなPC/スマホ/サーバ等の、OSありきのプログラムばかり学んできた者は数多く居ると思うのですが、
その辺りのの人間でもとっつけるような書籍やWebサイトなどがあればご紹介いただけないでしょうか。。。
(スタートアッププログラムとか、ベクタテーブルあたりも学ぶ必要があると思っています。)

Parents
  •  太郎さん、こんにちは。尭です。

     なぜセクションを使用するかは「似た用途のデータは大抵同じメモリ領域に配置されるから」という認識でよいかと思います。
     CC-RXの場合は大まかにcode、data、romdataの3つに分けているようで
    code→プログラム本体
    data→書き換え可能なデータ類
    romdata→定数のデータ類
     となるようです。codeとromdataは実行中に書き換わることはないのでFlashROMに配置できますが、dataは書き換える必要があるのでSRAMに配置する必要があります。配置されるアドレスが違うのでこれらは別々にまとめておく必要があり、その管理単位がセクションです。

    >スタートアッププログラム
     PC等ではローダに相当する物でアプリケーションプログラムが動作できるよう下準備を行うプログラムのことです。マイコンの場合例えばハードウェアの最低限の初期化、スタックポインタの初期化、初期値が必要な変数へFlashROMから値のコピーなどが行われます。

    >ベクタテーブル
     割り込み回りも含めた理解が必要だと思います。NoMaYさんが紹介されているRenesas Engineer School「マイコン活用基礎 これを知らずにマイコンは使えない!「周辺機能」を学ぼう」の4~6で説明されています。

     確かにセクションやそれを扱うリンカやローダを解説しているWebサイトや書籍はあまりないように感じます。
     自分が知っている範囲ですと「リンカ・ローダ実践開発テクニック」と言う本がありまして、この本自体はFreeBSD&gccを前提に書かれているのでそのままマイコンに適用できませんが、メモリマップや「セクションがリンカやローダーの中でどのように使われるのか」あたりを理解する助けになるかもしれません。

     最後に本題のRX63NからRX65Nに移植したら動作がおかしいとのことですが、RX65Nのプロジェクトを作るときにRX63Nのプロジェクトのデータを流用しませんでしたか?
     CS+でプロジェクトを作るときに別プロジェクトのデータを流用するにチェックを入れると元になるプロジェクトが別のマイコンであってもセクション情報が新しいプロジェクトにコピーされてソースコードとセクション情報の不整合が発生する可能性があります。セクション名を含むソースコードを検証せずにコピペしたような場合も同様の問題が起きる可能性があります。

  • 尭さん、こんにちは。太郎です。
    個々に細かくご教示いただきありがとうございます。
    「リンカ・ローダ実践開発テクニック」も購入してみます!
    基本的にはセクションは自動振分されると思うのですが、わざわざ指定するのは何故なのでしょう
    I/Oを直接使用する場合、アドレス指定して値を設定するため。。。とかですかね

    >>RX65Nのプロジェクトを作るときにRX63Nのプロジェクトのデータを流用しませんでしたか?
    ここについては行っていません。RX65NのLチカsampleに、ソースコードのみ継ぎ足す形で
    (セクション指定も別途行いました)

  • こんばんは。尭です。

    プロジェクトの引き継ぎが原因でないとすると自ら編集した所に原因があると思いますが、核心はご自身で書いている
    >基本的にはセクションは自動振分されると思うのですが、わざわざ指定するのは何故なのでしょう
    でしょう。セクションの構成をデフォルトから変更して変数をそこに配置するのは相応の理由があるはずです。
    別の人から引き継いだ物であればその人に確認した方が早いかも知れません。

    >その変数に値を代入しても代入できない状態なのです。(エラーも発生しない)
    書き込みは成功するが読み出すと書き込んだ値と違う値が読み出されるという理解であっているなら、一般的に考えられる原因は「そこにRAMがないから」だと思います。アドレスがRAMではない場所を示していたり、書き込み先が動作していない(内蔵ペリフェラルならクロックが停止されている)場合そのような現象が起きる事があります。

  • 尭さん、こんにちは。太郎です。
    ありがとうございます。解決いたしました。
    「そこにRAMがないから」から気付きを得まして、
    やっと「マニュアルのアドレスマップを確認」するという考えに行きつきました。

    セクション指定している先は0x07000000の外部アドレス空間でした。
    調べて初めて知りましたが、マイコンにも外付けRAMなる物が繋げれるのですね。
    私自身の知見があれば、NoMaYさんに記載いただいたアドバイスから
    辿っても気づけたのかもしれません。(mapファイル)

    マイコン用のRAM(HY57V281620ETP-H)を買ってみることにします。
    足が細すぎてはんだ付け無理そうなので、
    プリント基板のオーダーでもしてみようかな。。。(こちらも未経験)

    >>別の人から引き継いだ物であれば
    退職しており、有識者は誰もおりません。。。引継ぎも組込特有の部分についてはほぼ0なのです。
    (既存PGの微改造の仕事が多いのですが、いつか大きめの改修依頼が来たら痛い目を見そうです。。。)


    いったんは解決しましたが、上記理由で有識者も居ない状態なので
    皆様からご教示いただいた物を中心に、継続的に勉強していきたいと思います。
    ありがとうございました。

  • こんばんは、尭です。

     解決されたようでよかったです。アドレスが0x07000000ですと外部アドレス空間のCS1領域ですね。SDRAMは0x08000000からなので違います。そもそもTarget Board for RX65Nに載っているRX65Nは100pinなのでSDRAMは利用できません。RX65Nの場合SDRAMを使えるようになるのは144pin以上です。

     ここからはお節介になるかもしれませんがCS1領域にアクセスするコードがあると言うことは元のRX63Nに何らかのデバイスが外付けされていると思われます。ありがちそうなケースを挙げると
    1.RX63Nの内蔵RAMが足りなくてSRAMが接続されている
     外付けされているSRAMの容量にもよりますが、該当セクションのアドレスをRX65Nの内蔵拡張RAM(アドレスは0x00800000)に変更するだけで済むかもしれません。この領域のRAMは本来VRAM用ですが液晶を繋いだりしないのであれば任意の用途に使えます。
    2.SRAMではない別のデバイスが接続されている
     汎用ロジックIC群に接続されている・・・市販のバスインターフェイスを持つICに接続されている・・・FPGAやCPLD等のプログラマブルロジックデバイスに接続されている・・・等々が考えられますが、この場合その変数は外部デバイスを操作するために使用されている思われます。
    あたりでしょうか。回路図やブロック図をみてRX63Nの外部バスに繋がっている物を確認された方が良いように思います。繋がっている物は一つとは限りません。複数のデバイスが繋がっている可能性もあります。2の場合はRX65Nに移植するのであれば外付けされている回路も再現する必要があるのではないでしょうか。

Reply
  • こんばんは、尭です。

     解決されたようでよかったです。アドレスが0x07000000ですと外部アドレス空間のCS1領域ですね。SDRAMは0x08000000からなので違います。そもそもTarget Board for RX65Nに載っているRX65Nは100pinなのでSDRAMは利用できません。RX65Nの場合SDRAMを使えるようになるのは144pin以上です。

     ここからはお節介になるかもしれませんがCS1領域にアクセスするコードがあると言うことは元のRX63Nに何らかのデバイスが外付けされていると思われます。ありがちそうなケースを挙げると
    1.RX63Nの内蔵RAMが足りなくてSRAMが接続されている
     外付けされているSRAMの容量にもよりますが、該当セクションのアドレスをRX65Nの内蔵拡張RAM(アドレスは0x00800000)に変更するだけで済むかもしれません。この領域のRAMは本来VRAM用ですが液晶を繋いだりしないのであれば任意の用途に使えます。
    2.SRAMではない別のデバイスが接続されている
     汎用ロジックIC群に接続されている・・・市販のバスインターフェイスを持つICに接続されている・・・FPGAやCPLD等のプログラマブルロジックデバイスに接続されている・・・等々が考えられますが、この場合その変数は外部デバイスを操作するために使用されている思われます。
    あたりでしょうか。回路図やブロック図をみてRX63Nの外部バスに繋がっている物を確認された方が良いように思います。繋がっている物は一つとは限りません。複数のデバイスが繋がっている可能性もあります。2の場合はRX65Nに移植するのであれば外付けされている回路も再現する必要があるのではないでしょうか。

Children
  • 尭さん、こんにちは。太郎です。
    共通マニュアルであることを失念し、読み切れていなかったです。
    ご指摘ありがとうございます。また深い沼にハマるところでした。

    元の環境をよく見てみると、以下のRAMが積まれていましたので、
    何かしら積まないと動作しないかと考えています。
    「MR4A16BYS35」MRAM 16Mb(1M x 16)パラレル 35ns 54-TSOP2

    ビルド時のメッセージを見ると
    RAMDATA SECTION: 000f8d66 Byte(s)
    ROMDATA SECTION: 00003bf2 Byte(s)
    PROGRAM SECTION: 0001d83c Byte(s)
    となっており、標準RAM256Kbyte + 拡張RAM384Kbyteでは全然足りないですね。。。(約1M超え)

    元々積まれているのはMRAMですが、不揮発性である必要はないのでSRAM(or DRAM)にしようと思います。
    秋月電子さんのカタログを見てると、あまり大きいものはないみたいです。
    (それで誤ってSDRAMにいきついてしまったのですが。/バイトではなくビット表記が多く微妙に苦しみました)

    HM678127UHJ-12を複数積んでみようかなと考えています。

  • こんにちは。尭です。

    SDRAMを買おうとされていたので間に合って良かったです。自分自身メモリを外付けしたりマイコンが載る基板を設計したことはないのでこの辺は検討不足があるかもしれません(このレスもマニュアル等を見ながら書いています)。

    16Mbitのメモリが外付けされているとなると確かに内蔵RAMだけでは足りませんね。メモリを外付けする必要があると思いますがそうなると
    1.16Mbitか8Mbitの非同期SRAMを買ってきて接続する
     それなりの速度で動作させる事を考えると1MbitのSRAMチップを16個接続するのは無理があると思います。
     マイコンのマニュアルに載っているSDRAMの接続例も1個か2個ですし、RX63Nに非同期SRAMを接続するアプリケーションノート(R01AN2119JJ0100)も同様ですから同程度にするのが無難でしょう。この容量の非同期SRAMとなるとDigi-Key等のディストリビュータから買うことになりそうですが欠品が目立ちますしそこそこ良いお値段しそうです。Target Board for RX65Nの場合ピンヘッダ越しの接続になるのも不安要因です。
    2.144pin以上のRXマイコンとSDRAMを買ってきて基板を作り実装する
     Target Board for RX65Nをあきらめることになりますがマルツ通販(RXマイコン)や秋月(SDRAM)等の国内流通から購入できる可能性があります。ただプリント基板の作成自体初めてとなるとマイコンを含めた基板の作成は結構なチャレンジになりそうです。
    あたりになるのではないでしょうか。

    RX65NにこだわらないのであればGR-KAEDE(RX64M)を購入するという手もあります。SDRAM搭載済みのボードですがエミュレータが搭載されていないので持っていなければ購入するか、Target Board for RX65Nを改造してE2 Lite代わりにする(基板を見た感じでは出来そうですが実際にやったことはないので出来るとは言い切れません)ことになると思います。