組み込みプログラミングでの安全配慮について

このQ&Aのポイント
  • 組み込みプログラミングでの安全配慮について学びましょう。
  • C言語を使用した組み込みプログラミングで注目すべき安全配慮について紹介します。
  • 組み込みプログラミングにおける安全配慮のポイントを理解して、マイコン開発に生かしましょう。
回答を見る
  • ベストアンサー

組み込みプログラミングにおける安全配慮について

組み込みプログラミングにおける安全配慮について はじめまして。 当方、組み込みプログラミングを始めて2ヶ月ほど経ちました。 プログラミング言語はC言語で、使用しているマイコンはH8SX/1655です。 マイコンは、外部入力された文字データを解釈して、ディスプレイに入力 された文字を表示するような用途で使っております。 そこで、漠然とした質問で大変申し訳ございませんが、 コーディングにあたり、安全配慮として心掛けていること等ございましたら 簡単でいいですので教えていただけないでしょうか。 マイコンの用途に関わらず、幅広いノウハウを勉強させていただけたらと存じます。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

マイコンに関わらずとあるので、組み込みにおける実装での注意すべき点やノウハウなど を書きたいと思います。 私の経験から言うと、一番注意すべき点はやはり何と言っても、スタックオーバーフロー です。スタックオーバーフローを起こさないためにも、プロセス(スレッド)がどれくらい のスタックを使っているかを、可能であれば普段から把握しておく必要があります。 組み込みは他の環境と違ってメモリ容量が制限されるため、スタックオーバーフローを 起こしやすいです。また、プログラムのどのパスが一番深い(スタックを一番使う)かを 把握する必要があります。再帰やalloca()などを積極的に使うとスタックオーバーフロー しやすいので注意が必要です。 あとは定番ですが、バッファーオーバーランというとても有名な脆弱性を含まないプログラ ミングを普段から心掛けたほうが良いです(これはべつに組み込み系に限ったことではない ですが)。 例えば、sprintf()などで編集した文字列は、完成後の文字列の長さを正確に予測すること はほぼ不可能なので、snprinf()で事前に完成後の文字列の長さを調べるようにしたほうが 良いです。

kiroro33
質問者

お礼

ご回答ありがとうございます。 スタックオーバーフローは、それほど意識をしたことがなかったので これからはしっかり意識できるように勉強します。 #今回初めての組み込みプログラムであったこともあり、型宣言や #メモリ容量に気を使ったぐらいでした。。。 バッファオーバーランには、馴染みがあります。 gets関数を学んだころに初めてお目にかかり、対策方法を勉強しました。

その他の回答 (2)

  • R32C
  • ベストアンサー率39% (115/290)
回答No.3

組込みシステムの安全性については、結構深い話ですね。 プログラマとしてプログラミング上の配慮以外にもシステム的なことを キーワードだけでも知識として持っているといいと思います。 1.機能安全 自動車関連で盛んなようです。機械の故障時でも安全側に動作するように するような設計方法ですね。 検索すれば結構ヒットすると思います。 以前、半導体製造装置でも機能安全仕様にしていたことがあります。 内部の作りこみじゃなくて、ユーザーインターフェースが主体でしたが。 機能安全対応のRTOSというのもあります。 2.POSTなど 上記機能安全の1つかもしれませんが、スポットで開発するもののハードウエアの 自己診断とかやっていますか? それなりのコストになるかもしれませんが、開発要件や要求事項になくとも、 やらないならやらないと仕様に明記したうえで実装しないという判断をしたほうが いいですよね。 #やっていないことを前提に書いていますが、やっているならスルーしてください。

kiroro33
質問者

お礼

ご回答ありがとうございます。 >プログラマとしてプログラミング上の配慮以外にもシステム的なことを >キーワードだけでも知識として持っているといいと思います。 仰るとおりだと思います。 浅くても良いので広く知識をもつことは重要だと思っております。 #もちろん専門的な部分は深く持っておかなければならないと思いますが、 #これがなかなか掘り下げていくのが大変に感じてます。 >機能安全 検索してみました。 機能による安全と機能の安全に分類されているようでした。 故障時にいかに安全を維持するかにかなり神経を使いそうですね。 >POST Power On Self Testのことですね。 恥ずかしながら、ハードウェアの故障チェックは意識しておりませんでした。 知識として持たせていただきます。

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.1

