関連サイト
本書の関連ページが用意されています。
内容紹介
普段の私たちは非常に便利な、高レイヤーな世界で暮らしています。コンピュータの電源をつければ自動でOS が立ち上がって作業ができますし、多くの周辺機器はUSB で接続するだけで勝手に使えるようになります。それに比べ、低レイヤーなマイコンの世界ではLED を点灯するだけでも一苦労、周辺機器をつなぐとなれば周辺機器のデータシートとにらめっこして通信仕様を一つ一つ実装していくなど大変な苦労が必要です。
(中略)
本書の目的は今まさに離れつつある、低レイヤーな世界と高レイヤーな世界をつなぎとめることにあります。ではどうするかというと、まず本来Linux 等のOS を立ち上げ、高レイヤーな世界で利用するRaspberry Pi を、OS を利用せずマイコンのように利用する方法を学びます。そして実際に動かしてみることで、ブラックボックスの中身を暴き、「マイコンと一般的なコンピュータは本質的に同じものである」という実感を得ていただき、低レイヤーと高レイヤーの距離を近づけて行きたいと考えています。
本書を通し低レイヤーな世界に少しでも光を灯すことができれば幸いです。
(「第1章 イントロダクション」より)
書誌情報
- 著者: 西永俊文
- 発行日: 2014-02-14
- 最終更新日: 2014-12-25
- バージョン: 1.0.0
- ページ数: 309ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: 達人出版会
対象読者
Raspberry Piを使いこなしたい方、低レイヤーが好きな方
著者について
西永俊文
じとめと二次元美少女と組み込みをこよなく愛する大学生。工業高校で与えられたマイコンとはんだごてで遊んでいたら、いつの間にか大学に入学していた経歴を持つ。普段は二次元美少女を愛でながら、興味の赴くままに電子回路、マイコン、プログラミングで遊んでます。
目次
まえがき
- ごあいさつ
- 本書の経緯
- 本文の書き方について
- さいごに
- 謝辞
- コードの公開場所について
- 画像のライセンスについて
- 各章の構成について
第1章 イントロダクション
- 1.1 動機と目的
- 1.2 対象とする読者
- 1.3 本書で何を作るのか
- 1.4 Tips
- 1.4.1 マイコンと普通のコンピュータの違いとは
- 1.4.2 ARMプロセッサのラインナップ
第2章 環境構築
- 2.1 機材を揃える
- 2.1.1 必要なもの(ハードウェア編)
- 2.2 Raspberry Piの動作確認
- 2.3 開発用マシンの構築
- 2.3.1 Debianのインストール
- 2.3.2 クロス開発環境のインストール
- 2.4 SDカードのセットアップ
- 2.5 まとめ
第3章 C言語を動かそう
- 3.1 スタートアップコードを書こう
- 3.1.1 プログラムはどこから動き始めるのか
- 3.1.2 スタートアップ!
- 3.2 リンカスクリプトを作ろう
- 3.2.1 役者紹介
- 3.2.2 コード解説
- 3.3 BSSの初期化をしよう
- 3.3.1 BSSとは
- 3.3.2 BSS初期化コードの記述
- 3.4 プログラムを整理しよう
- 3.5 Makefileでコンパイルを自動化しよう
- 3.5.1 Makefileの簡単な解説
- 3.6 インストール方法
- 3.7 Tips
- 3.7.1 Raspberry Piの起動シーケンスについて
- 3.7.2 ELF形式について
- 3.7.3 セクション定義の確認
- 3.8 まとめ
第4章 LED blink(Lチカ)
- 4.1 LEDを点けてみよう
- 4.1.1 LEDが接続されたポートを探そう
- 4.1.2 ペリフェラルアドレスに関する諸注意
- 4.1.3 GPIOに関するレジスタについて調べよう
- 4.1.4 LEDを点けてみよう
- 4.2 delay関数を作ろう
- 4.2.1 delay関数の実現方法考察
- 4.2.2 System Timerに関するレジスタについて調べよう
- 4.2.3 delay関数を作ろう
- 4.3 LED blink(Lチカ)をしよう
- 4.4 ライブラリ化
- 4.4.1 レジスタへのアクセス方法について
- 4.4.2 GPIO関連の関数の仕様ついて
- 4.4.3 SystemTimer関連の関数の仕様ついて
- 4.4.4 rpi_initへの追加点
- 4.5 まとめ
第5章 UART
- 5.1 UARTの初期設定をしよう
- 5.1.1 初期化について
- 5.1.2 UARTの関するレジスタについて調べよう
- 5.1.3 初期化コードを書こう
- 5.2 UARTでパソコンと通信しよう
- 5.2.1 パソコンとの接続方法について
- 5.2.2 文字を送信してみよう
- 5.2.3 文字を受け取ってみよう
- 5.2.4 文字列を送信してみよう
- 5.2.5 文字列を送り返してみよう
- 5.3 ライブラリ化
- 5.3.1 シリアル関係の関数の仕様について
- 5.4 まとめ
第6章 標準Cライブラリ
- 6.1 標準Cライブラリ(libc)
- 6.1.1 標準Cライブラリ(libc)とは?
- 6.1.2 標準Cライブラリの種類
- 6.1.3 libcとハードウェアの関係
- 6.1.4 システムコールとは
- 6.1.5 どうやって標準Cライブラリを使えるようにするのか
- 6.1.6 今後の方針
- 6.2 システムコールを実装しよう
- 6.2.1 ヒープメモリと_sbrkシステムコールについて
- 6.2.2 入出力に関するシステムコールについて
- 6.2.3 時間に関するシステムコールについて
- 6.2.4 その他のシステムコールに対するお茶の濁し方
- 6.3 標準Cライブラリ関数を使ってみる
- 6.3.1 printfを動かしてみる
- 6.3.2 systimeを表示しよう
- 6.4 まとめ
第7章 シリアルバス通信
- 7.1 必要なもの
- 7.2 SPI(Serial Peripheral Interface)とは
- 7.2.1 マスタースレーブモデルとは
- 7.2.2 シリアルバスとは
- 7.2.3 SPIの信号線と接続
- 7.2.4 SPI通信の手順
- 7.2.5 SPIのモードについて
- 7.3 Raspberry PiのSPIインターフェースを調べよう
- 7.3.1 SPIに関するレジスタを調べよう
- 7.3.2 ソフトウェアによるSPI通信手順
- 7.4 温度センサーの仕様を確認しよう
- 7.4.1 これから行うことについて
- 7.4.2 概要
- 7.4.3 SPIのモードとSCK
- 7.4.4 レジスタの説明
- 7.4.5 SPIによるレジスタのアクセス方法
- 7.4.6 動作モード
- 7.4.7 温度の求め方
- 7.4.8 温度センサーからの温度取得手順のまとめ
- 7.5 温度センサーとRaspberry Piを接続しよう
- 7.6 温度センサーの値をパソコンに表示してみよう
- 7.6.1 SPIを用いて温度センサーにアクセスする方法のおさらい
- 7.6.2 プログラムを作ろう
- 7.7 I2Cとは
- 7.7.1 I2Cの信号線について
- 7.7.2 I2Cの通信手順について
- 7.7.3 I2Cの通信タイミング
- 7.7.4 I2Cによるデバイスとの一般的な通信手順
- 7.8 Raspberry PiのI2Cインターフェースを調べよう
- 7.8.1 I2Cに関するレジスタを調べよう
- 7.8.2 ソフトウェアによるI2C通信手順
- 7.9 キャラクタLCDの使い方を確認しよう
- 7.9.1 概要
- 7.9.2 スレーブアドレス
- 7.9.3 通信の概要
- 7.9.4 初期化方法
- 7.9.5 文字表示方法
- 7.10 LCDとRaspberry Piを接続しよう
- 7.10.1 Raspberry Pi側のピン配置
- 7.10.2 LCD側のピン配置
- 7.10.3 接続図
- 7.10.4 プルアップ抵抗の接続について
- 7.11 LCDに文字を表示してみよう
- 7.11.1 これまでのおさらい
- 7.11.2 プログラムをつくろう
- 7.12 ライブラリ化
- 7.12.1 SPI関係の関数について
- 7.12.2 I2C関係の関数について
- 7.12.3 温度センサー関係の関数について
- 7.12.4 LCD関係の関数について
- 7.12.5 I2C-Readのサンプルについて
- 7.13 簡易温度計をつくろう
- 7.14 まとめ
第8章 CPUモードと割り込み(interrupt)
- 8.1 割り込み(interrupt)
- 8.1.1 例外について
- 8.2 CPUモード
- 8.2.1 CPUモードとは
- 8.2.2 CPUモードの種類と優先順位
- 8.2.3 バンクレジスタ
- 8.3 例外処理プロセス
- 8.3.1 例外処理プロセスの概要
- 8.4 レジスタの確認
- 8.4.1 タイマーとは
- 8.4.2 タイマーの仕様を確認する
- 8.4.3 割り込み制御レジスタの仕様を確認する
- 8.5 Let's 割り込みプログラミング
- 8.5.1 割り込みプログラミングの流れ
- 8.5.2 割り込みプログラミング(実践)
- 8.6 ライブラリ化
- 8.6.1 割り込みに関する関数達について
- 8.6.2 タイマーに関する関数達について
- 8.7 まとめ
付録A Raspberry Pi P1コネクタについて
- A.1 P1コネクタのピン配置
- A.2 ピン番号とGPIOの対応
- A.3 GPIOとAlternativeモードの対応表
付録B Raspberry Piのデバッグ方法(シンプル版)
- B.1 デバッグの概要
- B.1.1 JTAGデバッグに必要なもの(ハードウェア編)
- B.1.2 JTAGデバッグに必要なもの(ソフトウェア編)
- B.2 デバッガの接続(ハードウェア編)
- B.2.1 デバッガとRaspberry Piの接続方法
- B.3 デバッガの接続(ソフトウェア編)
- B.3.1 JTAGデバッグ用プログラムの用意
- B.3.2 デバッグ対象コードの修正部
- B.3.3 OpenOCDをJTAGデバッガに接続する
- B.3.4 デバッガの起動とOpenOCDへの接続
- B.3.5 プログラムのロード
- B.4 gdbによる簡単なデバッグ方法解説
- B.4.1 プログラムの再スタート(continue)
- B.4.2 Raspberry Piのリセット(プログラムのリロード)
- B.4.3 プログラムのソースコードを表示する(list)
- B.4.4 breakpointの設定(break)
- B.4.5 ステップ実行(step, next, finish)
- B.4.6 変数の表示(print)
- B.4.7 メモリ内容の表示(x)
- B.4.8 変数の値を変更する(set variable)
- B.4.9 逆アセンブル(disas)
- B.4.10 各レジスタの表示(info register)
- B.4.11 レジスタにアクセスする
- B.4.12 gdbを終了する
付録C U-Bootを使ったネットワークブート
- C.1 TFTPサーバーを立てる
- C.1.1 TFTPサーバーのインストール
- C.1.2 TFTPサーバーの設定
- C.1.3 TFTPサーバーの動作確認
- C.2 U-Bootをコンパイルする
- C.2.1 ソースコードを取得する
- C.2.2 ソースコードを修正する
- C.2.3 U-Bootのコンパイル
- C.2.4 Raspberry Piへのインストール
- C.3 ネットワークブートしてみる
- C.3.1 プログラムのコピー
- C.3.2 ネットワークブート
- C.4 U-Bootコマンドを自動化したい
- C.4.1 方針
- C.4.2 コードの修正
- C.4.3 コンパイルとインストール
付録D Raspberry Pi Type B+ への対応状況について
- D.1 各章のプログラムとその動作状況について
- D.1.1 第4章「LED blink(Lチカ)」
- D.1.2 第5章「UART」
- D.1.3 第6章「標準Cライブラリ」
- D.1.4 第7章「シリアルバス通信」
- D.1.5 第8章「CPUモードと割り込み(interrupt)」
- D.1.6 付録B「Raspberry Piのデバッグ方法(シンプル版)」
- D.1.7 付録C「U-Bootを使ったネットワークブート」
付録E あとがき
- E.1 C85版
- E.2 電子書籍版(ベータ版)
- E.3 電子書籍版(正式版)
付録F 参考文献
付録G 変更履歴
- G.1 概要
- G.2 変更履歴
- G.2.1 達人出版会β(ver0.9.0)
- G.2.2 達人出版会β(ver0.9.1)
- G.2.3 達人出版会β(ver0.9.2)
- G.2.4 達人出版会 正式版(ver1.0.0)