組込みエンジニアに求められる能力

組込みシステムに関する知識や技術を説明します‼︎

組込みソフトウェアレビュー手法

一年ぶりの投稿です。

お疲れ様でございます。成島です。

 

【議題】

組込みソフトウェアレビュー手法

 

【理由】

 短納期・高品質が求められる組込みシステム開発において、スケジュールを意識しながらどのように計画的にレビューを進めていくかが鍵である。そこで、今回は基本設計の観点でレビューをする上での説明手順や準備に関して記載していこと思う。

 

【内容】

一番レビューにおいて重要なこと記載します。それは、レビューのストーリを組み立てられていることです。レビューストーリーとは、レビューをする上での物語を構築することです。何も考えずレビューに挑む(作成完了したからOKも含む)といくら成果物が正しくできていたとしても相手に伝えることができません。そのため、いかに相手を論破できる説明ができるかということが必要になります。

そこで私なりに、いつも自分が設計書に落とし込んで実施している内容を記載します。

  • 上位要求が漏れなく洗い出せているかを確認できること
  • その内容に関して対応するか否かを検討する。
  • ソフト修正箇所に関して、こういう理由で必要という説明ができる。
  • どこのテスト工程でこのソフト修正の品質を保証するか。また、どういったテスト観点が必要か。
  • 他担当者とIF整合取れているか。

※また、著者は、上記観点に関して、設計書のテンプレとしてローカルに保存し、運用している。逆にレビューワは、上記観点を満たせているかという観点でレビューに臨む必要があります。

 

  • 上位要求が漏れなく洗い出せているか確認できること

>また、私的に一番重要だと思う観点は、これです。「確認できること」が重要です。

