モダンでC言語以上の記述力、Zen言語でLPC810のベアメタルエルチカに成功!
LPC810は、NXP社製Arm Cortex-M0アーキテクチャーの最大30MHz動作する32bit CPU、RAM1KB、ROM4KB。

こちら、プログラム boot.zen。マシン語版からの移植がスムーズかつ、可読性高い!

const SYSAHBCLKCTRL: u32 = 0x40048080; const FLASHCFG: u32 = 0x40040010; const PINENABLE0: u32 = 0x4000C1C0; const GPIO_DIR0: u32 = 0xA0002000; const GPIO_NOT0: u32 = 0xA0002300; const WAIT_CNT: u32 = 400000; export fn reset() noreturn { @intToPtr(*mut u32, SYSAHBCLKCTRL).* = 0b0011011001; // WKT:off, SCT:off, SWT, GPIO, I2C:off, FLASH, FLASHREG, RAM:off, ROM:off, SYS @intToPtr(*mut u32, FLASHCFG).* &= 0b11; // flash no wait: set 0b00 @intToPtr(*mut u32, PINENABLE0).* = 0xFFFFFFBF; @intToPtr(*mut u32, GPIO_DIR0).* = 0b1100; // PIO0_2 and PIO0_3 while (true) { @intToPtr(*mut volatile u32, GPIO_NOT0).* = 0b0100; // toggle PIO0_2, GND PIO0_3 var waitcnt = WAIT_CNT; while (waitcnt > 0) { asm volatile ("nop"); waitcnt -= 1; } } } export const RESET_VECTOR: fn () callconv(.C) noreturn linksection(".vector_table.reset_vector") = reset; export const DUMMY linksection(".dummy") = [5]u32 { 0, 0, 0, 0, 0 }; export const VALID_CODE: u32 linksection(".valid_code") = 0xEFFFFBDF; // 0x100000000-0x10000400-0x21

リンクスクリプト linker.ld とビルド用の Makefile を用意して、make、できあがり! サイズはたった96byte!ROM4KBの2.3%しか使ってません。マシン語もインラインでさらっと使える。(src on GitHub接続方法)


欲しかったZen言語の書籍「The Zen Book」と「Zenbedded」ゲット!
そういえば、Zen言語と、IchigoJam、両方色相環カラーリング。
色相環で光るネクタイ。Zen言語でパワーアップしよう!

links
- ごきげんよう、Zenへようこそ | Reduce your stress with the C language
- C言語よりコンパクトに! Zen言語開発者からのプルリクとマシン語の気持ち
- 言語づくりという解決手段、高速安全コンパクトなZen言語で簡単組み込み開発 on IchigoJam with zen4ij

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS