プログラム初心者です。CS+のコードジェネレータを使ったファイルにおいて変数の宣言の仕方(セオリー?一般論?)についてご教授ください
RX231スターターキットのチュートリアルプログラムを変更しています。グローバル変数を宣言しr_cg_main.c、r_cg_cmt_user.cにてその変数を使用したいです。
具体的には、r_cg_cmt_user.cにおいて、cmt0のインタラプト(1msecでコンペアマッチする設定としている)で、g_ms_count、g_sec_countという変数で ミリ秒、秒 をカウントしr_cg_main.cのメインループにて、g_sec_count変数のとある条件で各種作業を行い、その変数が10秒になったらg_ms_count、g_sec_countをクリアし再び10秒カウントに入り上記動作を繰り返したいと思っています。
見よう見まねで色々試行錯誤はしてみたのですが、以下どう考えればよいのかお教えいただければと思います。
質問r_cg_userdefine.h 内でグローバル変数を宣言するのがセオリーですか?左記ヘッダはr_cg_main.c、r_cg_cmt_user.cでインクルードしています。ただ、これを行うと色々エラーが出て、現在行き着いた(エラーが出なくなった)のは、r_cg_userdefine.h にて、extern volatile uint16_t g_sec_count; と宣言r_cg_main.c にて、特に宣言なしr_cg_cmt_user.c にて、volatile uint16_t g_ms_counter; と宣言としています。externは他で定義されているグローバル変数を参照するための識別子となると、r_cg_userdefine.hでグローバル変数の実体は定義されていないように思えます。上記の場合実体の定義はr_cg_cmt_user.cでされているのでしょうか?その場合、r_cg_main.cはなぜ宣言なしでその変数を使えているのでしょうか?
取り留めのない質問となりますが、グローバル変数やローカル変数はどこに配置し、どのようにexternなどで参照すべきがよいかご教授いただければ幸いです。
msatoさん、こんにちは。NoMaYです。可能であれば、以下の2つについて、プロジェクトのファイル一式をzipファイルに固めたものを添付して頂けるとうれしいです。それを実際に見て、状況の確認がしたいです。(1) 以下のエラーが発生していた以前のプロジェクトのファイル一式> r_cg_userdefine.h 内でグローバル変数を宣言するのがセオリーですか?左記ヘッダはr_cg_main.c、r_cg_cmt_user.cでインクルードしています。> ただ、これを行うと色々エラーが出て、(2) 以下の疑問点が生じている現在のプロジェクトのファイル一式> 現在行き着いた(エラーが出なくなった)のは、。。。> externは他で定義されているグローバル変数を参照するための識別子となると、r_cg_userdefine.hでグローバル変数の実体は定義されていないように思えます。> 上記の場合実体の定義はr_cg_cmt_user.cでされているのでしょうか?その場合、r_cg_main.cはなぜ宣言なしでその変数を使えているのでしょうか?
fujita nozomu 様 ご教授、ご解説ありがとうございます。 fujita nozomu 様の解説を元に再度オリジナルのチュートリアルプログラムを見直してみたところ、定義の思想が理解できてきました。 ご教授いただいたセオリーに則り、チュートリアルプログラムの宣言を参照にしつつ、今後のプログラミング進めていきたいと思います。 Moo様 お教えいただいた >#define GLOBAL // "GLOBAL"が消えるのでmain.cでvar1の実体を宣言することになります 等の情報を元にネットなどで調べ、新たな知見を得ることができました。為になる情報ありがとうございました。 ご回答いただいた皆様に感謝し、本件クローズとさせていただきます。
fujita nozomu 様 クローズと言ったのにすみません。再度質問させてください。 >コードジェネレータが生成したソースコードファイル全てに共通して参照させたい情報のみ r_cg_userdefine.h に書くべきですが、通常はそのような情報はないと思うので、r_cg_userdefine.h を改変する機会はそうはないと思います。 と、ご教授いただきましたが、 下記のような、定数を定義したいです。 #define ADC_MES_NUMBER 512 //ADCの計測ポイント数 使用先、目的は、 ・r_cg_s12ad_user.c:この関数内の割込みでADC値を取得(とある配列に取得:g_adc_mes[512])し上記ADC_MES_NUMBERに達したらADCモジュールをストップする。(CMTにて秒カウンタ作り10秒周期でADをあるポイント数取得する感じです。例えば5秒からADをスタート、512ポイント取得したらADをストップ(このfsにはTPUのコンペアマッチを利用)。これを10秒周期で繰返す) ・r_cg_main.c:上記r_cg_s12ad_user.cでADC_MES_NUMBER分のデータが貯まったらその平均(g_adc_mes[512]のデータの総和/ADC_MES_NUMBER)を算出する。 このような場合、『#define ADC_MES_NUMBER 512 //ADCの計測ポイント数』は、r_cg_userdefine.hに記入しても良いのでしょうか?(現在は記入して動作させています)それともr_cg_userdefine.hは極力編集せず、r_cg_main.cやr_cg_s12ad_user.cにて記載したほうが良いのでしょうか? ちなみに参照元としているチュートリアルプログラムのオリジナルファイルでは、r_cg_main.c内に #define xxx を用いた定義がないので、r_cg_userdefine.hに記入するのがよいかと思った次第です。