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

不確定特異点

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

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 も被せられるようになって…

LTK でウィンドウを手前に表示する

LTK とは Tk ツールキットを Common Lisp から使えるようにしたものです。Tcl/Tk をベースにしているため、幅広い OS に対応していることや手軽に UI を作成できることが魅力です。Common Lisp でちょっとした GUI を作りたいときにも便利そうですね。 LTK …

Ubuntu 14.04.3 LTS に Chainer をインストールする

Deep learning のフレームワークである Chainer を試用してみたところ、サンプルの MNIST の学習に時間がかかりすぎて、これは CPU に計算させる代物ではないことを悟りました。そこで、GPU を使って計算するための環境を整えることにしました。 環境 CPU In…

学習とニューラルネットワーク (5)

ボルツマンマシン 今回はボルツマンマシンのシミュレーションを実装してみました。 Simple Boltzmann Machine Simulation エネルギー関数として を仮定すると、エネルギーの極小点は の 1 点になります。これを実際にシミュレーションにより再現できるかを見…

Python (NumPy) と Common Lisp (LLA) で行列積の実行速度を比較する

近年、機械学習や Deep Learning などのデータサイエンス分野を筆頭に数値計算の需要が高まってますが、その中でよく使われているのが Python の NumPy というライブラリです。NumPy を使うことで、動的で柔軟なスクリプト言語上で比較的高速に数値計算が可…

学習とニューラルネットワーク (4)

誤差逆伝播法 前回、入力層と出力層からなる、単一ニューロンによる関数近似を実装してみました。特定の関数はうまく近似できましたが、XOR のような関数は学習が収束せず、近似することができませんでした。 今回は中間層を加えてフィードフォワード型の 3 …

誤差逆伝播法を計算中(続き2)

誤差逆伝播法で学習ができるようになったのですが、コードが手元にないので載せられません。(涙)というわけで明日に持ち越し。 現状は入力層、中間層、出力層の 3 層からなる最も単純なネットワークで学習してますが、以下の make-network のような関数に…

誤差逆伝播法を計算中(続き)

やっとの計算ができた!何でこんなに苦戦してるんだろう。たった 40 行のルーチンの実装に 2 日かかっている、というか、ほとんどの時間、式をこねくり回してました。今なら誤差逆伝播の導出がスラスラできる気がする。 あとは勾配法で重みを更新すれば学習…

誤差逆伝播法を計算中

前回の続きを実装しているのですが、ニューラルネットワークの計算を順伝播も逆伝播も行列演算で書き直すことで形式的に整理するため、サンプルプログラムの行列版を実装中。逆伝播の計算が少しややこしい。

簡易的にコメントアウトする

コードの一部をコメントアウトしてプログラムの挙動を確認したい場合があります。コメントアウトするたびに真面目にコード編集していると面倒くさいので、C 言語だと #if 0 〜 #endif でコメントアウトするステートメントを囲い、#if 0 にしたり #if 1 にす…

5 分で書くパラメータ設定ルーチン

C

C言語でパラメータを設定するルーチンが欲しい、けれども、一時的な利用なので気合いの入ったのは要らない、というか適当でいいから早く動くものを!!という状況が発生したので、5 分で適当なパラメータ設定ルーチンを書いたのがこれ。 パラメータファイル…

vagrant up でタイムアウトする件

新しい PC に Vagrant をインストールしていたときにハマったお話。 vagrant up すると以下のようなメッセージが表示されたままになってしまいました。しばらく経つと終わるのですが、正常に起動できているはずもなく vagrant ssh してもウンスンなのです。 …

CODE COMPLETE(上)再読

WRITING SOLID CODE の再読が終わったので、続いて CODE COMPLETE に移ります。以前読んだので、再読になりますが、だいぶ時間が経って忘れているところがありそうなので、もう一度おさらいです。 Code Complete 第2版 上 完全なプログラミングを目指して作…

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

OS ARM C

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

リソースアクセスプロトコルのまとめ

OS

マルチタスク環境において複数のタスクがリソースを共有し合うと、 優先度逆転 デッドロック という問題が起こります。これらを解決するためのリソースアクセスプロトコルについて、代表的なものをまとめてみました。 Non-Preemptive Protocol (NPP) Highest…

2つのシーケンスをインターリーブする

例えば、以下のように 2 つのリストの要素を互い違いに組み替えたリストを作りたいとします。 (setf s1 '(1 2 3)) (setf s2 '(a b c)) (interleave s1 s2) ;=> (1 a 2 b 3 c) Common Lisp で書くとしたらどう書くのがシンプルなんだろう?専用の関数を定義せ…

軽量 RTOS の開発 (9)

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

軽量 RTOS の開発 (8)

OS ARM C

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

優先度逆転とかコンフィギュレータとか

OS

優先度逆転 セマフォ等の同期オブジェクトを使った場合に、優先度の高いタスクがそれよりも優先度の低いタスクに実行権を奪われて、本来の優先度が逆転してしまうという、同期機構による優先度逆転現象には古典的な回避アルゴリズムがあり、RTOS を作るから…

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 円と…

cl-lex と CL-Yacc で作る JSON パーサ

Common Lisp の lex/yacc ライブラリを探していたところ、cl-lex と CL-Yacc というそのものズバリのライブラリがありました。 cl-lex CL-Yacc 使い方を理解するために JSON パーサを書いてみました。JSON 文字列を読み込んで S 式に変換するだけです。jsown…

git stash が便利すぎた

Git

