kubo39's blog

ただの雑記です。

STM32F3DISCOVERYをD言語から動かすライブラリを書いている

https://github.com/kubo39/stm32f3discovery で開発中です。LDC前提。とりあえずのLチカと例外のハンドリングとかくらいしかない。

Lチカのプログラムはこんな感じの抽象度で書けます。

import stm32f3discovery;

import led;

extern(C):
@nogc:
nothrow:

void main()
{
    pragma(LDC_never_inline);

    initLED();

    auto ticks = 100000;

    while (true)
    {
        foreach (led; LEDS)
        {
            led.on;
            delay(ticks);
            led.off();
            delay(ticks);
        }
    }
}

void delay(uint n)
{
    pragma(LDC_never_inline);

    foreach (_; 0 .. n)
    {
        // nop
    }
}

作り途中なので課題はまだまだありますが、とりあえず見えてる範囲だと

  • 実装量が全然足りてない(タイマーとかusartとか追加していく)
  • モジュール構成がいけてない
  • 内部の抽象化がまだまだきれいになってない(生ポインタでやってたり)
  • パッケージングどうするか(dubが貧弱に感じてるのでMakefileにしてるけど別によかったのかもしれない)
  • ARM Cortex-Mで共通のものはさらにライブラリとしてくくりだしたい

とかです。

こういうことをやってるとグローバルな変数参照しようとしてlibcの __tls_get_addr を参照しようとしてリンクエラーになったり、extern(D) void mainにしてて_Dmainとして扱われて死亡したりD言語特有の現象に遭遇して詳しくなれたりするようなしないような気がします。

他にあとD言語のいいところ、、

  • C言語との連携
  • @nogcやnothrowのチェックがある
  • Cよりずっとstrictな型検査
  • typeofとか使うと便利

今のところこのへんですかね。