Micro Standard Library

先日から、Stellarisローンチパッドで遊んでいます。Stellarisローンチパッドには、Stellaris Wareというライブラリ群がバンドルされているので、その使い方を調べていきます。今回はMicro Standard Libraryという、C標準ライブラリの非常に小さなサブセットです。含まれる関数は下のとおりで、標準ライブラリ関数の関数名の頭に u がついていて、仕様もおおよそ同じです。

  • ulocaltime
  • umktime
  • urand
  • usnprintf
  • usprintf
  • usrand
  • ustrcasecmp
  • ustrcmp
  • ustrlen
  • ustrncmp
  • ustrncpy
  • ustrnicmp
  • ustrstr
  • ustrtoul
  • uvsnprintf

ulocaltimeとumktimeがどう使えるのか気になるので、下のようなコードを書いてみました。そして、早速 umktime がバグってるのを見つけました。umktimeはtime_tを二分探索で見つけて返そうとしますが、エポック時刻(0)を渡すと、探索完了せず -1 が返ります。これについてはまた今度調べます。これ以外は期待動作しました。

#include "utils/ustdlib.h"

void main(void) {
    unsigned long ulValue;
    char pcBuffer[32] = "0x1";
    tTime sTime;

    ulValue = ustrtoul(pcBuffer, 0, 0);

    ulocaltime(ulValue, &sTime);

    usprintf(pcBuffer, "%02d:%02d", sTime.ucHour, sTime.ucMin);

    ulValue = umktime(&sTime) + 3600; // sTime が 1970-1-1 00:00:00 だと -1 返る

    ulocaltime(ulValue, &sTime);

    usnprintf(pcBuffer, 6, "%02d:%02dhoge", sTime.ucHour, sTime.ucMin);

    ulValue = ustrcmp(pcBuffer, "01:00");

    while(1) {}
}

ulocaltime、mktime は、バックアップ付き RTC でも乗ってないと、あまりうれしくないような気がしますね。そして、コードサイズは -O2 で 1480byte でした。余裕があれば使うけど、なくても良いという感じです。

                  00000000    000005ac     ustdlib.obj (.text)
                  00000900    0000001c     ustdlib.obj (.const)

次は、シリアル通信まわりを見ていきたいと思います。