RP2040(Raspberry Pi Pico) - RustでUART出力
Raspberry Pi Pico(RasPico)上で、Rustを使ってUART出力をする方法。
プログラム関係のブログはここに
Raspberry Pi Pico(RasPico)上で、Rustを使ってUART出力をする方法。
RustのコードからARM(thuumb2)のインライン・アセンブラを扱う方法は、ズバリの情報が少なかった。この記事が一助となれば嬉しい。 日本語の場合はRust by Exampleが一次情報となるだろう。
長くなりすぎたので分割された、前の記事の後半。本記事では自作ブートローダを実装するときに固有の技術について説明する。前半では、RP2040のRustでのテンプレートプロジェクトやboot2 bootloaderについて解説している。
この冬のプロジェクトとして、手元にあったRaspberry Pi Pico(RasPico)のボード上で動くブートローダをRustで作ってみた。RasPicoで使われているRP2040というMCU特有の事情もあるし、低レイヤーRustで役にたつ知識も得ることができる、楽しいプロジェクトだった。GitHubのレポジトリ(https://github.com/nkon/boot-k)を参照しつつ、知見をまとめておこう。
プロジェクト・テンプレートどおりに使う場合はcargo run
すれば内部でprobe-rs
が使われ、コマンドとして意識することはすくない。
しかし、直接、コマンドを実行することで、細かな操作を行うことができる。
ただし、ドキュメントは不足しているので必要に応じてソースを見る必要がある。
昔は組み込み=Cという感じだったが、2023年現在に、組み込み(ベアメタル)プログラミングを試してみるのであればRust+Raspberry Pi Picoの組み合わせが良いだろう。理由はいろいろあるが、1:クロスコンパイラの導入が楽。WindowsでもMacでもLinuxでも、クロスプラットフォームで楽。2:ボード、クレート(HAL)、デバッガなどの情報が豊富で、みな同じ構成を使っており選択に迷いがない。3:Rustは素晴らしいシステムプログラミング言語であり、あと数年すれば仕事で書く場合でもRust>Cとなるだろう。いまから取り組んで、Rustの概念、作法に慣れておくのがよい。残念ながらCでやることになったとしてもRust的な考え方は絶対に役に立つ。
LLVMプロジェクトが出している静的解析ツールclang-tidy
のおすすめの設定項目を紹介する。とくに組み込み分野でのCでの使用にフォーカスた設定であり、アプリケーション分野、C++での使用には適さないかもしれないのでご注意いただきたい。
ネットで勧められていた『低レベルプログラミング』を例題を解きながら読みすすめていた。 本書は、x86_64 + Linuxの環境でアセンブラとCを使って低レイヤーのプログラミングをする教科書。 これがわかれば、だいたい中級だと思う。本書の環境はLinuxベースだが、紹介されているテクニックはCortex-M+baremetal組み込みでも十分役に立つと思う。
別記事にあるように『低レベルプログラミング』という本を履修。この本はx86_64とUbuntuの環境が前提となっている。今のパソコンはM2 Macbook Air。エミューレーション環境を構築する必要がある。そのような用途にはLimaが好適。インストールは簡単で情報は豊富。この記事は2022年末時点での情報に基づくインストールメモ。
新しいマシンを買ったら定番の初期設定が必要だ。仮想環境の普及で、買わずとも新しい仮想マシンを立ち上げる機会が増える。OSのバージョンアップにも付き合っていかなければならない。新しい環境の障壁を下げるために「デフォルトで使う」派もある。しかし、「簡単に初期設定をできるように工夫する」派があってもいいだろう。Unix系のツールはホームディレクトリのファイルで初期設定を行う。設定GUIが付いていても、人間が読めるファイルに保存されることが多い。そういうツールはファイルをコピーするだけで設定がコピーできる。vscodeなどは、自身で設定をクラウドに持っておくこともできる。しかし、そうでなツールも、設定ファイルをGitHubにおいておけばgit clone
するだけで、ほぼ同等だ。
流行りの画像生成AI, Stable Diffusion をローカルで実行してみる。手元の環境はM2 MacBook Air。通常、AIの実行にはnVidiaのGPUが業界標準となっているが、Stable DiffusionはMacのGPU(MPS)へのポートが進められており、MacでもGPUを使って実行できる。
シェルのプロンプトの設定は、凝ろうと思ったら無限に時間が消費される。2022年時点、最も現代的でおすすめできる方法が StarShip だ。 従来、プロンプトの設定は環境変数やシェル関数などを組み合わせて、ググりながら暗号的なコードと格闘しなければならなかった。 StarShipはプロンプトの生成をRust製の実行ファイルに一任し、それ設定ファイルはTOMLファイルに抽象化されている。 クロスプラットフォーム(LinuxでもMacでもWindowsでも)、マルチシェル(zsh, fish, windows-power-shell, …)対応。 Nerd Font(Powerline font)を使ったカラフルな表示や現代的な機能にも、もちろん対応している。
GitHubにRustのプロジェクトをアップしていると、依存しているライブラリ(直接だけでなくその先も)をボットが自動でチェックして、セキュリティ的な問題があると警告メールを送ってくる。それだけでなく、言われるがままにポチポチしていくと、修正のプルリクエストを作成してマージして完了。なにこれ、すごい。
『ゼロからのOS自作入門』(通称「Mikan本」)を購入して履修した。 本書はUEFI+x86_64で動作するOS(MikanOS)をC++を使って自作するための教科書・チュートリアルである。 昔、『30日でできる!OS自作入門』という「はりぼてOS」を作る本があったが、環境が古くなったので、本書の著者が新しい環境に適応して新規に書き下ろしたもの。
組込用BootloaderのひとつとしてMCUBootがある。いくつかのMCUやROTSがサポートしているが日本語の記事は少ない。以下はCypreessのModusToolBoxでサポートしているMCUBootを使ってみたまとめである。MCUBootを使ってみようと思う方の参考になれば幸いだ。
Rustでインタプリタを製作したときの設計メモ。主要部は、トークン化後に手書きの再帰降順パーサでASTを作り評価機でそれを評価するという良くある構成。Rustでの設計に特徴がある点(文字列の取り扱い、Enumの活用、MoveとBorrow、タプルによる複数値返し、など)についての解説。
CLI(command line interface)ツールはRustでも力を入れてりるターゲット。RustはLLVMをバックエンドとしているし、ライブラリも抽象化されている。GUIを扱わない範囲ではWindows/Linux/Macを対象とした移植性があるCLIツールを書きやすい。さらにGitHubではActionを用いたビルドファーム(テストも)がOSSでは利用可能だ。ソースからビルドではなく、多環境向けのバイナリをGitHub Actionsでビルドしてバイナリ配布するための設定について述べる。
この冬もコロナで篭もることになりそうだ。関数電卓作成のプロジェクトを行っている。プロジェクトの説明、設計や実装については別途記事にしたいと考えているが、現時点では執筆中だ。一方、最近、他人のコーディング動画を見る機会があった。私の職場にはペアプログラミングの習慣はないので、他人のコーディングを見る機会は少なかったが、動画からは、記事だけでは伝わらない・ナルホドと関心する点が多かった。自分もコーディング動画を配信すれば、コーディングの進め方やツールの使い方などで参考にしていただけることもあるだろう。
コロナ・引きこもり記事の第3弾。引きこもり期間中に新しいことにトライしようと思ってFirebase+Vue.jsでアプリを作ってみた。もうすこしブラッシュアップしてから公開しようと思っていたのだが、他の活動が忙しくなってしまい、時期を逃してしまいそうだ。改善の余地は多いがポストしておこう。
コロナ・引きこもり記事の第二弾。たぶん、もうじき新しいファームウェアプロジェクトを担当してもらうであろう職場の同僚氏に向けて書いた記事なのだが、果たして読んでくれるだろうか。
ここの記事を更新するのは約1年ぶり。夏の間は遊んでいたり秋からは仕事が忙しくなったりの近況だった。 コロナウィルスで自宅に閉じ込められてしまったので、プログラミングの練習のためにテキストエディタを作ってみた。 得られた知見などを紹介しよう。
最近、コンパイラを書くことが流行っているようだ。流行に乗ってやってみたらいろいろな知見が得られたので紹介したい。
最近、コンパイラを作ろうとチャレンジしている。コンパイラは基本的にアセンブラコードを出力する。その結果が意図通りに動いてテストに通れば良いが、開発中はそうならない。このアセンブラ出力が意図どおりかどうかをデバッグすることになる。ただし、コンパイラが自作でヘボいので、それが出力するアセンブラは、ソースコードデバッグができない。デバッグ情報が無い実行ファイルをデバッグするのと同じ状況になる。そんな状況でよく使う gdb コマンドをまとめた。あんまり細工していない、素のgdbコマンドを使う助けになると思う。
これは unix のシェル環境である fish を紹介する記事だ。 Ubuntu では標準のシェルは bash であるが、快適な環境を求める人は zsh を使うことが多い。 zsh は多機能で快適だが設定に手間がかかる。 ついつい、設定に力が入ってしまい「奥が深い」症候群になってしまうこともあるだろう。このへん、Emacs に似ている。 そんなところをリセットして新しくて、標準でも使いやすく、設定もしやすい fish を使って環境構築をしたメモである。
仕事で、実験用に外へつながったサーバが必要になった。 しかし、いろいろ手続きが大変なので、とりあえず自分のアカウントで作業することにした。 ウェブを探しても、この進歩が早い世の中で、古い記事が混じっていたりする。 自分の作業メモを兼ねて、現時点でのはじめ方をまとめておこう。
センサからの信号を処理する時など、ノイズ低減の目的で移動平均フィルタを使うことがある。 アルゴリズムが理解しやすく(平均は小学生でもわかる)、実装が簡単で(コツもあるが)、ある程度の効果もある。 しかし、大学ではFIRなどのフィルタを習う。どっちがいいのだろうか?Jupyter Notebook の結果を GitHub Pages に貼る実験も兼ねて計算してみた。
NumWorksというフランスのメーカが、新しい電卓を発売した。 コンピュータがこれだけ普及しているのに「いまさら電卓なんて」という声がほとんどだと思う。しかし、次の特徴を知れば興味を持つ方もいるだろう。
この Blog は GitHub Pages と、その上でホスティングされている Jekyll を使って作成されている。その仕組みの延長で、スライドを作成し公開する方法についてまとめる。
Rust embedded 界の第一人者である japaric さんの提唱する RTFM 及び cortex-rt などのフレームワークについての自習記録。日本語の記事が少なかったし、私自身は STM32CubeMXとの連携を模索していて方向が違っていたのであまりトレースしていなかった。しかし、@tatsuya6502さんの良記事を見かけ、改めて興味をもってやってみた。
rust で標準的に使われるツールや便利なツールの使い方を、毎回検索しなくても済むように備忘録的にまとめる。
Python初心者がアプリを作ったときに引っかかったことをメモしておく。
GPD Pocket を購入したので設定メモ。Windows10を使うのも初めてということもあり、前半はGPD Pocket 特有の話も書いてあるが、後半はWindows10の環境構築の話がメインになってしまった。
この記事では、rust を使ってCortex-Mの上で直接(ベアメタルで)動作するプログラムの作り方を説明する。全部を自前で書くのではなく、STが提供する CubeMX といったツールや HAL を有効活用することを基本方針とする。
AIでいろいろ遊んで見るために、まずは環境構築する。
プログラミング関係のブログを GitHub Pages を使って作成しよう。方法はいくつかある。
Next you can update your site name, avatar and other options using the _config.yml file in the root of your repository (shown below).