読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

ARM

STM32F7 Discovery の開発環境 (2)

LED チカチカプログラム まずは、お決まりの LED を点滅させるプログラムを作ります。回路図を見ると、STM32F456 の PI1 端子は LD1 という緑色の LED に接続されてます。PI1 は GPIOI で制御可能なので、GPIOI を 0/1 制御することで LED を点滅させてみま…

STM32F7 Discovery の開発環境 (1)

STM32F7 Discovery という Cortex-M7 コア搭載の基板を入手したので、早速使ってみました。SRAM 320KB, SDRAM 16MB, 静電容量式タッチパネル付き TFT 液晶, USB, Ethernet, Micro SD, Audio 果ては カメラ I/F まで搭載し、Arduino も被せられるようになって…

コンテキスト切り替えの仕組み

OS ARM C

Cortex-M コアのコンテキスト切り替えについて、uros に実装した仕組みについてまとめておきます。(自分でもいつか忘れそうなので…) コンテキスト情報とは? タスクのスタック領域は full-descending スタック(スタックポインタが最後に push したデータ…

軽量 RTOS の開発 (9)

RTOS に乗せる静的オブジェクト用のコンフィギュレータを作ってみました。JSON をパースして C 言語の構造体リテラルに変換するだけの Common Lisp スクリプトです。 tanakahx/urosgithub.com Roswell スクリプト Common Lisp でスクリプトを書くと、他人に…

軽量 RTOS の開発 (8)

OS ARM C

前回アラームの実装が完了した段階で、OSEK の主要な機能はおおむね実装できたので、次はフットプリントの最適化を進めます。 タスクのエントリポイント、優先度、スタック領域等、静的に確保するデータは const にすることで Read Only リージョンに割り当…

Vagrant を使ってクロスコンパイル環境の構築を自動化してみる

STM32F4 Discovery 等のマイコンを使った開発をする場合、ARM のクロスコンパイル環境を整える必要がありますが、コンパイラやエミュレータ等のバージョンを揃える必要があり、場合によってはソースコードをからビルド必要があったりと、これが結構面倒な作…

STM32F4 Discovery の開発環境 (5)

OpenOCD を使った Flash 書き込み 前回、stlink というソフトで Flash 書き込みをしましたが、別のオープンソースの Flash ライタとして、OpenOCD を試してみました。stlink が不安定な場合はこちらを試した方がいいかも。 公式からリリース版も入手可能です…

STM32F4 Discovery の開発環境 (4)

前回で一通りの開発環境は整いましたが、さらに一歩進んで UART を動かしたいと思います。UART があれば printf デバッグができるようになるので、観測性が一段と向上します。 UART でエコーバック UART の通信設定は次のようにしました。 ボーレート: 11520…

STM32F4 Discovery の開発環境 (3)

SystemInit 前回端折った SystemInit は system_stm32f4xx.c で定義されている関数です。これはクロックソースを HSI という内部発振子に設定して、割り込み禁止、例外ベクタハンドラのアドレス設定(VTOR) をしてます。リセット後に初期状態に戻すために使う…

STM32F4 Discovery の開発環境 (2)

まず始めに ARM 用の GCC ツールチェーンをインストールします。apt-get で一発です。 $ sudo apt-get install gcc-arm-linux-gnueabi $ arm-linux-gnueabi-gcc --version arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 F…

STM32F4 Discovery の開発環境 (1)

Cortex-M4 コアが載っているマイコン基板 STM32F4 Discovery をゲットしました。(なぜか画像が横向き…) コアクロックは Max 168MHz まで回せ、1M Flash + 192 KB SRAM のメモリ付き、というマイコンにしてはリッチなスペックにも関わらず価格は 2000 円と…

軽量 RTOS の開発 (7)

OS ARM C

今日はアラーム機能を実装しました。 tanakahx/urosgithub.com アラーム機能とは、ある一定時間が経ったときに、タスクを起こしたり(アクティベーション)、イベントフラグを立てたり、コールバック関数を呼ぶという機能です。そもそも OS は時間をどう計る…

軽量 RTOS の開発 (6)

OS ARM C

今日はあまり進捗がなかったです…。というのも、カーネルとユーザタスクが一緒くたになっていたので、インタフェースを整えるべく、のほほんとリファクタリングしてたのですが、あるところで修正前後の挙動が保存されなくなってしまい、そのバグ取りではまっ…

軽量 RTOS の開発 (5)

OS ARM C

今日はリソース管理機能の追加をしてみました。OSEK/VDX でいうリソースとは、実質的にはミューテックスだと思われますが、あるタスクがリソースを確保したら、別のタスクはそのリソースを得ることはできず、そのタスクが解放するまでは待ち状態になる、とい…

軽量 RTOS の開発 (4)

OS ARM C

イベントフラグの実装をしてみました。OSEK/VDX のように、各タスクはイベントオブジェクトを持ち、wait_event() で待ち状態に入ります。このとき、起床条件にあたるビットパタンを指定します。続いて、別のタスクが set_event() によりイベントをセットしま…

軽量 RTOS の開発 (3)

OS ARM C

タスクを特権モードではなくユーザモードで動作させるのは、ちょっとしたトリックを使うと簡単に実現できました。例外発生により割り込みがかかると、LR レジスタには EXC_RETURN という特殊な値が格納されます。この EXC_RETURN の値は、例外発生時点に復帰…

軽量 RTOS の開発 (2)

OS ARM C

SysTick タイマ Cortex-M コアには SysTick というタイマが内蔵されてます。今回はこの SysTick タイマによる割り込みを受けて、タスクを切り替えられるようにしてみました。 SysTick タイマはリロード値から開始して 0 になるまでダウンカウントしていき、0…

軽量 RTOS の開発 (1)

OS ARM C

軽量 RTOS の開発メモを記録していきます。 以前考えたように、メモリ割り当てアルゴリズムは K&R malloc でも事足りそうなので、組み込んでみました。ちょっと違うのが、K&R ではヒープ領域が足りなくなったら sbrk で拡張してますが、軽量 RTOS では sbrk …