こんにちは。NoMaYです。ウェブで調べ物をしていたら、ルネサスさんからRXマイコンの低価格ボードが出たことを知りました。でも、サンプルプログラムがe2 studioプロジェクト版しか無いようなのでCS+プロジェクトに変換して後で投稿してみようと思います。(もっとも、ボードが無くて動作確認は出来ないので、MOTファイルが同一になるようにしてみるところまでですが、、、) 30米ドル程らしいので3千円ちょっとぐらいかな。拡充を続ける32ビットマイコン「RXファミリ」を容易に導入できるターゲットボードを発売~家電製品、ビル用および産業用オートメーション機器向けなどに、「RX65N」「RX130」「RX231」用を用意。組み込み開発のスタートを支援~www.renesas.com/ja-jp/.../news20180219.htmlTarget Board for RX family 製品ページwww.renesas.com/ja-jp/.../rx-family-target-board.html
こんにちは。NoMaYです。#前の投稿の続きですRXスマートコンフィグレータの設定は、以下の画面コピーの通り、[コード生成設定]→[生成条件]をデフォルトの[コンポーネントが存在する場合は何もしない]にしてコード生成して下さい。理由は、ワーニングを解消する為にr_bsp_config.hに記述した以下のコードが消失しないようにする為です。(別スレッドでのRXスマートコンフィグレータ生成コード不具合に対処するコードとは別ものです。)CC-RX RX65N/RX231 r_bsp_config.h
/* Workaround for compiler warnings when warning level is set to high */#define BSP_MCU_CPU_VERSION (2)
GNURX RX65N/RX231 r_bsp_config.h
/* Workaround for compiler warnings when warning level is set to high */#define BSP_MCU_CPU_VERSION (2)/* Workaround for compiler warnings when warning level is set to high */void excep_supervisor_inst_isr(void) __attribute__ ((interrupt));void excep_access_isr(void) __attribute__ ((interrupt));void excep_undefined_inst_isr(void) __attribute__ ((interrupt));void excep_floating_point_isr(void) __attribute__ ((interrupt));void non_maskable_isr(void) __attribute__ ((interrupt));/* Workaround for compiler warnings when warning level is set to high */void r_undefined_exception(void);/*uint32_t*/ unsigned long get_iclk_freq_hz(void);/*uint32_t*/ unsigned long charget(void);void charput(/*uint32_t*/ unsigned long output_char);
GNURX RX130 r_bsp_config.h
/* Workaround for compiler warnings when warning level is set to high */void excep_supervisor_inst_isr(void) __attribute__ ((interrupt));void excep_access_isr(void) __attribute__ ((interrupt));void excep_undefined_inst_isr(void) __attribute__ ((interrupt));void excep_floating_point_isr(void) __attribute__ ((interrupt));void non_maskable_isr(void) __attribute__ ((interrupt));/* Workaround for compiler warnings when warning level is set to high */void r_undefined_exception(void);/*uint32_t*/ unsigned long get_iclk_freq_hz(void);/*uint32_t*/ unsigned long charget(void);void charput(/*uint32_t*/ unsigned long output_char);
なお、ワーニング解消コードとしては他にも以下のコードを記述していますが、Start user code ~ End user codeの区間に記述していますので、これらに関してはRXスマートコンフィグレータの設定が[既存のコンポーネントに上書きする]になっていても消失しません。CC-RX/GNURX RX65N/RX231/RX130 r_cg_macrodriver.h
/* Start user code for function. Do not edit comment generated here */...略.../* Workaround for compiler warnings when warning level is set to high */void R_CGC_Create_UserInit(void);/* End user code. Do not edit comment generated here */
CC-RX/GNURX RX65N/RX231/RX130 Pin.c
/* Start user code for include. Do not edit comment generated here */#include "Pin.h"/* End user code. Do not edit comment generated here */
ちなみに、R_CGC_Create_UserInit関数に関しては、一応、以下の宣言があることにはあるのですが、CC-RXもGNURXも、ワーニングレベルを上げると、この宣言自体でワーニングが出てしまいます。CC-RX/GNURX RX65N/RX231/RX130 r_smc_cgc.h
void R_CGC_Create_UserInit();
CC-RXの場合
M0523076: Function declarations should have prototype
GNURXの場合
function declaration isn't a prototype [-Wstrict-prototypes]
また、GNURXの場合は、int32_t/uint32_tの定義に以下の細工をしました。(またも愚策か?) 理由は、別スレッドでGNURXでsprintf/snprintfのフォーマット文字列ワーニングがint32_t/uint32_tで出た為です。(今回のプロジェクトではsprintf/snprintfを使っていませんが。) 例えば、%dをこれらの型の変数に適用するとフォーマット文字列ワーニングが出るのですが、適用するフォーマット文字列が%ldならばワーニングは出ない、というものでした。CC-RXの場合は、(そもそもそういうチェックをしていないので)%dでワーニングが出ることは無く、(ソース共有化の為にGNURXに合わせようとして)%ldとすることにはどうも違和感があります。そこで以下の細工をしてみました。(ただし、もともと%ldにしてあるソースですと、逆に、これがフォーマット文字列ワーニングを誘発してしまいますが、、、)GNURX(/CC-RX) RX65N/RX231/RX130 RenesasRX.h/StdAfx.h
#if defined(__GNUC__)/* A workaround for unexpected warnings because -Wformat option treats int32_t/uint32_t * not as signed int/unsigned int but as signed long/unsigned long. */#ifdef __INT32_TYPE__#undef __INT32_TYPE__#define __INT32_TYPE__ signed int#endif#ifdef __UINT32_TYPE__#undef __UINT32_TYPE__#define __UINT32_TYPE__ unsigned int#endif#endif
あと、GNURXの場合は、リンカスクリプトでスタックサイズを以下のように増やしています。理由は、別スレッドでGNURXでsprintf/snprintfを使うとスタックサイズがギリギリなことに気付いた為です。(今回のプロジェクトではsprintf/snprintfを使っていませんが。) スタックサイズはCC-RXの場合のスタックサイズに合わせました。以前の版 GNURX RX65N/RX231/RX130 linker_script.ld
} > ROM .ustack 0x200: AT(0x200) { _ustack = .; } > RAM .istack 0x100: AT(0x100) { _istack = .; } > RAM .data 0x204: AT(_mdata) {
今回の版 GNURX RX65N/RX231/RX130 linker_script.ld
} > ROM .ustack 0x4: AT(0x4) { . += 0x1000; _ustack = .; } > RAM .istack 0x1004: AT(0x1004) { . += 0x400; _istack = .; } > RAM .data 0x1404: AT(_mdata) {
そして、以前に投稿したプロジェクトは、BSPモジュールのヘッダファイルの事情でマクロ定義で無理矢理なこと(そもそもC++ソースでありながら__STDC__を定義すること(且つ値を199901Lとすること))をやっていたのが裏目に出てしまい(これは愚策でした)、GNURXの場合にstdio.h等をインクルードするとstdio.h等の中の__strict(C99予約語)がC++ソースでコンパイルエラーを誘発してしまいますが、今回投稿したプロジェクトでは、BSPモジュールのr_typedefs.hというヘッダファイルの代替版を作って使うようにしました。(CC-RXの場合も同じやり方に合わせました。) r_typedefs.hは、C99モード以前のCの場合にBSPモジュールでインクルードされますが、本来BSPモジュール(とRXスマートコンフィグレータ)で想定されていないC++モードでもインクルードされます。ですが、その中にC++モードでは都合の悪い記述が含まれていますので、それらの記述をC++モードでは除外するようなやり方(以下の青文字箇所)にしました。オリジナル版 GNURX/CC-RX RX65N/RX231/RX130 r_typedefs.h
/******************************************************************************Macro definitions******************************************************************************/#define bool _Bool#define false 0#define true 1/******************************************************************************Typedef definitions******************************************************************************/typedef signed char int8_t;typedef unsigned char uint8_t;typedef signed short int16_t;typedef unsigned short uint16_t;typedef signed long int32_t;typedef unsigned long uint32_t;typedef signed long long int64_t;typedef unsigned long long uint64_t;
代替版 GNURX/CC-RX RX65N/RX231/RX130 r_typedefs.h
#ifndef R_TYPEDEFS_H#define R_TYPEDEFS_H #if defined(__CCRX__)#ifndef __cplusplus#define bool _Bool#define false 0#define true 1#define NULL 0#endiftypedef signed char int8_t;typedef unsigned char uint8_t;typedef signed short int16_t;typedef unsigned short uint16_t;typedef signed long int32_t;typedef unsigned long uint32_t;typedef signed long long int64_t;typedef unsigned long long uint64_t;#ifndef __cplusplustypedef unsigned int _Bool;#endiftypedef unsigned long size_t;#elif defined(__GNUC__)#include <stdint.h>#ifndef __cplusplus#include <stdbool.h>#endif#include <stddef.h>#endif#endif