ぐだぐだ低レベルプログラミング(27) IARのIDEでArmのアセンブラを

JosephHalfmoon
Joseph Halfmoon

以下の投稿にてNuvoton社の古めの評価ボードNUC120をIAR社の環境で動かすことに成功したのでした。かなりトラブッたあげく。

鳥なき里のマイコン屋(104) Nuvoton、NUC120 Lチカへの遠い道

が、しかし、予想以上に無料評価版ソフトの容量制限キツイです。調子にのって色々周辺回路を動かしてみるつもりだったですが容量辛い。この環境をどう「活用」したものか?

容量制限を実感したのは、Lチカの後、uartドライバを組み込み、printfを使ってみた時です。printfがとても重い関数だ、というのは分かっておりました。昔は、printfといいつつ、「そうじゃない」似て非なるものを組み込んで使ったりしておったものです。が、このところ、Flash容量に余裕のあるマイコンばかり使っていたせいか、printf(モドキといってもかなり良いもの)できるのが当然になっていました。

printf組み込んだだけで容量制限に引っかかりました。

微妙な線なので、押したり引いたりすれば入らない事もないかもと思いつつ、肝心の他のモノは入らないこと必定。これでは周辺回路をビシビシ使うようなコードは書きづらいです。どうしたものか。

「ぐだぐだ低レベルプログラミング」の題材にすればいいんじゃね。

このところ、RISC-Vのアセンブラ関係ばかりだったので、たまにArmも混ぜるのが良いかもしれない。比較もできるし。特にアセンブラのお勉強用であれば、大したコード量も必要としないので、容量制限も気にならない。そして、Nuvoton社Nu-linkのお陰で、アセンブラレベルでもデバッグできる筈。

早速、Lチカのプロジェクトにアセンブラの小さなソースを1個加えてみることにいたします。IAR社のEmbedded WorkbenchもIAR Assemblerも使うのは初めてですが、あまり障害は感じませぬ。なんといっても、

IAR社環境は日本語ドキュメント付属

であります。淡々と読み進めればよろしい(といって、拾い読みだけど。)

また、Armのアセンブラ、とくにNUC120のコアである Cortex-M0のことなどすっかり忘却の彼方だったんでありますが、これまた、

Arm社は日本語ドキュメントあり

ということで不便感じず。

とりあえずアセンブラで足し算をやる「関数」を書いて、ビルドし、デバッガでステップ実行してみる、ことにいたします。まず、Cのメインルーチンでアセンブラ関数を呼ぶためのヘッダを書きました。こんな感じ。ASM_HEADER

さて、実体のアセンブラ関数を書きます。(こちらの画面はアセンブラ関数をステップ実行しているときの画面なので、「現在地」で緑色になっております。)ASM

IAR社のArm用アセンブラは、Arm社のアセンブラとは疑似命令など異なるようなので、そのつもりで書かないとなりません。上のコードで私が引っかかったのは、SECTIONのところですかね。まあ、.textセクションに以下を配置せよ、ということは分かる。でも

その後の:CODE:NOROOT(2)って何?

まあ、日本語ドキュメントを紐解けば、セクションのタイプにはCODEとかDATAとかありと書かれており、また、ROOTとあればリンクされなくても削除されないけれど、NOROOTならリンクされなければ消えるとか、(2)はアライメントであるらしいとか、いろいろ分かってまいります。後、アセンブラそのものは、Arm社の「クイックリファレンス」見ながら書けば良いっと。

しかしRISC-Vの1枚ペラ紙のクイックリファレンスに比べると、Armのは長く感じます。Armってこんな複雑だったんだっけ。だいたいM0はArmv7どころかv6だったんだよね。

それに、ArmのDeveloperサイトでArmのABIを調べてみると、とてもレジスタの数が少なく感じます。ああ、引数用のレジスタは、R0, R1, R2, R3の4本で、戻り値がR0。基本引数用のレジスタをテンポラリレジスタに使えってことかい。RISC-Vの32本が懐かしいな。。。

たまに違うCPUを使うと、あれこれ気付きがあります。さて、Cのメイン関数はこちら。ちょうどアセンブラ関数の呼び出しのところにブレークポイント置いて止まったところ。

MAIN

関数の中に分け入るために、逆アセンブラのウインドウを開いてみます。

DISASMちょうど、そのアセンブラ関数への引数をレジスタにロードするところで止まっています。

REGレジスタウインドウを開けばこんな感じ。まだR0,R1には値がロードされていない。ステップ実行していけば、ちゃんと期待通りにレジスタが書き換わって行きまする。

インストールできたのはIAR社の大分古い(10年近く前)のツールだけれども、十分楽ちんです。Nuvoton NUC120も古いチップだけれども、Armマイコンのベーシックなところを練習するにはいい感じじゃね。

「ぐだぐだ」は、当分RISC-VのGD32VF103と、Arm M0のNuvoton NUC120のチャンポンで、いろいろ比較しながら、という感じで行きたいと思います。IAR社のEWARMのライセンスが切れなければ。

ぐだぐだ低レベルプログラミング(26) タイマ割り込みをかけながら に戻る