Slide 1

Slide 1 text

一夜漬けULP アセンブラでM5StickCをLチカ

Slide 2

Slide 2 text

たなかまさゆき •M5StickCを中心に ブログを書いてます https://lang-ship.com/blog/

Slide 3

Slide 3 text

ULPとは? •Ultra Low Powerの略 •ESP32のコプロセッサー •アセンブラでプログラム •GPIOとI2Cアクセスが可能 https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/ulp.html

Slide 4

Slide 4 text

一夜漬け? •『一夜漬けCASL』 •非常にわかりやす い入門書 •すでに絶版 https://www.amazon.co.jp/dp/484431100X

Slide 5

Slide 5 text

ULPとCASLの違い •CASLより命令が少ない XOR, PUSH, CALL... •常に符号あり(Logical Shift?) •スタックがない •使っている人がほぼいない

Slide 6

Slide 6 text

ULPのコーディング方法 •ESP-IDF •Arduino IDE+ビルドツール •Arduino IDEでマクロ https://github.com/duff2013/ulptool

Slide 7

Slide 7 text

マクロの制約 •すべての命令が利用できない •JUMPが分裂(6種類に) •変数管理が自前に •ADCとI2Cが使えない?

Slide 8

Slide 8 text

ライブラリ作成しました •ESP32 ULP Debugger https://github.com/tanakamasayuki/UlpDebug

Slide 9

Slide 9 text

変数確保(enum) // Slow memory variable assignment enum { SLOW_BLINK_STATE, // Blink status SLOW_PROG_ADDR // Program start address };

Slide 10

Slide 10 text

初期化 // Slow memory initialization memset(RTC_SLOW_MEM, 0, 8000); // Blink status initialization RTC_SLOW_MEM[SLOW_BLINK_STATE] = 0;

Slide 11

Slide 11 text

ULP実行 size_t size = sizeof(ulp_prog) / sizeof(ulp_insn_t); ulp_process_macros_and_load( SLOW_PROG_ADDR, ulp_prog, &size); ulp_run(SLOW_PROG_ADDR);

Slide 12

Slide 12 text

ULPプログラム1 const ulp_insn_t ulp_prog[] = { I_MOVI(R3, SLOW_BLINK_STATE), // R3 = SLOW_BLINK_STATE I_LD(R0, R3, 0), // R0 =MEM[R3] M_BL(1, 1), // IF R0 < 1 THAN GOTO M_LABEL(1)

Slide 13

Slide 13 text

ULPプログラム2 // R0 < 1 : run M_LABEL(1), // M_LABEL(1) I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 0), // pin_blink_bit = 0 I_MOVI(R0, 1), // R0 = 1 I_ST(R0, R3, 0), // MEM[R3] = R0

Slide 14

Slide 14 text

ULPプログラム3 I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_HALT() // Stop the program

Slide 15

Slide 15 text

まとめ •実用的に使うには敷居が高い •ESP S2ではULPからRISC-V •アセンブラ入門にはおすすめ •Webアセンブラ作って配列を 貼り付ければいいのでは?