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

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

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

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


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

  • 書籍やWebサイトなどがあればご紹介いただけないでしょうか。

    セクション名一覧 | CS+ V4.01.00 - Renesas

    などいかが

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

    そういう情報をお探しであれば、以下のページから探すのも一手かな、と思うのです。(もっとも、正直なところ、私自身は、ガッツリとは読んだことや受講したことが無かったりというところですので、その点は御容赦下さい。)

    ルネサス エンジニアスクール トップページ
    www.renesas.com/jp/ja/support/engineer-school

    ルネサス 半導体セミナー テキスト閲覧ページ
    www.renesas.com/jp/ja/support/training/seminar/document

    ルネサス アカデミー オンライン開催コース一覧ページ
    academy.renesas.com/?eid=1401

    [追記]

    改めて、今、幾つか中を見てみたのですが、扱っているマイコンがRX62NとかRX63Nとか古いマイコンだったり、RXスマートコンフィグレータのBSPモジュールでは違うことになっていたり、とかビミョーなところはあります、、、

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

    情報ありがとうございます。

    ただ、そもそも「セクションとは何か」をうまく認識できていなくて困っている状態なのです。

    サンプルプログラム等、指定しなくとも動作する物もあるので、基本的にはわざわざ指定する必要はないと思うのですが

    必要に応じて変えることが出来る物だと予想しています。

    例えば、「RAM領域の割り振りを自動で行うと均一に割り振られるが、扱う変数が多い為RAM割り振りを変える」みないな使い方だったりするのですかね。。。

    他にも、使用するアドレス先の注意点やセクション内のbyteサイズ上限等もあったりするのではないかと。。。

    現在、具体的に困っている内容は、「恐らく誤った使用方法をしているセクションを直したい」です。

    大量の未初期化変数に対して、セクションを指定しております。

    が、その変数に値を代入しても代入できない状態なのです。(エラーも発生しない)

    セクションの指定外の所に、その変数を置くと代入できます。

    が、セクションから未初期化変数全部を外すと、また代入できなくなります。。。

    ※移植元のマイコンでは問題なく動作しているため、ビルド・ツールのセクション設定や、環境的な問題なのかもと思っています。

  • NoMaYさん

    こんにちは、太郎です。

    情報ありがとうございます。

    こちらもRX63Nを使用していたりするので、逆に丁度いいです(笑)

    順番に目を通してみます。セミナーもあったりするんですね。

    過去セミナーで使用したであろうテキスト「絵解きマイコンcプログラミング教科書」も購入してみます。

  • 使用するアドレス先の注意点やセクション内のbyteサイズ上限等もあったりするのではないかと。。。

    現在、具体的に困っている内容は、「恐らく誤った使用方法をしているセクションを直したい」です。

    大量の未初期化変数に対して、セクションを指定しております。

    わたしもC言語を始めた頃はセクションという言葉を聞くとおっくうでした、長年セクションで苦労してみると実は意外と単純な仕組みだと気が付くはずです、まずセクション名ですがその種類によってわかりやすいように適当に名前が付けられています、例えば

    1.RAMの初期化されない変数領域 R

    2.RAMの初期化されるべき変数領域 B

    3.ROMのコード領域 C

    4.ROMのデータ領域 C$BSEC

    初期化されるべき変数領域等はmain関数の前にROMのデータ領域からRAMの初期化されるべき変数領域にmemcpy関数等で規定値をコピーしたりしています、これらのセクションの名前はコンパイラで規定値がありますが、自分で作ることもできます、開始アドレスや終了アドレスも任意指定可能です、コンパイラのマニュアルを調べるとわかるかと思います。


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

    > 大量の 未初期化 変数に対して、セクションを指定しております。 が、その変数に値を代入しても代入できない状態なのです。(エラーも発生しない) セクションの指定外の所に、その変数を置くと代入できます。 が、セクションから未初期化変数全部を外すと、また代入できなくなります。。。

    そういう時は、リンカが生成する○○○.mapというマップファイルなるものを確認するとヒントが見付かることが多いですよ。もし生成されていなければ、リンカオプションで生成するようにして、CC-RXであれば生成内容を選択出来るようになってますので、詳細モード(だったかな)で生成させると良いです。(もし差し支えなければ、マップファイルをzipファイルに固めてリプライに添付されても良いかと思うのです。どのセクションのどの変数が期待した通りに動作してくれないのか、という説明と一緒に。)

    "そういう時"の例:

    (1) グローバル変数やスタティック変数に代入出来ない
    (2) スタックを沢山使うと暴走する
    (3) グローバル変数やスタティック変数の初期値(main関数の先頭に来た時点での値)が期待した通りではない

    マップファイルを見ても分からない事例:

    (A) パソコン/サーバのコンパイラ/ソフトウェア開発プラットフォームでは滅多に無いと思いますが、組み込みプログラムの世界では、スタートアップルーチン内でグローバル変数やスタティック変数の初期化が始まる前に、何かしらユーザがカスタマイズ出来る(or しないといけない)関数が呼び出されることがあって、そういう関数内でうっかり気付かずにグローバル変数やスタティック変数を使うと期待した動作をしてくれない、というのがあります。

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

     なぜセクションを使用するかは「似た用途のデータは大抵同じメモリ領域に配置されるから」という認識でよいかと思います。
     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+でプロジェクトを作るときに別プロジェクトのデータを流用するにチェックを入れると元になるプロジェクトが別のマイコンであってもセクション情報が新しいプロジェクトにコピーされてソースコードとセクション情報の不整合が発生する可能性があります。セクション名を含むソースコードを検証せずにコピペしたような場合も同様の問題が起きる可能性があります。

  • 太郎さまこんにちは。Sugachanceです。

    ユークエスト社の記事(学校では教えてくれないこと)は参考になるのではないでしょうか。

    https://www.uquest.co.jp/embedded/index.html

    コードサイズを聞かれたらの項目に
    セクションの説明などあります。

  • IKUZOさん、こんにちは。太郎です。
    コメントありがとうございます。
    セクション指定はしているのですが、指定した通りに動いていない状態なので、
    やってはいけないことをした結果動いていないのかなと考えています。
    マニュアルをもう少し読み込んでみます。

  • NoMaYさん、こんにちは。太郎です。
    ウェブ上にあげるのは承認がおりず。。。ご提案いただいたのに申し訳ありません。
    セクション指定した後、最終的にどうなったかはmapファイル見ればわかりそうですね。。。
    前回コメントで挙げていただいた内容も全部はまだ見切れていないので、
    mapファイルについても探して勉強してみます。