今まで使ってなかったんですが、作業中に commit してない状態で、一時的に作業内容を保存し、変更前の状態に戻したい場合に便利なのが git stash。 $ git stash これで現在のブランチが変更前の状態に戻ります。git stash はいくつも状態を保存できますが、…

軽量 RTOS の開発 (7)

OS ARM C

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

WRITING SOLID CODE

WRITING SOLID CODE という本を久しぶりに引っ張りだしてきました。ずいぶん昔の本でして、ずっと前に一度読みましたが、今読むとこれまでの経験に重ね合わせて、また違った視点が得られそうです。CODE COMPLETE みたいな内容ですが、こっちはもっとコーディ…

軽量 RTOS の開発 (6)

OS ARM C

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

静的ライブラリの作り方

C

例えば、次のような util.c と util.h をライブラリ化して外部のプログラムから利用することを想定します。 util.c #include <stdlib.h> /* 配列の平均値を返す */ double mean(double a[], size_t n) { int i; double s = 0; for (i = 0; i < n; i++) s += a[i]; retu</stdlib.h>…

軽量 RTOS の開発 (5)

OS ARM C

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

軽量 RTOS の開発 (4)

OS ARM C

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

μITRON と OSEK/VDX

OS

勉強のために既存の RTOS の仕様を確認しよう、というわけで、最近は μITRON と OSEK/VDX について調べてました。μITRON は対象となるシステム向けにプロファイルが規定されており、OSEK/VDX は車載システムに特化した RTOS です。なので、車載向けで比較し…

なぜ RTOS を使うのか?

OS

複数のコンテキストの独立性(保守性)と応答性を保つため、というのが現状の個人的な見解です。いま組み込み向けの OS のプロトタイプを実験的に作っているのですが、そもそもどういうときに OS が必要になるのか?という視点を忘れがちになりそうなので、…

Common Lisp の dpANS を読みやすくする

dpANS のドキュメントを読みやすくするために、A タグでリンクが張られているセクションの本文をすべて埋め込んで、ひとつの HTML にまとめあげるツールを作りました。実行には、あらかじめ SBCL と Quicklisp がインストールされていることが必要になります…

dpANS - the draft proposed ANSI Common Lisp standard

id:g000001 さんに HyperSpec の元になっている dpANS というものの存在を教えて頂きました。(ありがとうございます!) 早速内容を確認してみましたので紹介させて頂きます。 dpans2texi このサイトでは、ドラフト版の ANSI Common Lisp 標準のドキュメン…

Common Lisp の HyperSpec が読みづらい件について

Common Lisp の HyperSpec って何であんなに読みづらいんだろう、と感じるのは僕だけなのでしょうか。調べるキーワードがあらかじめわかっているなら良いのですが、そもそもキーワードがわからないときには、頭からざっと目を通したいものです。それができな…

Common Lisp でバイナリファイルの EOF 判定

ちょっと Common Lisp でバイナリファイルの入力で困ってます。ファイルをオープンしてストリームから read-byte で 1 バイトずつ入力しているときは、EOF にあたるとエラーを返すため、特に問題ないのですが、例えば 4 バイト単位で読んだときに、もしファ…

軽量 RTOS の開発 (3)

OS ARM C

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

軽量 RTOS の開発 (2)

OS ARM C

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

Git のリモートブランチ

Git

Git のリモートブランチに対する理解が足らずハマったのでメモ。例えばローカルの作業用に systick という名前のブランチを作ったとします。 $ git checkout -b systick そこでごにょごにょ作業してコミットします。 $ git commit -am 'Add a new feature' …

FPGA エクストリーム・コンピューティング

今日はFPGA エクストリーム・コンピューティング第 7 回の開催日だったのですが、抽選落ちしてからすっかり忘れてて、Twitter の TL で知って慌ててニコ生中継を見ていた次第です。どの発表も非常に興味深かったのですが、特に深層学習の講演がわかりやすく…

学習とニューラルネットワーク (3)

ニューロンを使った関数近似 前回使った勾配法をニューロンの学習に応用してみます。例として、2入力1出力の関数 f(x1, x2) を考え、これを単一のニューロンで近似することを考えます。f の入出力関係は以下のように6サンプル定義します。 入力値 : (0 1) (1…

学習とニューラルネットワーク (2)

勾配法 勾配法とは最適解をある関数の極値という形で求める手法です。関数 f(x) というのがあって、これの極小値を探索する場合、ある初期値 x0 から始めて、 のように x を次々と更新していきます。これ以上、x が変動しなくなったら、その時の x の値が求…

学習とニューラルネットワーク (1)

時代は知的情報処理です。というわけで、巷で噂の機械学習や深層学習の勉強を進めてます。そもそも機械学習や深層学習で何ができるのか?その限界は何か?このブームは一過性のものなのか?というあたりを見極められればよいと思ってます。(未だに深層学習…

軽量 RTOS の開発 (1)

OS ARM C

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

NaN Boxingというテクニックを知った

mruby のことを調べていたら NaN Boxing というテクニックを知りました。 主に言語処理系等において、整数やポインタや浮動小数点数等、様々な型のデータを一つのオブジェクトとして union で詰め込みたい場合があります。その際、そのオブジェクトがどうい…

mrubyをCortex-Mコア基板で動かしたい

職場の先輩が mruby の存在を教えてくれたのでちょっと調べてみることにしました。mruby は組み込み用途を意識してスクラッチから再実装した Ruby 処理系とのことです。 mruby/mrubygithub.com 使い方はいたって簡単で、GitHub から clone して make するだ…