2023年7月31日月曜日

[RasberryPi Pico W] Debian on VirtualBox on Windows の環境で CLionを使う

Debian on VirtualBox on Windows の環境でRasberryPi Pico Wの開発環境を作った。

使用したソフトウェアのバージョンと機器は以下の通り。

  • Windows 11
  • VirtualBox 7.10
  • Debian 12.1
  • CLion 2023.2
  • Debug probe 
  • RasberryPi Pico W

VitualBoxを使うのは、Windows環境を汚さないためである。

CLionでコードを書き、ビルドしてRasberryPi Pico Wにプログラムをアップロードし実行する。デバッガも使えることを確認した。

基本的な設定手順

Raspberry Pi本家サイトに Raspberry Pi Picoをセットアップしようというドキュメントがあるので、それに従えばよい。
ファイルはRaspberry Pi Datasheetsにある。
直接リンクはこちら
第章 1. Pico のクイックセットアップ
第章 2. SDK
第章 3. C 言語で LED を点滅させる
第章 4. C 言語で「Hello World」というテキストを表示する
第章 5. SWD を使用してフラッシュプログラミングを行う
第章 6. SWD を使用してデバッグを行う

お好みに応じて3章、4章をやりつつ6章のGDBが動くことが確認できればOK。

注意点をいくつか。

(1)USBデバイスの認識
マシンに接続したあとに、VirtualBoxのUSBデバイスフィルターの設定画面で認識したデバイスを追加すること。追加しないとDebian側では認識しない。

注意点: 追加後、一度抜き差ししないと認識しなかったかも?
認識したかの確認は dmesgコマンドか lsusbコマンドを使えばよい。

(2)Debug probeのUARTの接続
TX-RX, RX-TX とクロス接続する。

(3)Hello, world送信のシリアル接続の確認
gihyo.jpのサイト(以下の参考を参照)では picocomを使っていたので、同様に使ってみた。
dialoutグループに所属しないとsudoを使わなければならないので注意。
# piccomインストール
$ sudo apt install picocom
# dialoutグループに追加
$ sudo usermod -a -G dialout $USER
# 通信確認
$ picocom /dev/ttyACM0 -b 115200

Debug probe経由では私の環境では /dev/ttyACM1 となったかな?

(4)cmakeで Pico Wの指定

cmake -DPICO_BOARD=pico_w .. 

デバッグ版でビルドする場合

cmake -DPICO_BOARD=pico_w -DCMAKE_BUILD_TYPE=Debug ..

Debug probe

付録 A: Picoprobeを使用する - OpenOCDのビルド に従いOpenOCDをインストールする。
./configure にはオプション不要。

(1)プログラムの転送
blick.elfファイルの転送例
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000" -c "program blink.elf verify reset exit"
(2)デバッグ時
sudo openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"

Pico WでのLチカ

Wifiモジュール経由でLEDが接続されているようで Picoのように単純にはLチカできないようだった。
外部LEDなら簡単なので、次のような回路でLチカした。

 


プログラムこちら。
#include "pico/stdlib.h"

void init_led_pin(const uint pin) {
    gpio_init(pin);
    gpio_set_dir(pin, GPIO_OUT);
}

int main() {
    const uint LED_RED_PIN = 21;
    const uint LED_GREEN_PIN = 20;
    init_led_pin(LED_RED_PIN);
    init_led_pin(LED_GREEN_PIN);
    const uint sleep_time_ms = 500;
    while (true) {
        gpio_put(LED_RED_PIN, 1);
        sleep_ms(sleep_time_ms);
        gpio_put(LED_RED_PIN, 0);
        sleep_ms(sleep_time_ms);
        gpio_put(LED_GREEN_PIN, 1);
        sleep_ms(sleep_time_ms);
        gpio_put(LED_GREEN_PIN, 0);
        sleep_ms(sleep_time_ms);
    }
}


 CLionの設定

上記ドキュメントの 
第章 10. 別の統合開発環境を使用する 
10.2. CLion を使用する
に従う。
pico-examplesにあるプログラムが一通りビルドできるはず。

デバッガの設定

