CS+ のコード生成ツールが生成する R_UART0_Send() について要望

ターゲットを RL78/G10、ツールは

CS+ for CC V5.00.00  [05 Dec 2016]

製品情報

バージョン情報
統合開発環境 フレームワーク V7.00.00.05 [25 Nov 2016] 統合開発環境のメイン・ウインドウ部です。
デバッグ・ツール共通インタフェース V5.00.00.01 [27 Oct 2016] デバッグ・ツールを利用するための共通のインタフェースを統合したライブラリです。
デバイス情報共通インタフェース V7.00.00.05 [25 Nov 2016] デバイス固有情報を取得するための共通ライブラリです。
RH850ビルド・ツールCC-RH用プラグイン V1.07.00.00 [01 Nov 2016] RH850用CC-RHコンパイラを利用するためのビルド・ツール・プラグインです。
RL78ビルド・ツールCC-RL用プラグイン V1.04.00.00 [01 Nov 2016] RL78用CC-RLコンパイラを利用するためのビルド・ツール・プラグインです。
CC-RL V1.04.00 ビルド・ツールです。
  BuildToolCCRLCore V1.06.00.02 [17 Nov 2016]
RXビルド・ツールCC-RX用プラグイン V5.00.00.00 [01 Nov 2016] RX用CC-RXコンパイラを利用するためのビルド・ツール・プラグインです。
RH850ビルド・ツールGHS CCRH850用プラグイン V1.01.00.01 [11 Nov 2016] RH850用GHS CCRH850コンパイラを利用するためのビルド・ツール・プラグインです。
デバッガ・コレクション・プラグイン V5.00.00.02 [02 Nov 2016] RH850, RX, RL78 エミュレータ/シミュレータを利用するためのデバッグ・ツール・プラグインです。
  Device V5.00.00.02 [02 Nov 2016]
  DeviceRl78 V5.00.00.01 [27 Oct 2016]
  ConfigurationRl78Simulator V5.00.00.01 [27 Oct 2016]
  EngineManager V5.00.00.04 [25 Nov 2016]
  EngineManagerExec V5.00.00.05 [01 Dec 2016]
  RL78 Asm/Disasm V5.00.00.01 [27 Oct 2016]
  DBEvaluatorManager V5.00.00.01 [27 Oct 2016]
  LoadModuleManager V5.00.00.01 [27 Oct 2016]
RH850用コード生成 V1.00.00.04 [23 Aug 2016] デバイスドライバを自動生成および端子配置を表示するプラグインです。(RH850用)
コード生成プラグイン V3.05.00.01 [11 Nov 2016] デバイスドライバを自動生成するプラグインです。(V850, 78K0, 78K0R, RL78/G12, G13, G14, G1A, I1A, L12, F12, F13, F14用)
コード生成/端子図プラグイン V1.07.00.02 [23 Nov 2016] デバイスドライバを自動生成および端子配置を表示するプラグインです。(RX, コー ド生成プラグインに記載のないRL78用)
RL78/G10コードライブラリ V1.04.04.01 [11 Nov 2016] RL78/G10コード生成プラグインのためのコードライブラリです。
デバッグ・コンソール・プラグイン V3.00.00.13 [01 Aug 2014] 標準I/Oをサポートするデバッグ・コンソール・プラグインです。
Quick and Effective tool solution - QE V1.02.00.02 [01 Nov 2016] アプリケーション開発に便利なツールをセットにしたプラグインです。
端子配置プラグイン V1.54.01.01 [31 Jul 2014] デバイスの端子配置を行うプラグインです。
プログラム解析プラグイン V4.07.00.03 [21 Nov 2016] プログラムの解析を行うプラグインです。
IronPythonコンソール・プラグイン V1.32.00.01 [11 Nov 2016] IronPythonのコマンドとCS+拡張機能が使用できるコンソールです。
エディタ・パネル V1.10.00.01 [30 Jun 2016] エディタ・パネルのプラグインです。
スタック見積もりR_UART0_Sendツール V1.05.00.02 [30 Jul 2014] スタック使用量をツリー形式で表示するツールです。
アップデート・マネージャ・プラグイン V2.02.00.05 [17 Jul 2014] CS+ アップデート・マネージャと連携するプラグインです。

を試用ライセンスで使用しています。

CS+ のコード生成ツールが生成する、UART0 へ送信するデータを登録する関数 R_UART0_Send() の r_cg_sau.h の中での関数プロトタイプ宣言が

MD_STATUS R_UART0_Send(uint8_t * const tx_buf, uint16_t tx_num);

となっており、引数の tx_buf の指し示すバイト列の型が uint8_t であるため、ミラー領域を通じてアクセスできる ROM 上の定数データを送信しようとした場合

void hoge(void)
{
    static const uint8_t hoge[] = {'H', 'O', 'G', 'E'};
    R_UART0_Send(hoge, sizeof(hoge));
}

以下のような警告が出力されてしまいます。

hoge.c(123):W0520167:"const uint8_t __near *" 型の引数は型 "uint8_t *const __near" の引数と整合しません。

これを避けるためには以下のように

void hoge(void)
{
    static const uint8_t hoge[] = {'H', 'O', 'G', 'E'};
    R_UART0_Send((uint8_t*)hoge, sizeof(hoge));
}

const uint8_t へのアドレスを uint8_t* へキャストするという、C++ で言うところの const_cast をする羽目となってしまいます。

R_UART0_Send() の実装を見る限りこの関数の引数の仕様は

MD_STATUS R_UART0_Send(const uint8_t * const tx_buf, uint16_t tx_num);

で良い筈であり、機能的にも問題ない筈です。無用な警告やキャストを避けるために以上の点は修正していただきたいです。

  • fujita様
    コード生成の鈴木です。
    すみません、検討させてください。呼び元でなく、内部関数でワーニングが発生するので、書き方を検討中です。
  • 自分の文字列を出力するプログラムで、同じような問題を抱えていました。
     const char*  と char* が一致しないと言う警告です。
     固定文字列がROMに書いてある事もあるし、編集して使う文字列がRAMに書いてある事もあるからキャストで逃げるしか無いと思ってました。

     この書き込みを見て char*  を const char*  で受けるのなら問題無いのかなと思い実験したら、上手く行きました。
     const が不要な変数でも const を付けておけば間違えて書き込むようなプログラムを書いたときにコンパイラが警告してくれると言う記事が有りました。
     安全策じゃなくて、こういう例の防止のためには極力付けるようにしないとまずいですね。