不確定特異点

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

C

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

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

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

C

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

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

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 リージョンに割り当…

軽量 RTOS の開発 (7)

OS ARM C

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

軽量 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() によりイベントをセットしま…

軽量 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 …

連結リストの操作にダブルポインタを使う

連結リスト(Linked List)を使って要素を昇順に並べて管理したいとします。通常は以下のコードのように、リストの先頭を示す要素を用意することで、リストがNULLのときも、そうでない場合も、場合分けをせずに実装することが可能です。 #include <stdio.h> #include <stdlib.h> t</stdlib.h></stdio.h>…