Settings - Embedded Development
OpenOCD Locationに /usr/local/bin/openocd を設定する。
実行プログラムの設定
Run/Debug Configurations でスクリリーンショットのように設定
※Board config fileに ~/pico-debug.cfg を設定したが、これが具体的に何を意味するのかはまだ分かっていない。
→正しいパスは /home/satoshi/pico/openocd/tcl/board/pico-debug.cfg

デバッグモードでの実行例
少し遅いがブレークポイントで止まり、ステップ実行できることは確認した。
Linux機で新しい開発環境を作って気がついた。
上の手順だけではデバッグ時に
Error: unable to find a matching CMSIS-DAP device
が出てしまいデバッガが起動できない。バイナリも転送できない。
openocdが参照するデバイスの権限の問題のようだ。
以下の設定をすればよい。
/etc/udev/rules.d ディレクトリに以下のファイルを作る。
❯ cat 99-debugprobe.rules 
# Raspberry Pi Pico
ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="[01]*", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"

# CMSIS-DAP compatible adapters ◆こちらの設定は不要かも?コメントアウトした。
#ATTRS{product}=="*CMSIS-DAP*", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1", ENV{ID_MM_PORT_IGNORE}="1"
設定を反映する。
sudo udevadm trigger

これにより openocdコマンドはsudo不要となり、CLionからも扱えるようになった。 
以前の環境ではPlatformIOも使おうとしていてudevの設定をしていたのをすっかり忘れていた。

2021年10月1日金曜日

[Debian]AwesomeでSSD(NVMe)とCPUの温度表示

引き続きDebianを入れたASUS PN50のAwesome Window Managerのステタースバー表示を設定。

SSD(NVMe)とCPUの温度表示を追加した。

こうなった。

SSD(NVMe)とCPUの温度表示

ソースこちら。


compo_temp_widget = wibox.widget.textbox()
vicious.register(compo_temp_widget, vicious.widgets.hwmontemp, " $1°C" .. status_sep, 5, {"nvme"})

cpu_temp_widget =  wibox.widget.textbox()
vicious.register(cpu_temp_widget, vicious.widgets.hwmontemp, " $1°C" .. status_sep, 5, {"k10temp", 1})

温度監視対象の名称は /sys/bus/pci/drivers 配下の名称を指定する。

参考

vicious.widgets.hwmontemp


2021年9月30日木曜日

[Debian]Awesome Window ManagerでCPUの稼働状況をカラフルに表示する

Debianを入れたASUS PN50はRyzen 4700Uで、CPUコアが8個ある。 Awesome Window Managerを使っているのだけど、それぞれのコアの稼働状況がカラフルに見られると楽しいのでスクリプトを書いてみた。
負荷が高くなるほど赤くなるようにした。 負荷をかけるとピコピコ表示が変わるので良い感じ。

ステータスバー

ソースはこちら。
Lua言語は初めて使ったので、rc.lua内で使われていたfunction, if, return くらいしか知らないのですごく冗長。

  vicious = require('vicious')
-- cpu widget
cpuwidget = wibox.widget.textbox()

function load_color(rate)
    local color
    if rate >= 80 then
        colro = "#FF0000"
    elseif rate >= 70 then
        color = "#FF4000"
    elseif rate >= 60 then
        color = "#FF8000"
    elseif rate >= 50 then
        color = "#FFBF00"
    elseif rate >= 40 then
        color = "#FFFF00"
    elseif rate >= 30 then
        color = "#BFFF00"
    elseif rate >= 20 then
        color = "#80FF00"
    elseif rate >= 10 then
        color = "#40FF00"
    else
        color = "#0000FF"
    end
    return color
end

function load_html(rate)
    local color = load_color(rate)
    return string.format('<span bgcolor="%s">%d</span>', color, rate)
end

vicious.register(cpuwidget, vicious.widgets.cpu,
                 function(widget, args)
                     local all = args[1]
                     local cpu1 = args[2]
                     local cpu2 = args[3]
                     local cpu3 = args[4]
                     local cpu4 = args[5]
                     local cpu5 = args[6]
                     local cpu6 = args[7]
                     local cpu7 = args[8]
                     local cpu8 = args[9]
                     return string.format('<span color="#cccccc"> | </span>CPU <span color="#cccccc">%s (%s %s %s %s %s %s %s %s)</span><span color="#cccccc"> | </span>',
                                          load_html(all),
                                          load_html(cpu1), load_html(cpu2), load_html(cpu3), load_html(cpu4),
                                          load_html(cpu5), load_html(cpu6), load_html(cpu7), load_html(cpu8))
                 end)
  

