組み込みプログラミングのためのハードウェア基礎知識

組み込み系のC言語/C++の開発現場に配属された人

組み込み系のC言語/C++の開発現場に配属されたんだけど、なんか、CPUやメモリなどハードウェアの事についてよく知らない、組み込みプログラミングの基礎知識が欲しい。あと、ついでに良い学習の仕方があれば知りたい、と考えていませんか?

f:id:rydeenworks:20191120152010j:plain

本記事では、この疑問を解決します。

本記事の内容

  • ハードウェアの基礎知識

  • ハードウェアの基礎知識の学習方法

著者について

この記事を書いている私はプログラミング歴が15年ほどあり、直近5年は組み込みプログラミングの開発をしています。

デスクトップアプリ開発5年(C/C++)→スマホアプリ開発5年(Java/Objective-C)→組み込みアプリ開発5年(C/C++)

経歴は上記の通りですが、初心者の時に学んだハードウェアの基礎知識はずっと役に立ってきました。

1 ハードウェアの基礎知識

f:id:rydeenworks:20191027224859j:plain

1.1 ハードウェア特性の理解

プログラムはハードウェア上で動作しますので、ハードウェアの特性を理解してプログラムする必要があります。

たくさんの種類の部品が集合してハードウェアを構成していますが、はじめのうちは主要なものだけ理解すれば良いです。

  • CPU
  • メモリ
  • ストレージ
  • ネットワーク

各ハードの主要な特性は以下の通りです。

CPU

  • CPUはプログラムで命令した計算処理を行うハード
  • 一定時間内にどれだけの計算量をこなせるかはCPUによって決まる
  • 一定時間内の計算量上限に達するとCPU使用率100%になる、それ以上の計算は待たされるので最終的な計算完了までの時間が長くなる。
  • たくさんの計算量をこなせるCPUは高価

メモリ

  • メモリはプログラムで処理するデータを保持するハード
  • 保持できるデータサイズはメモリによって決まる
  • メモリが保持できるデータサイズの上限を超えた場合、メモリ上のデータをストレージに退避する。退避処理が発生するとプログラム動作が遅くなる。ストレージに退避したデータをメモリに復帰させる処理も、同様にプログラム動作が遅くなる。
  • たくさんのデータを保持できるメモリは高価

ストレージ

  • ストレージはデータをファイルとして保存するハード
  • プログラムはファイルからデータを読み込んでメモリに保持する、またデータをファイルに保存する
  • ストレージに保存できるデータサイズ上限はストレージ容量によって決まる
  • ストレージ容量を超えて保存させようとした場合、保存処理は失敗する

  • ストレージのハードの種類は色々ある(ハードディスク/SSD/USBメモリ/SDカード)

  • ハードディスクはSSDに比べて安くて大容量、ただしデータ保存・読み込みのためにディスクを物理的に回転させるのでプログラムの動作が遅くなる

  • たくさんのデータを保持できるストレージは高価

ネットワーク

  • ネットワークはコンピュータ間でデータを送受信するためのハード
  • 一定時間内にどれだけの通信量をこなせるかはネットワーク環境とハードで決まる
  • 一定時間内の通信量上限に達するとネットワーク使用率100%になる、それ以上の通信は待たされるので最終的な通信完了までの時間が長くなる。
  • たくさんの通信量をこなせるハード・ネットワーク環境は高価

1.2 利用可能なハードウェア資源の確認

ハードウェア特性の理解 を踏まえて、実際にプログラムする上で利用可能なハードウェア資源を確認します。

全般

  • ハードウェア上で動作するプログラムは1つだけか?

複数のプログラムを同時に実行する場合、1つのプログラムがハードウェア資源を使い切ってしまうと困るので確認します。

CPU

  • CPU使用率100%まで使い切って問題ないか?

基本的には100%まで使い切るのは良くありません。CPUが熱くなったり、電力をたくさん消費したり、他のプログラムが止まってしまったり、色々と支障があります。

メモリ

  • プログラムが利用可能なメモリサイズ上限は?

ストレージ

  • プログラムが利用可能なストレージ容量上限は?

ネットワーク

  • プログラムが利用可能な通信量上限は?

1.3 ソフトウェア設計の確認

利用可能なハードウェア資源を踏まえてソフトウェア設計します。

基本的には以下のことを行うイメージです。

  • 設計上のハードウェア資源使用量を算出する
  • 資源使用量の実績値をログ出力して可視化する
  • 設計改善によって資源使用量を削減する

基本的にはハードウェア資源使用量を減らすということは、性能がそれだけ落ちます。ハードウェア資源使用量と性能のバランスを理解した上でトレードオフします。(処理データ量削減やアルゴリズム改善によってハードウェア資源使用量を減らした場合は性能は落ちません)

f:id:rydeenworks:20191120152053j:plain

CPU

  • 計算量が多いプログラムの特定
  • 計測処理ログ出力(処理時間、CPU使用率)の検討
  • 改善設計の検討(データ削減、アルゴリズム改善)

メモリ

  • プログラムの設計上のメモリ使用量の算出
  • メモリ使用量のログ出力の検討
  • 改善設計の検討(データ削減、アルゴリズム改善)

ストレージ

  • プログラムの設計上のストレージ使用量の算出
  • ストレージ読み書き処理のログ出力(ファイルサイズ、処理時間)の検討
  • 改善設計の検討(データ削減、ストレージアクセス回数削減)

ネットワーク

  • プログラムの設計上の通信量の算出
  • 通信ログ出力(通信量、通信回数)の検討
  • 改善設計の検討(データ削減、アルゴリズム改善)

2 ハードウェアの基礎知識の学習方法

2.1 組み込み系なら初学者のうちに基礎知識を習得しましょう

ハードウェアの知識はなるべく早く身につけた方が良いです。

なぜなら、どんなハードウェアもCPU/メモリ/ストレージというハードウェア構成は変わらないため、一度これらの知識を身につけておくと一生この知識がプログラミングで生かせてコストパフォーマンスが良いからです。

また、近年ではネットワーク常時接続が当たり前になっているためネットワークの知識を持っている方が良いです。

2.2 学習の仕方

インターネットでたくさんの情報が得られますが、それらは断片的で体系的ではない事があり初学者に情報の取捨選択するのは大変だと思います。

そのため、評判の良い本でハードウェアの基礎知識について体系的な全体像を学ぶのがおすすめです。以下の方法で調べると良いでしょう。

  • Google検索で評判の良い本を調べる
  • Amazonで本のレビューを調べる

2.3 ハードウェア基礎知識の学習の実例

初学者には次の本が特にオススメです。

図書館の予約を便利にするアプリの紹介

私は図書館をよく利用するのですが、上記の本も図書館から借りました。本が図書館にあるかAndroidアプリ 図書さがし(Google Play)で簡単に調べることができて便利です。

rydeenworks.hatenablog.com

f:id:rydeenworks:20191027225236p:plain