変更量が多いと普段ではよい(変更量少ない)目視でやりましたや、検索かけて調査調べました等が通用しません。なぜならば、変更量が多すぎて変更内容を一目で確認できないためです。そのため、手順として仕様の抜け漏れがないことを証明できることが重要です。一つ一つの細かいところをレビューワが確認することは不可能なので、このやり方なら大丈夫だという安心を持たせて上げられれば、そのレビューは勝ちです( ´∀` )

実際の例を挙げますと、ソースコードのリバースから単体テスト実施します、という場面で、関数の洗い出しをしなければなりません。その時には、WinMargeで目視で確認して、関数洗い出したは、NGです。全ファイルに対して、WinMargeでソースコード差分をエビデンス(WinMergeできないかもしれないから代用して、DF)として残し、そのファイルに対して、単体テスト実施する/しないをエビデンスとして残し、説明するとレビューワも納得できる。

そもそも、エビデンスに残す必要があるのは、それがとても重要だからです。上位設計が漏れてしまうということは、不具合に直結するため、エビデンスが必要なのです。

設計書作成に必要なことまとめますと...

  • レビューストーリをまず立てる。
  • 不具合に直結する作業に関しては、なるべくエビデンスに残す。
  • 変更量が多い箇所に関しては、漏れていないかを確認できる。

以上となります。 

 

【独り言】

自身も勉強中の身なので、これを閲覧してくださった方が、

アドバイスやご意見頂ければと思います。

また、機会があれば、一緒に業界にかかわることや組込み(ハードやソフト問わない)やITに関わる勉強会をできればよいなという思いがあります。

様々な分野で活躍されている方のお話を聞きながら自身も成長していきたいという思いがあるので、インターネット上のお付き合いもうれしく思いますが、リアルな場面でも刺激を受ける機会があればよいなと思います。

 

【最後に】

お役に立てる記事が書けていれば幸いであります。

最後まで視聴ありがとうございました。

組み込み基礎知識


おはようございます、けいさんです。


今回は組込みの基礎知識を説明します。


組込みの基礎知識として


まず3点あげます


まず1点目として


RAMという概念があります。


RAMでは、スタティック領域の変数を扱います。基本的には、関数内では扱わず外部で定義します。理由としては、内部関数の変数として定義とすると、どこで定義しているかわかりにくいからです。


次にEEFPROMというものがあります。

この機能としては、例として、車の場合

、国名、車種、等の機種情報オアウ使っています。


最後に、臨機応変という言葉です。

組込み開発の場合、短期開発、短期納期というのは当たり前なので、ニーズを的確に捉え、正しく開発するということは極めて必要です。組込みエンジニアには、他人に遠慮せず、他人にせいなことをその人に伝える力が必要とされます。


組込み開発では開発知識はもちろん必要ですが、初対面の人と会話できるコミュニケーション能力と相手に正確なことを伝えられる医師が必要になります。





組込みシステム開発 〜現場編〜

皆さま、お疲れ様です。慶さんです。


今回は、開発現場の組込み知識を教えいたします。


開発現場では、開発が高度になる問題点です。原因は、組込み開発特有の短期開発、さらにニーズの拡大によるシステムの複雑化によることが原因です。その対策としては、開発するシステムに精通していることや開発プロセスが画一的であること、顧客の信頼を得ていることが挙げられます。

また組込みの開発に関わらず、プロジェクトのドキュメントの整合性は守らなければならないです。例えば、モジュール設計書や変数一覧表、フローチャートソースコードは、関数名やデータの流れは一致しなければなりません。例え、データの流れが変えて、処理の流れが変わらないとしても、フローチャートどおりにコーディングしなければなりません。組込み開発では、身近に関わるようなシステム(車載、医療、電化製品)の開発や最先端技術(ヘッドマウントディスプレイ、自動走行、TFT)の開発をすることができます。よって、私はそういう目に見える製品の開発をすることは面白いと感じます。


以上が組込みシステム開発の現場編でした。

組込み開発手法


こんばんわ、慶さんです!


組込みの一般的な開発手法について説明したいと思います。


❶要件定義

顧客のニーズをすべて洗い出し、要求されている仕様の曖昧さを無くす。

❷外部設計 

イベントリスト分析→DFD0→DFD1

顧客のニーズを満たすシステムを設計する。この場面では、システムの外側の設計を行う。具体的には、イベントリスト分析で、ユーザが入力する項目と求める結果をすべて洗い出す。次に、イベントリスト分析を元にDFDを作成する。先にDFD0を作成し、システム全体の振る舞いを図式化する。それが終えた段階でDFD1を作成し、プロセス単位の振る舞いを図式化する。

❸内部設計

モジュール構造図→モジュール整理→詳細データ設計→モジュール設計→状態遷移図、状態遷移表

モジュール構造図では、DFD1から、プロセスとデータストアを取り出し、DFD0のプロセス単位でファイルを作成します。

モジュール整理では、モジュール構造図をマイン制御系モジュールとデータ操作系モジュールに分割します。

モジュール設計書では、マイン制御系モジュールとデータ操作系モジュールを関数定義します。

詳細データ設計では、データ操作系モジュールに対するパラメータを定義します。ここでは、変数に対するパラメータを定義するということになります。

状態遷移図、状態遷移表は、コーディングする上で、状態がどのように遷移するかということを共有することができるので有益です。

また、テスト時に状態遷移表を元にテストを行うことでスムーズに進行することができます。

❹テスト

テストでは、単体テスト結合テストシステムテストと進行していきます。

単体テストでは、モジュール単位のテストを行います。モジュールとは、モジュール設計書で作成した関数単位のことです。

結合テストでは、各モジュールを一括にして、テストを行うものです。ここでは、システムの内部状態に着目してシステム作成者がテストを行います。

システムテストでは、外部設計書を元にユーザ目線のテストを行います。このテストは、製品版のテストのことです。

❺納品

以上が組込みシステム開発の進行の仕方です。

H8マイコン 主要機能一覧


こんばんわ、慶さんです。


今回はマイコンの主要機能について説明したいと思います。

結論としては以下の機能があります。

❶タイマA

❷AD変換

❸LED

❹タイマW

LCD

❻外部割込み、内部割込み

❼スイッチ

❽シリアル通信

❾その他

が主要機能になります。

❶タイマAでは、主にインターバルタイマとしての機能か時計の機能があります。機能の詳細としては、クロック周波数を設定でき、その周波数に応じて割込み処理が発生するというものです。

❷AD変換では、外部のアナログのデータ(ファンの回転数の読み取り、ボリュームの回り具合)をデジタルデータとして受け取る処理が実現可能です。

❸LEDでは、入出力I/Oの電圧をかけたり、GNDに落としたりして、LEDのオンオフを制御します。

❹タイマWでは、ファンの回転数を調整したりすることができます。タイマWでは、コンペアマッチという機能で、電圧のオフとオンの時間の比率を制御することができます。つまり、ファンの回転の速さを制御できるわけです。

LCDは、画面表示やアニメーションを作成するのやに必須となるでしょう。

❻割込みでは、主にタイマ割込みやスイッチ割込み、AD変換時の割込み等様々あります。割込みがないシステムはもはや組込みのシステムとは言えないでしょう。

❼スイッチは、立ち上がりエッジにオンにするか、立ち下がりエッジでオンにするかを制御できます。

❽シリアル通信では、H8マイコン同士をつなげて通信の機能を実現できます。

❾その他では、cdsや加速度センサやファン回転による入力等があります。

以上がH8マイコンの主要機能でした。

組込み開発手法


こんばんわ、慶さんです!


組込みの一般的な開発手法について説明したいと思います。


❶要件定義

顧客のニーズをすべて洗い出し、要求されている仕様の曖昧さを無くす。

❷外部設計 

イベントリスト分析→DFD0→DFD1

顧客のニーズを満たすシステムを設計する。この場面では、システムの外側の設計を行う。具体的には、イベントリスト分析で、ユーザが入力する項目と求める結果をすべて洗い出す。次に、イベントリスト分析を元にDFDを作成する。先にDFD0を作成し、システム全体の振る舞いを図式化する。それが終えた段階でDFD1を作成し、プロセス単位の振る舞いを図式化する。

❸内部設計

モジュール構造図→モジュール整理→詳細データ設計→モジュール設計→状態遷移図、状態遷移表

モジュール構造図では、DFD1から、プロセスとデータストアを取り出し、DFD0のプロセス単位でモジュール構造図を作成します。

モジュール整理では、プロセスを洗い出し、重複するデータストアを共通モジュールとしてまとめます。詳細データ設計では、データ型モジュールを変数定義して、パラメータを定義します。モジュール設計では、モジュール整理で洗い出された、プロセスとマシン制御系モジュールを関数定義します。状態遷移図、状態遷移表では、DFD1を元に状態と事象を分けてどのように遷移していくかを記述します。

❹テスト仕様書

今回は、状態遷移テスト仕様書を作成します。状態遷移図と状態遷移表を元にテストを作成します。

以上が組込みシステムで必要とされるドキュメント一覧です。


H8マイコン 正確な時計表示 タイマA


こんばんわ、慶さんです。


今回はタイマAを活用した時計の作り方を説明しようと思います。


今回は時計用の水晶発振器はないので、インターバルタイマを使って時計を計測します。


では、手順を追って説明しようと思います。


❶タイマAの割込み処理を設定する。

❷※割込みベクターに割込みフラグを下げる動作と処理を書く。

※inturrept処理

❸1回の割込み時間を計算する。

1÷クロック周波数=1クロックの時間

1クロックの時間×分周×256=一回の割込み時間

❹割込み回数から、1秒過ぎたら、1秒を計上する処理を行う。

抽象的でよくわからないので具体例で説明します。

例 水晶発振器が20Mhzで、分周が8で、タイマのオーバーフローが256の時の割込み処理時間

1秒 ÷ 20Mhz = 50n

50n×8=400n   1クロックの時間(分周混み)

400n×256=102400n =0.1024mS   一回の割込み時間

1秒 ÷ 0.1024mS = 9765

つまりおおよそ、9765回割込みされたら1秒計上するという処理を行えば、正確に1秒を計上できます。

以上がマイコンで正確に時計を計上する方法でした。

私の目的管理の手法

f:id:kei_nari:20160613080142j:plain 

こんばんわ慶さんです!


今回はわたしの目的管理のやり方について説明したいと思います。

そもそも皆さん目的と目標を分けて考えていますか?

目的とは、生涯で成し遂げたい唯一無二のことです。それに対して、目標とは、目的を達成するためのタスクの一覧です。目標は、変更して構いません。

本題に入りたいと思います。皆さん、なぜ目的管理しなければならないのか分かりますか?私は、目的管理することは、生きていく上での人生の指針になると解釈しています。

人生の私の目的は、「人々の幸せのため、燃え尽きるまで、技術力を磨き続ける」です。

私の目的の意味を細分化します。ここで重要なことは、他人のためになることだが、私自身も望んでいるということです。

まずは、人々の幸せのためにです。私は他人にとって、ライバルであり、信頼できる存在でありたいと考えています。こういった人になることで、他人にとって、有益な存在であると言えます。

次に、燃え尽きるまでです。これは、私の理念であります。私が生涯かけて実行したいという意思表示です。これによって、私は目的に向かって掻き立てられます。

最後に技術力を磨き続けるです。私にとっての技術とは、ある個人を特定できる歴史だと考えています。単純な技術(資格の有無、現場力の多さ、知識の深さ)ではなく、その人が歩んできた人生です。その人が歩む人生力を高めることが私の技術力です。

私の短い目的は、このように細分化できるわけです。

こういった目的を持つことで、物事、対人に関して、取捨選択し決定しなければならない時に自分が迷わずに進む指針となるでしょう。また、メリットとしては、目的を達成するための手段として目標を考えやすくなり、行動に移しやすくなることです。自分が書いた目的は、自分がいつも見る場所に置くといいでしょう。

目的管理は私たちが進路に困った時の道標になるでしょう。


H8マイコン タイマの種類

f:id:kei_nari:20160609182233j:plain

おはようございます、慶さんです。


今回はタイマの種類に関して説明させてもらいます。

❶インターバルタイマ

❷インプットキャプチャ/アウトプットキャプチャ

エッジの立ち上げ/立ち下げに同期してカウントする。

❸コンペアマッチ

タイマカウントとユーザ定義のカウント値と比較してカウントクリアされたら、出力をHighにする。PWMとして使われる。

❹システムクロック

以上がH8のタイマの種類でした。


H8マイコン AD変換 トグル→LCD


こんばんわ慶さんです。


今回は、H8で、AD変換する方法を説明します。

初期設定

❶アナログ信号の割込みをイネーブルに設定する。

❷アナログ信号のステートの設定

メイン関数内

❶AD変換を開始フラグを立てる。

❷タイマA割込みベクターテーブル内でAD変換停止フラグを立てる。

※システムクロック周期でタイマ関数が呼ばれる。

❸char型、unsignedの変数にデータバスから値を格納する。

LCDに逐次表示する。

以上AD変換でした。

H8マイコン タイマ割込み


おはようございます、慶さんです


本日はタイマ割込みの処理をするための手順を説明したいと思います。


❶割込みベクターテーブル19にタイマ割込みの処理を記述する。

※割込み内で変数が変化する場合は、volatile宣言する。

❷タイマ割込みのクロック周波数を定義する。

❸割込み設定時には、割込みを禁止する。また、割込み設定終了後には、割込みを許可する。

❹タイマ割込みに使われるポートの設定をする。P83、P84のLEDを割込み内で記述し、制御文で管理する。

以上がタイマ割込みの設定でした。



組込み開発、H8マイコン 割込み登録が難しい


こんばんわ慶さんです。


H8マイコンのHEWが開発環境です。割込みを登録してから処理する流れの概要を順を追って説明します。

❶対象の割込みベクターテーブルをコメントアウトする。

ベクターテーブルとは、関数ポインタ配列で出来た、割込み一覧です。そのベクターテーブルをユーザ個人が登録するためにコメントアウトします。

❷自身が作成した作業領域内で、#pragmaの下に❶でコメントした割込みベクターをユーザ自身が関数として定義します。

#pragmaとは、コンパイラ依存の関数です。ベクターテーブルに割込み処理をユーザが定義するということです。

※#pragmaの下は、割込み関数として全て登録されるので、割込み以外の処理は含まないように注意します。

❸外部処理を割込み処理として設定する。

❹エッジフラグを設定する。

エッジとは、外部処理、例えば、SW入力で、立ち上がりにビットを立てるのか立ち下がりにビットを上げるのかを設定する。

❺割込み処理を受付けた段階で、ビットを立てるフラグを設定する。

❻CPU内で割込みを禁止/許可を制御する

割込み処理中は他の割込みを禁止する。割込み終了時に割込みを許可する。

❼割込み処理をイネーブル設定にする。


以上が割込み処理を登録し実行する手順です。非常に面倒でなんだかわかりません笑。

c言語で使っている技術を熟知している人でなければ何をしているのかわかりませんね。

結局、これを理解できる人は、ソフトウェアでは、関数ポインタとビットフィールドと構造体、共用体、ビット操作、インクルードの知識、あと出来ればアセンブリで、ハードウェアでは、電圧、ダイオード、正論理、負論理、SWのチャタリング、回路図が読める、本当に様々な知識が必要になります。

一朝一夜では、どうにもならないので、ソフトウェアでは最低、構造体、共用体、ポインタ、関数ポインタの使い方、ハードウェアは、正論理、負論理、回路図が読めるように学習する必要があります。




組込みシステム?アルディノでタッチセンサでLEDを光らせる


こんばんわ、慶さんです。


f:id:kei_nari:20160601194957j:plain

上はタッチセンサで単色LEDを光らせています。今回は、抵抗値を入れてないですけど、ピンに単体で電源と接続してるのでショートすることはないでしょう笑

本来は、330Ωくらいの抵抗を付けましょう。

上記は、アルディノの上にgroveという

便利なプリント基板を載せています。これはフレッドボード無しで、I/Oを動作させることが出来ます。

上記の写真はタッチセンサのアナログ情報をデジタル情報として受け取り、アウトプットとしてLEDを点灯させています。

groveは、回路を意識しないで、センサを組み込むことが出来るので便利です。

本来であれば、タッチセンサに触れると抵抗値が上がりその電流の流れをトランジスタのベースで感知し、コレクタからエミッタに電流が流れ、ダイオードを光らせるという回路を組まなければなりません。groveでは、これら一連の処理を端子1本つなぐだけで実現できるので便利な分、知識の定着という意味では、イマイチという部分があるかなといった感じです。そもそも、アルディノが、芸術家向きのファームウェアなので、回路構成の知識を求められても困るという現状があるからでしょう。














組込みシステムとは


こんばんわ、慶さんです!


組込みシステムの意味は、広義では、システムにコンピュータを組み込むことです。

狭義では、ある製品にソフトウェアとハードウェアを組み込むシステムのことです。具体的に言うと、カメラのような製品のことです。カメラは、レンズを調整するトルクや、撮影ボタンに使われる圧力センサと呼ばれる部品等のハードウェアからなります。このハードウェアを制御するために、トルクやセンサをプログラム命令で制御しています。

そして、汎用コンピュータと違い組込みのコンピュータとは、CPUを指すのではなく、CPUを含む、内蔵ROMや内蔵RAMやI/Oを含むこのをコンピュータと呼んでいます。

組込みでは、ソフトウェアだけでなくハードウェアも密接に関わってくるのでそれらの学習も不可欠です。









c言語の基礎的なポインタの使い方


こんばんわ、慶さんです!


ポインタは、難しいとか理解しにくいと言われる所以が、ポインタ変数は、アドレスを格納します。

普通の変数は、数値や数字を代入するのに対して、ポインタ変数は、アドレスを代入します。

アドレスとは、数値や数字を格納しているメモリの中身の番地のことです。例えば、住所131-0033と検索したら、墨田区を特定することが出来ます。つまり、131-0033がアドレスで、墨田区がメモリの中身のことです。

結果アドレスは、メモリの中身の番地を指しています。

具体的には、ポインタはこのアドレスを格納し、間接的に参照したり、操作することができるます。

ソースコード

int in=10;

int *p;

/*ポインタ変数にinのアドレスを格納する*/

p=∈

/*ポインタpが指す、変数の値を演算する*/

*p=*p+5;

printf("%d¥n",*p);

printf("%0x¥n",p);

実行結果

15

0x4028fc

ポインタが指す値

ポインタ変数が格納するアドレス