2021年9月29日水曜日

[Debian]xrdpでキーボードレイアウトが日本語になってしまう

引き続きASUS Mini PC PN50 (Ryzen 4700U)にDebianをインストールして環境構築中。

HHKBを使っているが、xrdpを利用しリモートデスクトップで接続した場合に、キーボードのレイアウトが日本語(jp)になっていた。

次のコマンドで英語(us)レイアウトに変更できるが、リモートデスクトップに接続しなおすと、jpに戻ってしまう。

$ setxkbmap -layout us

なんとかならんのかと、/etc/xrdp 配下を眺めてみると、reconnectwm.shがあり、コメントの通りにコマンドを追加したところ、再接続してもレイアウトはusのままとなった。

#!/bin/sh

# Write procedures here you want to execute on reconnect

setxkbmap -layout us 

これで解決。


[Debian]xrdpでawesomeを利用できない

ASUS Mini PC PN50 (Ryzen 4700U)にDebianをインストールして環境構築中。

ディスプレイとキーボードを接続せずに、xrdpをインストールしてリモートデスクトップ経由で使えるようにした。

いつもWindow managerにはawesomeを利用しているので、今回もインストールしたのだけど、XFce4を先にインストールしたら、リモートデスクトップ経由では常にXFce4になり、awesomeを使うことができなくなってしまった。

$ sudo update-alternatives --install /usr/bin/x-window-manager x-window-manager /usr/bin/awesome 70

でXFce4よりも優先度を上げてみたりしたが切り替えることができなかった。

仕方がないので/etc/xrdp配下のファイルを眺めていたら、startwm.shなるファイルを発見。
このファイルの下のほうを次のように awesome固定で起動するようにしたら、awesomeが使えるようになった。

/etc/xrdp/startwm.sh

# comment out (2 lines)
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession

# add
if test -r $HOME/.xsessionrc; then
	. $HOME/.xsessionrc
fi
exec /usr/bin/awesome

いったんはこれで良し。


2021年9月25日土曜日

[Emacs]#BEGIN_SRC,#END_SRCを入力するELisp

 org mode使っていて、コードを囲う#BEGIN_SRC,#END_SRCをいちいち入力するの面倒だなと思っていたのだけど、数年越しでやっとつくった。さっさと作っておけば良かった。

何てことないコードだけどペタっとな。

(defun org-util-insert-source-section ()
  (interactive)
  (beginning-of-line)
  (insert "#+BEGIN_SRC\n")
  (insert "#+END_SRC\n")
  (forward-line -1))

(global-set-key (kbd "C-x 5 s") 'org-util-insert-source-section)

コードの通り、C-x 5 s に割り当てた。


2021年9月20日月曜日

[OCaml]merlinが参照するcmiファイルの自動更新

OCamlの開発環境として Emacs + Merlin + Tuareg を使用しているが、自ファイル以外のモジュールを参照するためには、cmiファイルを生成しなければならなかった。

dune を使用していれば、プロジェクトディレクトリ配下で

$ dune build @check

を実行すれば生成されるのだけど、ファイルの更新でいちいちこれを実行するのは面倒なのでスクリプトを作成した。

Linuxはファイル更新の検知に inotifywaitコマンドがあるのでそれを利用した。
inotifywaitコマンドはinotify-toolsパッケージにあるのでインストールしておく。

$ sudo apt install inotify-tools

スクリプトはこちら。

dune_build_check.sh

#!/usr/bin/env bash

# for test
#set -euo pipefail

USAGE(){
    echo "usage: dune_build_check.sh <dir>"
    exit 1
}

[ "$#" -eq 0 ] && USAGE >&2

cd "$1"

while : ; do
    result=$(find -type f -name '*.ml' -o -name '*.mli' | xargs inotifywait -q -e modify)
    if [ $? -eq 0 ]; then
        echo "$result"
        dune build @check
    fi
done

duneコマンド実行後に、再度、監視対象とするmlファイル、mliファイルを取り直しているので、新規ファイル追加時は既存ファイルを一度編集すればよい。

自動でやってくれるようなオプションがduneにありそうに思ったが無さそうだった。

参考