>コーディングにあたり、安全配慮として心掛けていること等ございましたら 基本的には、PC用のアプリケーションと大差ない。 メモリリークやループリミッタなど。 コーディングというより、それ以外が重要。 「設計」(検討)でH/W特性を理解すること。 H/W制御は、1ビットの間違いで接続しているH/Wを壊したり過電流を流して焼損などPCアプリなら「再起動すればいい」という安易な考えが通用しない。 デバッグでも「結果だけ」で「動かない」、「適当にソースに手を入れたら動いている(様に見える)」では駄目。 通信ならプロトコルアナライザー、ポート制御ならロジックアナライザーやオシロスコープで原因特定するレベルでやらないといけない。 それと、重要なことだけど、大抵は基盤に部品むき出しのまま使用することになるだろうから、 静電気対策や、部品への不要な接触をしない、電源投入前に基盤にゴミがないかといった確認は必要。

kiroro33
質問者

お礼

ご回答ありがとうございます。 ループリミッタとは、意図しない無限ループに陥ることを想定して あらかじめループに制限を掛けておくという理解でよろしいでしょうか。 また、コーディング以外が重要という点については、 仰るとおりだと思います。

関連するQ&A

  • オープン系とか、組込み系とかって何?

    よく、ソフトウェア開発の世界では、「オープン系」とか、「組込み系」、「汎用系」などと言う分野がありますよね。 これってそれぞれどう違い、どのような特徴があるのでしょうか。 また、上記以外のもので他にも「~系」ってあるのでしょうか。あればそれについても概要が知りたいのです。 「アプリ系」などというのもありますか。市販の、例えばグラフィック関連のソフトとか、ゲーム・ソフトや、会計ソフトなどはこう呼ぶのでしょうか。 また、Webプログラミングはどの分野の系統に属するのでしょうか。 ただ、「組込み系」だけは、多少わかりました。例えば電化製品などに内蔵されているマイコンを制御するプログラムを開発するのですよね。国内でも、この分野の技術者が不足しているということも知りました。 自分のイメージですが、この組込み系というのは、いわゆる市販のパソコン・ソフトを開発する分野と比べると、出力する画面のデザインなどの見た目については、あまりこだわらず、制御にいそしむ、ある意味、地味な領域なのかなという気もしました。 それに、結構、マイコンに関するハードの知識も必要とされるのですよね。 私は、ソフト開発のみというよりも結構、電子基盤の操作などに魅力を感じるので、組込みの仕事もしてみたいなとも思うですが、実は、これからVisualBasic.NETを学習しようかと思っています。 これはまったく、的外れな努力でしょうかね。やっぱり、組込みはC言語で無ければならないのでしょうか。 反対に、VisualBasic.NETを生かす道としてはどのような分野が考えられますか。Webやデータベース、サーバサイドのプログラミングなどでしょうか。 ASP.NETなどもありますしね。 どなたか貴重な解説・御意見を頂けましたら、よろしくお願い致します。

  • C言語で制御できる教育向けキット

    この度、専門学校に頼まれて、ちょっとしたC言語による組み込みプログラミングの 講義をすることになりました。 座学では退屈するのは明白ですので、何らかのマイコンボードのようなHWキット (たとえば、7セグを制御するとか音を鳴らすとか、ロボットのようなものを制御するとか)を 使って、それをC言語でプログラミングして制御するような実習を組み込みたいと 考えています。 このような用途で使えるマイコンボードや学習キットの情報を教えていただけないで しょうか。 秋月通商をざっと見たのですが、なかなか見つけることができませんでした。 ●要件 価格はあまり高価ではない。 C言語でプログラミングして、ハードウェアを制御する 型番とか情報がありましたしたら是非おしえてください。

  • 組み込みマイコンでのソフトウェアによるリセット

    組み込み用マイコン向けのファームウェアをC言語で 書いています. ここで, ソフトウェア側からマイコンにリセットをかけ るにはどのような方法があるでしょうか? ※マイコン自体には内部的なハードウェアリセットを行 う機能は無いものとします. 素人考えで思いつく限りだと: ・リセットを行う場所の関数からmainまですべて戻る 経路を作っておく. main (または, mainを呼び出すスタートアップルーチ ンの部分)をループにしておき, その始めで内蔵周辺 機能のレジスタやstatic領域のメモリをすべて初期化 するようなコードを ひたすらハードコーディングしておく. (※static領域のメモリ初期化はどのみち行うからよ いとして, 内蔵周辺機能のレジスタをひたすら初期化 するのが面倒に思われます) ・ウォッチドッグタイマ機能があれば, わざとカウン タをオーバーフローさせてハードウェアリセットをか ける. ・外部リセット端子に何らかの形で出力ポートを 接続しておいて, 自分でハードウェアリセットをかける. 上記のものでもやればそれなりに動作しそうな気は しますが, どういう方法が一般的なのか知らないため どうしてよいか悩んでいます. どのようにリセットを行うのがスマートであるか ご教示いただけませんでしょうか?

  • マイコンからSDカード内のテキストを読み込みたい

    H8SX/1655を使って、SDカードに記憶されたテキストファイルの内容を 読み込み、LCDディスプレイに出力するC言語プログラムを考案中です が、肝心のSDカードからの読み込み方について分からなくなっています。 そこで、SDカードからテキストファイルを読み込むノウハウまたは、 参考書籍等を教えていただけないでしょうか。 参考書籍については、CQ出版の「フラッシュ・メモリ・カードの徹底研究」 が適当なのかなぁと思っておりますがいかがでしょうか。 私の情報としては、 ・組み込み経験はありませんが趣味として勉強中です。  (CQ出版の「今すぐ使える!H8マイコン基板」で勉強中です。) ・C言語については基礎的な部分は理解できていると思います。 どうぞよろしくお願いいたします。

  • H8マイコンによる組み込みプログラミング入門

    この分野の初心者です.マシン語,アセンブラ,CPUの仕組みは理解できていますが,CPUと周辺との入出力,デバッグ環境等はまったく自信なしです. H8マイコンを使って,組み込みプログラミングを学習したいと思います.秋月から出ている,AKI-H8~ が手頃なようですが,どれを購入したら良いのかよくわかりません.ゆくゆくは,自分で回路なんぞ組み立ててH8から制御してみたいのですが,現時点では,LCDへの表示やLEDの点灯等の簡単なものを行いたいのです.C言語はできるので,開発環境一式そろったものが良いのです. AKI-H8/3052F USB開発キット(フルセット) AKI-H8/3052F開発セット(H8マザーボードセット) AKI-H8/3048開発キット(即使えるキット) など,8000円台前後でいろいろあるようですが (1)組み立ては難しいですか? (2)パソコンと接続するのに,他に何か必要なのですか? (3) ROMに焼けるのですか?(何回も) (4)最初に述べた目的を達成するには,何を購入すれば良いですか.

  • プログラミングを始めたのですが…

    最近C言語の勉強をはじめました。 と言っても本当にまだprintf関数で文字を表示させたり、といったようなことなのですが… 自分は本を読んでるだけでは覚えられないので、コンパイラで実践しながらやっています。そこで、{}や、""を入力するとき、自分はshiftキーを押しながら入力しているのですがプログラミングをしている人もみなさんこれで入力しているのでしょうか?さすがにこれでは入力が遅れてしまうので何か改善策のようなものがあると思うのですが… あと、プログラミングを生業にしているようなひとは当然ブラインドタッチで入力するのだと思いますが、記号とかのキーはブラインドタッチのホームポジションからは外れた位置にありますよね?それでもブラインドタッチで行えるものなのでしょうか?

  • c言語プログラミングHELP!

    c言語でプログラムを組んでるんですが、どうしてもわからないものがありまして、 まず一つ目がキーボードから英小文字を一つ入力し、その文字を大文字に変換して出力するプログラミングです。結果がまずひとつの英小文字を入力して、入力した文字と、大文字に変換した文字を出力するプログラミングです。 ちなみにヒントは'a'=97,'A'=65です 二つ目が二桁の16進数('41'から'49','50'から'59')を入力すると対応する文字を表示するプログラミングです。また、%xは使用しないこと。なお、入力に間違いはないものとする。(ヒントは入力は一つの数値か、二つの文字か?だそうです。) 結果は二桁の16進数('41'から'49','50'から'59')を入力して、文字コードの二桁の数字と文字を出力するプログラミングです。 お願いします。

  • プログラミングソフトに打ち込むのは何語でしょうか?

    今、プログラミングを勉強中の初心者です。 以前C言語を勉強していました。そのときosはリナックスを使っていましたが、何にC言語を入力していたのか覚えていません。また、Javaを勉強中ですが、実際練習しようとしても何(例えばwordやmemopad)に勉強したJavaを入力したらつかえるのか分かりません。実際仕事で役立つのは、自分が使うパソコンにその言語を対象とするプログラミングソフトが入っていないと意味ないので、役立つのかな?っと思っています。 VBA語はなじみが深くexelVBAで使っています。あと、最近コマンドプロンプトというものがwimndowsに入っていることを知りました。これも文字を打ち込むことでパソコンが動くのでプログラミングソフトといえると思います。でも、memopadと入力しても動くのでいったい何語を対象としているのか疑問に思っています。 ・Java, C,VBAなどそれぞれの言語が使えるプログラミングソフトにはどういうものがあるのか,・コマンドプロンプトは何語を対象としているのか,・2言語以上に対応しているプログラミングソフトがあるのか」という点について教えてください。 ちょっと頭が混乱していて的外れな質問かもしれませんが、アドバイスいただけたらうれしいです。

  • なぜプログラミングは英語なのでしょうか?

    プログラミングはなぜ英語なのでしょうか? 日本語のプログラミングもあるそうですが、用途が限られているみたいです。 英語以外のコンピュータ言語の場合、オブジェクトコードに変換するために数段階の変換-つまり英語に-がなされるので複雑になり、処理速度も遅くなるようです。 コンピュータ言語は英語つまりラテン語・ギリシャ語系列の表音文字が適しているのでしょうか。アセンブリ言語がローマ字、アラビア数字になじみやすいからでしょうか?コンピュータ=白人文化・・・ASCIIが世界標準になっているせいもあると思いますが、まるでコーカソイドの独占ですね。 プログラムのことをよく理解していない上での質問かもしれませんが、教えていただければ助かります。よろしくお願い致します。 【疑問点】 1.コンピュータ言語は、なぜ英語なのでしょうか? 2.ローマ字、アラビア数字は機械語に直すとき、処理しやすいのでしょうか? 3.漢字など表意文字は、コンピュータ言語としてあり得ないのでしょうか?(補足:コンパイルしにくい?)

  • 組込みC開発

    お世話になります。 組込みでARMコアのCPUをチョイスしての仕事を任されました。 開発ツールはKeilというIDEで、C言語でOS使用しないで開発をしています。 C言語はかれこれ2年以上使用しており、文法上の事などはほぼマスター しており、上記のIDEでソースをコンパイルしてコンパイルエラーもなく 60kbytesほどのコードが生成されます。 ただ、このプログラムをターゲットCPUへダウンロードして使うと コードとは異なる動きをするときがあります。 これは、小規模なプログラムでは経験したことの無いことです。 たとえば、思った動きにならないときに、ソースを少しいじっただけで 今度は例外が発生して止まったりします。 割込みは内部タイマー、外部(ボタン等)、UARTなど計4種類を 設定していますが、どうもこのあたりが怪しいと考えています。 たとえばUARTでPCからデータを送って、ボタンを押す、などの アクションを起こすと、データアボートやプリフェッチアボート が発生したりしますので。 ちなみに、割込み処理は、IDEがサンプルソースでつけているものを includeして使っています。 また、CでのプログラムでMISRA-C参考書も購入してチェックして おります。 大規模なプログラミングは今回が初めてなのですが、こうもソース を少しさわっただけで、例外が発生したりする(コード上問題ない と考えています)ので、現状は記述の仕方を変えてみたりして 対応しています。 こうした規模の大きい組込み系でのプログラミングで、注意する点 や、常識的な部分があればお教えいただきたく思います。 よろしくお願いいたします。

専門家に質問してみよう