投稿

12月, 2019の投稿を表示しています

STM32F3 Discovery、タイマーと割り込みのキホン

イメージ
STM32F3 Discovery、タイマーと割り込みのキホン 今回のSTM32F3 Discovery企画では、基本的なタイマー動作についての設定と、そのタイマーを割り込みで使うための基本について解説したいと思います。 写真ではわかりづらいですが、タイマーでPWM制御しています。 STM32F303は、タイマーとしてTIM1, TIM2, TIM3, TIM4, TIM6, TIM7, TIM8, TIM15, TIM16, TIM17 と10個のタイマーを持っています。(なぜ番号が飛んでいるのかは不明) この中で、TIM1と8は高機能なタイマーとして実装されていますが、今回の記事ではTIM1を使ったプログラミングを行いたいと思います。 また、タイマーとともに割り込みでの処理を行いたいので、割り込み設定についても解説していきます。 なお、このサンプルではタイマー設定などについて、直接レジスタ設定で実現しています。 レジスタ、割り込みの定義は、stm32f303xc.hで行われています。他のSTM32を利用する場合、それぞれのMPUに適したヘッダファイルが存在していますので、そちらのヘッダーファイルを参照してください。 stm32f303xc.h 中で、TIM1に関するレジスタのベースアドレスや各操作レジスタが定義されていて、  TIM1->PSC = 4800;  → TIM1タイマーのプリスケーラーレジスタに4800を設定する の、ような記述が可能になります。 一般的にMCUのタイマーは、タイマーモジュールに供給されているクロックをカウントすることで、ある時点からどのくらい時間が経過したかを測るものです。 このため、使用するタイマーモジュールに供給されるクロック数を確認しないと正確なタイマー設定を行うことができません。 タイマー1(TIM1)は、STM32F303xB STM32F303xCデーターシート(DS9118.pdf)のブロックダイアグラム(13/149)を確認すると、APB2/72MHzに接続されています。しかし、実際に供給されているクロック設定をCubeMXで確認すると、48MHzとなっています。Eclipse CubeMXのパースペクティブのClockConfigurationを確認して

Linuxシステムコール、POSIX スレッドの生成

UNIX / Linux システムコール・プログラミング POSIXスレッドの生成 スレッドとは? スレッドは、実行の単位ですがプロセスとは異なります。プロセスは、プロセスごとに独立した論理アドレス空間をもち、異なるプロセス間ではメモリの共有をしていません。 プロセスの生成に関しては下記を参照。  →  Linuxシステムコール、プロセスの生成 これに対してスレッドは、1つのプロセスのメモリ空間を共有する複数の実行単位となります。簡単に言ってしまえば、ある関数fx()を呼び出すときにスレッドとして呼び出すことでfx()を複数、同時並列的に実行できるようになります。 同様のことは fork()で別プロセスとして分岐し、fx()を呼ぶことで実現できますがfork()はプロセスのメモリイメージのコピー(実際にはコピーオンライトで異なる部分だけのコピーでその他は共有されます)が発生し、プロセス動作するためのスタック領域などが別個に確保されるためのコストが発生します。 スレッドは、このようなコストを必要としないという特徴があります。 また、スレッドはマルチコアのCPUの場合に特定のコアにスレッドを結びつけることも可能という特徴もあります。 また、通常c言語は、main() から始まりますが、この大本をメインスレッドとも表現します。 スレッドを動かしてみよう! それでは、実際にLinux上でスレッドを使ったコードについて解説していきたいと思います。 サンプルコードは下記のような処理を行います。 1.3つの新しいスレッドを、pthread_create() で生成します。  このとき、メインスレッドから起動時の引数として文字列を渡します。 2.それぞれのスレッドが同時並行で処理を行います。  このコードでは下記の2つの処理を実装しています。   スレッド関数1. 引数の文字列の長さ分タイマーウエイトを行う   スレッド関数2. 引数の文字列を大文字・小文字変換して返す 3.メインスレッドは、各スレッドの完了を待ち合わせます。  起動されたスレッドは終了時に、pthread_exit() を使って終了コードを通知します。  メインスレッドは、pthread_join() を使って各スレッドの終了状態を受け取ります

Beaglebone Black ネットワーク・ブート環境の構築

イメージ
Beaglebone Black ネットワーク・ブート環境の構築     Beaglebone Black networking boot via Network over USB. 前回記事、「 BeagleBone Black 起動SDカードの作成 」では、Linuxを起動できるSDカードを作成してBeaglebone BlackをLinux動作させる方法について紹介しました。 しかし、この方法ではカーネル周りを開発する場合に毎回開発PCでSDカードを作成し、Beaglebone BlackにSDカードを戻して起動、という手順を毎回ふまなければなりません。 また、SDカードを頻繁に抜き差しするため、SDカードスロットへの負荷も大きくなり、SDカードスロットが故障する原因ともなり得ます。 このため、実際の開発現場においてはターゲットボードをネットワーク経由でブートする環境を構築することが現実的です。 今回の記事は、実際にBeaglebone Blackをネットワーク経由でブートするための環境を構築する方法について紹介します。 なお、この記事の内容はUbuntuのバージョンなど「 BeagleBone Black 起動SDカードの作成 」で紹介した環境をベースにしています。 ネットワーク・ブートとは? ネットワーク経由でのブートとは、ターゲットであるBeagleBone Blackと開発ホスト(サーバー)をTCP/IPで接続します。実現のために、このネットワーク上では、2つの技術を利用します。 1つ目は、ネットワーク経由でカーネルイメージをダウンロードしてメインメモリに展開するための「 TFTP 」。 もう1つは、システムが起動するためのルートファイルシステムをネットワークから与えるための「 NFS 」です。 AM3359は、電源投入後ROMプログラムが動作し、U-Bootをメインメモリにロードします。ここまではSDカード起動と同様です。このU-BootはBeaglebone Black上のMMCでも、SDカードでも問題ありません。 このU-Bootの機能を使ってTFTPサーバーから、カーネルイメージをダウンロードします。TFTPとは、Trivial File Transfer Protocol(トリビア