Repository navigation
reduceAVR
この文書は以下について記述している;
[reduceAVR] における Macro_API Micro_API の制約・差異・拡張
- reduceAVR
- ATtiny4/5/9/10 - SRAM 32byte
- ATtiny102/104 - SRAM 32byte
- ATtiny20/40 - NRND : 新規設計非推奨
以下は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> | ❌ |
Heap領域を実装する SRAM容量がないため new/delete メソッドは使用できない。
多くの関数は利用可能だが、crc計算関数については SRAM消費に伴う実行時制約がある。(SRAM残量に依存するので、使ってみなければわからない)
ハードウェア設計が異なるため使用できない。ATtiny102/104 については <TinyUART.h> が代替先となる。
自動的に <variant_macro_digital.h> で置き換えられる。
多くの派生メモリセクションは存在せず、無視されて.textあるいは.dataに強制配置される。
コード領域全体はメモリデータ空間内に全て見えているので.progmem、.rodataの使い分けは意識する必要がない。
(tinyAVR-0/1/2、megaAVR-0と同様)
SRAMが不足しているため、write、read、puts、ln および puts に全置換される場合の print、println だけが使用できる。
これらは ハードウェア設計が異なるため使用できない。
この機能は、<Arduino.h> で宣言される標準の reboot() (WEAK付き)関数を 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);
}ATtiny102/104専用の、単純な組込ハードウェア実装UART。
詳細は -> [reduceAVR] 単純な組込ハードウェア実装UARTの実演(ATtiny102/104専用)
標準の <api/macro_digital.h> を代替する(置換される)。variant別にファイル実体は異なる。
| Function | Comment |
|---|---|
| pinModeMacro | ✅ |
| digitalWriteMacro | ✅ |
| digitalReadMacro | ✅ |
| openDrainWriteMacro | ✅ LOW HIGH
|
❌ TOGGLE 使用不可 |
|
| pinControlRegister | ❌ |
| pinPosition | ✅ |
| pinBitmask | ✅ |
| portIntrruptVector | ✅ |
| portRegister | ✅ |
| vportRegister | ✅ |
<avr/io.h>に対して modernAVR に準じた記法の糖衣構文を提供する。
<Arduino.h>はENABLE_MACRO_APIが宣言済であれば既定でロードし、有効ならAVR_MODERNAVR_LIKE_REDUCEAVRが宣言される。
- 全機能が完全に機能する保証はない。随時改善されている。
多くは<avr/io.h>用の従来記述を混在できるが、以下の宣言については互換性がなく、修正されなければならない。
| Define | Rename | Device |
|---|---|---|
| ADC0 | ADCL0 | ATtiny4/5/9/10 |
- これは元々の
iotn10.h等の誤記に由来する。(データシートと IOヘッダファイルの記述が、一致していない)
-
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);Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/
Copyright (c) 2026 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/
multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)