みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

NuttXでRAMLOG(dmesg)を使用する

はじめに

NuttXではデバッグログをRAMに出力することができる。 RAMに出力されたログデータはLinuxなどでおなじみのdmesgコマンドで表示することができる。

BluePillのようなRAMの少ない環境では活用は難しそうだが、STM32F4Discoveryくらい余裕のある環境であれば非常に便利。

ここではSTM32F4Discoveryの環境でRAMLOGを有効にする。

RAMLOG

usbnshとnshで有効にすべきコンフィグレーションが異なる。

usbnshでの設定

次の設定が必要となる。

CONFIG_RAMLOG=y
CONFIG_RAMLOG_CONSOLE_BUFSIZE=1024
CONFIG_RAMLOG_NONBLOCKING=y
CONFIG_RAMLOG_SYSLOG=y
#CONFIG_SYSLOG_CHAR undefined, else duplicate output with syslog_putc()

メニューコンフィグ

make menuconfigで設定する項目を示す。

CONFIG_RAMLOG

Device Drivers
  -> System Logging
    -> RAM log device support

CONFIG_RAMLOG_NONBLOCKING

Device Drivers
  -> System Logging
    -> RAM log device support
      -> RAMLOG non-block reads

CONFIG_RAMLOG_SYSLOG

Device Drivers
  -> System Logging
    -> System log device
      -> Use RAMLOG for SYSLOG

nshでの設定

次の設定が必要となる。

CONFIG_RAMLOG=y
CONFIG_RAMLOG_CONSOLE_BUFSIZE=1024
CONFIG_RAMLOG_CONSOLE=y
CONFIG_RAMLOG_SYSLOG=y
#CONFIG_SYSLOG_CHAR undefined, else duplicate output with syslog_putc()

メニューコンフィグ

make menuconfigで設定する項目を示す。

CONFIG_RAMLOG

Device Drivers
  -> System Logging
    -> RAM log device support

CONFIG_RAMLOG_CONSOLE

Device Drivers
  -> System Logging
    -> RAM log device support
      -> Use RAMLOG for /dev/console

CONFIG_RAMLOG_SYSLOG

Device Drivers
  -> System Logging
    -> System log device
      -> Use RAMLOG for SYSLOG

バッファサイズについて

RAMLOGのバッファはリングバッファで実装1されており、 バッファを使い切ると古いログは新しいログに上書きされる。

CONFIG_RAMLOG_CONSOLE_BUFSIZEのデフォルトは1024となっているが、 この程度のサイズだと、デバッグ時に見たいログがすぐに上書きされてしまう。

なのでCONFIG_RAMLOG_CONSOLE_BUFSIZEを8192くらいに増やしておく。

Device Drivers
  -> System Logging
    -> RAMLOG buffer size

デバッグログ有効化

必要に応じでデバッグログの機能を有効化する。

コンフィグレーション

例としてSchedulerのデバッグログを有効化する。

CONFIG_DEBUG_FEATURES=y
CONFIG_DEBUG_ERROR=y
CONFIG_DEBUG_WARN=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_SCHED=y
CONFIG_DEBUG_SCHED_ERROR=y
CONFIG_DEBUG_SCHED_WARN=y
CONFIG_DEBUG_SCHED_INFO=y

メニューコンフィグ

CONFIG_DEBUG_FEATURES

Build Setup
  -> Debug Options
    -> Enable Debug Features

CONFIG_DEBUG_ERROR

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Enable Error Output

CONFIG_DEBUG_WARN

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Enable Error Output
        -> Enable Warnings Output

CONFIG_DEBUG_INFO

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Enable Error Output
        -> Enable Warnings Output
          -> Enable Informational Debug Output

CONFIG_DEBUG_SCHED

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Scheduler Debug Features

CONFIG_DEBUG_SCHED_ERROR

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Scheduler Debug Features
        -> Scheduler Error Output

CONFIG_DEBUG_SHED_WARN

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Scheduler Debug Features
        -> Scheduler Warnings Output

CONFIG_DEBUG_SCHED_INFO

Build Setup
  -> Debug Options
    -> Enable Debug Features
      -> Scheduler Debug Features
        -> Scheduler Informational Output

動作確認

helpコマンドを実行してdmesgが有効化されていればOK。

NuttShell (NSH)
nsh> help
help usage:  help [-v] [<cmd>]

  [           cmp         exit        mb          pwd         time
  ?           dirname     false       mkdir       rm          true
  basename    dd          free        mh          rmdir       uname
  break       df          help        mount       set         umount
  cat         dmesg       hexdump     mv          sh          unset
  cd          echo        kill        mw          sleep       usleep
  cp          exec        ls          ps          test        xd

Builtin Apps:
nsh>

dmesgを実行してログが表示される事を確認。

nsh> dmesg
os_start: Entry
uart_register: Registering /dev/console
uart_register: Registering /dev/ttyS0
os_do_appstart: Starting init thread
os_start: CPU0: Beginning Idle Loop

Linuxとは異なり、一度実行されたログは再度コマンドを実行しても表示されなくなる。