Skip to content

reduceAVR

askn37 edited this page Sep 8, 2026 · 2 revisions

[reduceAVR] Macro/Micro_API 補足

この文書は以下について記述している;

[reduceAVR] における Macro_API Micro_API の制約・差異・拡張

対象AVR

  • reduceAVR
    • ATtiny4/5/9/10 - SRAM 32byte
    • ATtiny102/104 - SRAM 32byte
    • ATtiny20/40 - NRND : 新規設計非推奨

Micro/Micro_API 互換性

以下はreduceAVR/coreに標準で含まれる。

Header Function 制約
<Arduino.h> reboot ❌ 無限停止する -> <reboot.h>で代替
<new.h> ❌
<usrdef.h> ✅
<api/btools.h> ✅
<api/capsule.h> ✅
<api/delay_busywait.h> ✅
<api/HarfUART.h> ❌ -> <TinyUART.h>
<api/macro_api.h> ✅
<api/macro_digital.h> ❌ -> <variant_macro_digital.h>
<api/memspace.h> ✅
<api/Portmux.h> ❌
<api/power.h> ✅
<api/Print.h> ❌ -> write/read/putsのみ対応
<api/String.h> ✅
<api/TWIM.h> ❌
<api/UsartBaseClass.h> ❌

<new.h>

Heap領域を実装する SRAM容量がないため new/delete メソッドは使用できない。

<api/btools.h>

多くの関数は利用可能だが、crc計算関数については SRAM消費に伴う実行時制約がある。(SRAM残量に依存するので、使ってみなければわからない)

<api/HarfUART.h>

ハードウェア設計が異なるため使用できない。ATtiny102/104 については <TinyUART.h> が代替先となる。

<api/macro_digital.h>

自動的に <variant_macro_digital.h> で置き換えられる。

<api/memspace.h>

多くの派生メモリセクションは存在せず、無視されて.textあるいは.dataに強制配置される。 コード領域全体はメモリデータ空間内に全て見えているので.progmem、.rodataの使い分けは意識する必要がない。 (tinyAVR-0/1/2、megaAVR-0と同様)

<api/Print.h>

SRAMが不足しているため、write、read、puts、ln および puts に全置換される場合の print、println だけが使用できる。

<api/Portmux.h> <api/TWIM.h> <api/UsartBaseClass.h>

これらは ハードウェア設計が異なるため使用できない。

reduceAVR 固有の拡張

<reboot.h> [reduceAVR]

この機能は、<Arduino.h> で宣言される標準の reboot() (WEAK付き)関数を reduceAVR 用に置換する。

void reboot (void) [reduceAVR]

実装内容;最短サイクルで WDTリセットを実行する。

void reboot (void) {
  _PROTECTED_WRITE(WDT_CTRLA, WDT_SREN_bm | WDT_PERIOD_2CLK_gc);
  for (;;);
}

上記に連動して以下が自動で組み込まれる。これは MPU 起動の最も早い段階で、WDTリセットフラグを消去して、WDTを無効化する。

__attribute__((used, naked, section(".init1")))
void _DISABLE_WDT_ (void) {
  bit_clear(RSTCTRL_RSTFR, RSTCTRL_WDRF_bp);
  _PROTECTED_WRITE(WDT_CTRLA, 0);
}

<TinyUART.h> [reduceAVR]

ATtiny102/104専用の、単純な組込ハードウェア実装UART。

詳細は -> [reduceAVR] 単純な組込ハードウェア実装UARTの実演(ATtiny102/104専用)

<variant_macro_digital.h> [reduceAVR]

標準の <api/macro_digital.h> を代替する(置換される)。variant別にファイル実体は異なる。

Function Comment
pinModeMacro ✅
digitalWriteMacro ✅
digitalReadMacro ✅
openDrainWriteMacro ✅ LOW HIGH
❌ TOGGLE 使用不可
pinControlRegister ❌
pinPosition ✅
pinBitmask ✅
portIntrruptVector ✅
portRegister ✅
vportRegister ✅

<variant_io.h> [reduceAVR]

<avr/io.h>に対して modernAVR に準じた記法の糖衣構文を提供する。

<Arduino.h>はENABLE_MACRO_APIが宣言済であれば既定でロードし、有効ならAVR_MODERNAVR_LIKE_REDUCEAVRが宣言される。

  • 全機能が完全に機能する保証はない。随時改善されている。

<avr/io.h> 非互換性

多くは<avr/io.h>用の従来記述を混在できるが、以下の宣言については互換性がなく、修正されなければならない。

Define Rename Device
ADC0 ADCL0 ATtiny4/5/9/10
  • これは元々のiotn10.h等の誤記に由来する。(データシートと IOヘッダファイルの記述が、一致していない)

modernAVR 版との相違

  • PORTx については、VPORTx (等価の別名)を代わりに使用する。あるいはPORTx_XXX形式で記述する。
  /* PORTB |= _BM(PORTB0); */
- PORTB.OUT |= PIN_PB0_bm;
+ VPORTB.OUT |= PIN_PB0_bm;

  /* DDRB |= _BV(DDB0); */
- PORTB.DIR |= PIN_PB0_bm;
+ PORTB_DIR |= PIN_PB0_bm;

単独のポート初期化はpinModeMacroの使用を推奨。

  • portRegisterとvportRegisterは等価の別名。

  • PULLUPのレジスター設定方法が異なる。

- pinControlRegister(PIN_PB3) = PORT_PULLUPEN_bm;
+ portRegister(PIN_PB3).PUB |= pinBitmask(PIN_PB3);

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally