前置き
(初めての質問なので過不足があったらご容赦ください)
C言語で組み込み開発(モータ系)を行っています
組み込み業界に移ってからまだ1ヶ月ほどで業界の標準がまだ分かっていない状況です
プロジェクトのコードを見ると関数間の値の受け渡しを殆どすべてグローバル変数に格納しています(引数、戻り値がvoid)
また、一つの関数内でしか使用しない変数も前回値を保存するためにグローバルです
上長に「グローバル変数を引数や戻り値、関数内staticを使うようにしないのか」と聞いたところ回答に対して一理あるな、と思う反面、腑に落ちない点も残ったため他の方(他社さん)はどのように扱っているのかをお聞きしたく質問させていただきました
一応私は「グローバル変数絶対に許さないマン」ではなく
・異なる割り込み間で値をやり取りする為にグローバル変数が必要となる
・変数のメモリへの配置を予め決められるため(?)必要なこともある
という認識です
グローバル変数に対する上長の弁
(実機テストや客先など)現地で不具合が発生したとき、直ぐに値を確認できる。ローカル変数だと確認できない
ROMには余裕があるからグローバルでいい
デバッグ用にソフトを作成、書き換えをしなくてもよい、という点に関しては一理あるなと思うのですが、これば組み込み業界で一般的な考えなのでしょうか?
個人的には
不具合が出る前提で話をする点に違和感を覚えました
また、グローバルであることで、意図しない所で書き換えられる、単体テストができなくなる、リファクタリングができなくなる、などデメリットの方が圧倒的に大きい気がします(まぁ、単体テストもリファクタリングもしていないらしいのである意味問題ではないのかもしれませんが……)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
何の理由もなくやたらめったらにグローバル変数にしている! みたいな残念な形の話なのではなくて,
ちゃんと然るべき理由があってのことでしょうから,(「一般的」かどうかは私にはわかりませんが)一つの形であろうと思います.
プロジェクトのコードを見ると関数間の値の受け渡しを殆どすべてグローバル変数に…
とのことから,
「殆ど」,すなわち 全てではない のでしょうし.
そのような形にしておくべきもの と しなくてよいもの の切り分けはちゃんと存在するのだと想像します.
実際にそのようなコードを自身では書いたことはありませんが,
そういう雰囲気のファームが入ってるブツを相手にしたことはあります.
外部から特定の手段を用いて値をReadできるだけでなく,Writeして挙動をみたりもできるわけで,ブツの性質次第では必要(というか大変に重要)なことに思えましたよ.
そのような形態とすることの理由(意義)をあなたが把握/納得できるまで,しっかりと尋ねてみると良いのではないでしょうか.
投稿2021/09/22 01:28
総合スコア11931
0
それはそのプロジェクトの規約、とかそのひとの考え方次第、のはなしかと。
あなたがそこらへんを決定できる立場にあるなら、あなたが決めていけばいいかと思います。
まあたしかに、グローバルにしとけばデバッガでいつでもその値を確認できるってので一理はありますが、それを理由に何でもかんでもグローバルにするってのは話が違うかと思います(これも私の考え方、ですが)
まあ、組み込み用途ではスタックサイズはあまり大きくしないので、サイズの大きなローカル変数は使えないという事情はありますが。
投稿2021/09/21 22:08
総合スコア87981
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
コードを書く際に保守性、安全性などを考慮する必要があります。
長期間にわたって複数人で開発する際に全部グローバル変数だと大量のファイル、コードを逐一確認する必要が出てきてやってられません。
非常に簡易なプログラムを自分一人で作成する場合は全てグローバル変数でも問題は生じないと思います。ただ多少経験を積めば意識しなくとも自然とスコープを意識してローカル変数を使うようになるとは思いますが。
なんか低評価ついちゃったんで追記
グローバル変数だらけだとデメリットの方が多そうとのことですが、一般的にはその通りです。一般的というのはコード量や開発体制が企業案件向けのようなものであればという意味です。少なくとも業界標準でこう書くべきというのはなく、書籍のリーダブルコードにある内容を一般論として念頭に置き、プロジェクト毎にリソースを考慮してルールを決めるものだと思います。
不具合が出る前提で話すのは違和感ありませんが、不具合が出る前提なら尚更グローバル変数は減らす方がメリットがあります。
グローバル変数だらけの方がデバッグがしやすいというのは聞いたことありませんね、仮にそうなら組み込みに関わらずみんなグローバル変数をもっと推奨するのではないでしょうか。
組み込みならではの話でいうと容量を考慮する必要がありますが、近年は容量より保守性や可読性が重視されているように感じます、その方がトータルコストが安くなるからです。ということで、追記前の内容と同じ結論になってしまいますが、小規模な個人開発案件でもない限りは極力グローバル変数を減らす方向とするのが良いはずです。業界標準はないのであくまで個人の感想です。
投稿2021/09/23 04:26
編集2021/09/23 05:19総合スコア1085
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/23 04:58
2021/09/23 05:30
2021/09/23 05:43
2021/09/23 06:31
2021/09/23 08:16 編集
2021/09/25 08:19
0
個々の要素の重みはそれぞれのケースで変わってくるでしょうから、個々の判断と言ってしまえばそうなってしまうでしょうね。
ぼちぼちとかいつまんで。
デバッグ用にソフトを作成、書き換えをしなくてもよい、という点に関しては一理あるなと思う
一理はありますけれど、そういうコンセプトを貫いたプログラムはあまり見たことがありません。少数派ではあるのでしょうね。
不具合が出る前提で話をする点に違和感を覚えました
これだけは「完璧なプログラムなんてあり得ない」という考えで挑まないと仕方ないとは思いますけれど。
意図しない所で書き換えられる
これは「管理しきれるか」という問題なので、大抵に於いて規模が小さめの組み込みプログラムでは重み付けが下がるように思います。
リファクタリングは...あまりやらない気がします。
いまでこそFlashメモリを積んだマイコンが普通になりましたけど、ちょっと前まではマイコンなんてマスクやOneTimePromが普通で一度書いたら固定されてしまうので、そもそもリファクタリングの機会がない、というところがありました。また、リファクタリングの際にはテストで以前との等価性を保証することになるのでしょうけれど、ハード部分の抽象化が難しく完全なテストがしにくいというところもあるのではないでしょうか。
メモリ消費については、グローバルのほうがRAM消費が増える可能性もある(ローカル変数はテンポラリなので平均化できればピークの使用量は減るかもしれない)かと思いますが、最大使用量の管理がやりやすいというのは厳しい環境では有用なことでもあるでしょう。
ROMには余裕があるからグローバルでいい
グローバル変数の方がROM容量を喰う、という有意な差があるかしら?
関数内staticを使うようにしないのか
これは組織の文化かなぁ? 変数のスコープ以外はグローバルと変わらないですからね。
投稿2021/09/21 23:19
総合スコア7690
0
組み込み系でもソフト系と電気系のプログラマに分かれます。
ソフト系は基本的にグローバル変数を使うメリットよりデメリットが多いですが、電気系の人は良く使います。
これは昔からトラ技(トランジスタ技術)のソースコードがグローバル変数を多用していた経緯があると思ってます。
恐らくですが参照渡しでさえ関数に引数を渡すとメモリの使用量が増えるのを嫌っての事じゃないかと。
投稿2021/09/24 08:48
総合スコア4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/24 21:48
2021/09/25 00:45
2021/09/27 10:23
0
組込み開発との事ですが、どの程度の規模でしょうか?
多分、規模によって回答が異なるでしょう。組み込み用OS(Linux, Windows, etc.)を使って、メモリもいっぱいあるところとか、、。
C言語で組み込み開発(モータ系)を行っています
との事なので、小規模でしょうか? Flash 16KB, Ram 16KBとか...? もっと小さい?
このような前提だと、、(今、そんなところでやってる) グローバル変数、使いますね。
現地で不具合が発生したとき、直ぐに値を確認できる。
これはやり方次第。もっとも今、使ってるデバッガ、まともにローカル変数表示してくれない。最適化の影響もあるみたいですが、アセンブラ追って、レジスタ参照。これがヤダとグローバルにするでしょう。
ROMには余裕があるからグローバルでいい
RAMの間違い? でしょうか。それもありですね。迂闊にスタックオーバーするより、RAMにマッピング。
不具合が出る前提で話をする
これは組み込みでなくても当然だと思うのですが、別のところだと非常にいやな顔された。
組込みの場合、ハードウェアが歴史が長く、不具合無しが理想でも現実にあり得ない事が分かっている人が多いのではないかと思います。
グローバルであることで、意図しない所で書き換えられる
ある程度までは静的に検査可能では?
なお、
他の方(他社さん)はどのように扱っているのかをお聞きしたく
余り具体的には書けないです。機密とまではいかなくても、うっかりもあるので。(逆に簡単に書く人は...)
以下、個人的感覚ですが、
組み込み系は、ハードがまずあって、おまけ的にソフト開発される事が多いようです。(特に小規模)
そのため、ハード屋さんが片手間、、も多い感じ。ソフト専門の人からすると、なんでこんなの、、というコードが多いと思います。また、組み込み系特有の処理(特定の順番でポートアクセスとか)からの制約とかで、不適切と思われるコードになる事もあるようです。(不必要に多量の volatile, static 等)
あと、今使ってるツール、初期化部分を自動生成してくれるのですが、個人的には ?のコードです。これを参考にしたら、グローバル使いまくり。もっともTimer/IOマップとかをGUIで生成できるので止められない、、と言ったところ。
投稿2021/09/23 08:41
総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/23 08:55
0
業務としてソフトウェアを開発する場合、業務の必要性を無視して教条主義的に原則論に凝り固まるのはやめましょう。
ご質問の文を読む限り、まだ明確な質問ができない方のように思えます。
組み込み開発(モータ系)といえば開発内容が伝わるものではありません。
製品のライフサイクル全体で100万セット出荷されるモーターと、カタログ販売をして年産100個のモーターと、注文生産で年あたり十数台出荷するモーターで話は全く違ってきます。
ソースコードが1Mなのか10Kなのか数百なのかでも違ってきます。
他の方も書いていらっしゃいますが、「不具合が出る前提で話をする点に違和感を覚えました」というのも勉強不足の感が否めません。あと一年組込みソフトを開発して同じように考えているのなら、そうそうにソフト開発以外の仕事に転職することをお勧めします。
仕事としてのソフトは、設計20%、主たるロジック10%、異常時処理20%、テスト20%、出荷後不具合対応30%ぐらいの工数配分のものも多数あります。特に、年間十数台のシステムでは不具合対応に必要な工数の比率は高くなります。
仕事の内容が明確に書かれていないので,確実なことはいえませんが、年あたり十数台の出荷でソースが1K以下なら、私でもあなたの上長と同じ判断を下すかもしれません。
投稿2021/09/22 03:51
総合スコア24666
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
グローバルを使用した方が良いかどうかの回答ではありません。
個人的には不具合が出る前提で話をする点に違和感を覚えました
あなたが、違和感を感じるのは、「(実機テストや客先など)現地で不具合が発生したとき」のインパクトを上長と同じように受け止められている訳ではないので、仕方ないでしょう。
不具合は発生するものとして考えるべきです。
グローバルであることで、意図しない所で書き換えられる、単体テストができなくなる、リファクタリングができなくなる、などデメリットの方が圧倒的に大きい気がします
発生率は押さえるようにするべきなのですが、その対応コストが見合うかどうかの判断も当然あります。
その疑問を上長にぶつける事で、ここでの曖昧な回答より現実に即した回答が得られると思います。
投稿2021/09/22 00:26
編集2021/09/22 07:36総合スコア25281
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/22 01:43
2021/09/22 02:08 編集
2021/09/25 00:38
2021/09/25 00:57
2021/09/25 00:59
2021/09/25 01:29