私はグローバル変数を回避するというこのトピックを長く熱心に調べ、私の検索で他に見たことのない方法を思いついたので、それはおそらくそれを行うのに最適な方法ではないと思います(または、検索を正しく表現していないだけです)。
例として、次のようなものがあります。
int16_t DataProcessing(uint8_t CallType, struct DataStruct *DataIO)
{
int16_t RetVal;
static struct DataStruct StaticDataStuct;
switch (CallType)
{
case FIRSTCASE: RetVal = FirstCaseProcessing(&StaticDataStuct,DataIO); break;
case SECONDCASE: RetVal = SecondCaseProcessing(&StaticDataStuct,DataIO); break;
...
etc
...
}
return RetVal;
}
int16_t FirstCaseProcessing(struct DataStruct *StaticData, struct DataStruct *NewData)
{
// Do what you need to do here
}
呼び出される他のルーチンについても同じ考えです。
また、DataProcessing() を呼び出すためのラッパー関数も作成しました。これにより、全体が読みやすくなり、将来それを使用する新しい人にも役立ちます。たとえば、次のようになります。
int16_t FirstCase(uint8_t Address, uint16_t Data)
{
struct DataStruct NewData;
NewData.Address = Address;
NewData.Data= Data;
return DataProcessing(FIRSTCASE, &NewData);
}
それで、良いと思われるのは、UART やタイマーなどの割り込み以外に、グローバル変数がまったくないことです。(私は今でも、割り込みで何かを呼び出して静的変数にデータを格納するよりも、できるだけ早く割り込みに出入りする方が良いと考えていますが、そうでない場合は喜んで説得します。)
[おそらく]悪いのは、グローバルを避けて読みやすくするために、3つの関数を介して何かを渡していることです(読みやすいと思うのは私だけではないと仮定します!)
私は 72MHz 組み込み 32 ビット プロセッサを与えられて、8 ビット プロセッサで実行できることを実行し、数分の 1 の速度で実行したと言えます (十分な RAM があると仮定して)。したがって、速度は問題ではありませんが、速度がより問題になる可能性がある場合に、これが良いスタイルであるかどうかについての意見に興味があります.
.c ファイルを持ち、その .c ファイル内の任意の関数が参照およびアクセスできる (ただし、外部ファイルはできない) 静的変数を持つ C++ スタイルを見てきました。私が考えるものを使用するには、ファイルに対して「グローバル」な変数です(または、ファイルの見方に応じてファイルに対してローカルです!)。また、静的変数を格納し、その静的変数へのポインターをそれにアクセスしたいものに渡すだけの関数を持つこともできます。それがOTTになるかどうか疑問に思っていますか?
私のアイデアは良い/悪い/ひどいように見えますか?
アドバイスと、おそらく取得する予定のすべての TL;DR に感謝します。;~)