Skip to content

AVR_LIBC_Header

askn37 edited this page Sep 10, 2026 · 5 revisions

AVR-LIBC ヘッダーファイル要約

include パス構造

  • toolchain/avr/include/avr/include/ -- AVR-LIBC 修正ライブラリ
  • toolchain/avr/include/avr/include/avr/ -- AVR8 依存 HAL
  • toolchain/lib/gcc/avr/<ver>/include/ -- C標準 サブセット
    • toolchain/lib/gcc/avr/<ver>/include-fixed/ -- C標準 修正(コンパイラが自動処理する)

<avr/io.h>

  • 依存性:(同時に導入される)<avr/sfr_defs.h> <avr/portpins.h> <avr/common.h> <avr/version.h> <avr/fuse.h> <avr/lock.h> (必要なら)<avr/xmega.h>

デバイスセットアップヘッダーファイル。-mmcu=XXX から導かれる _AVR_IOXXX_H_ の示す真のデバイス初期化ヘッダーファイルを読み込む。アセンブリ.Sからでも導入できる。

classicAVR 以前と、modernAVR 以降では、デバイス情報定義の構造が全く異なる。

modernAVR 以降では、以下の宣言も含まれる。(<avr/common.h> より先に)

  • スタックポインタ: SP SPL SPH
  • ステータスレジスタ: SREG
  • 特殊レジスタ:CCP (存在するなら) RAMPZ
  • マクロ関数:(必要なら)_WORDREGISTER(regname) _DWORDREGISTER(regname)

<avr/boot.h>

  • 依存性:<avr/io.h> <inttypes.h> <limits.h> <avr/eeprom.h>

classicAVR 用のブートローダー作成ユーティリティー。modernAVR では使用できない。

<avr/builtins.h>

  • 依存性:なし

以下の extern 関数が宣言されている。 GCCビルトイン関数の同名機能を、他のビルド環境でも使えるようにする。

  • void __builtin_avr_sei(void)
  • void __builtin_avr_cli(void)
  • void __builtin_avr_sleep(void)
  • void __builtin_avr_wdr(void)
  • unsigned char __builtin_avr_swap(unsigned char)
  • unsigned int __builtin_avr_fmul(unsigned char, unsigned char)
  • int __builtin_avr_fmuls(char, char)
  • int __builtin_avr_fmulsu(char, unsigned char)
  • void __builtin_avr_delay_cycles(unsigned long)

ここには __builtin_avr_nop()、__builtin_avr_nops(n) は含まれない。

<avr/common.h>

  • <avr/io.h> で読み込まれる。アセンブラ.Sでも使用可能。

多用する IOレジスタの番地や、ビットフラグに名前をつける。

  • スタックポインタ: SP SPL SPH
  • ステータスレジスタ: SREG
  • ステータスフラグ:SREG_C SREG_Z SREG_N SREG_V SREG_S SREG_H SREG_T SREG_I
    • これらはビット番号で宣言されているので、適宜_BV()で括って使用する。
  • 特殊レジスタ:(存在するなら)EIND RAMPD RAMPX RAMPY RAMPZ
  • アセンブリ汎用レジスタ:(R26〜31の別名)XL XH YL YH ZL ZH

<avr/cpufunc.h>

  • 依存性:<stdint.h>

CPU 関係マクロ関数。

  • (macro) _NOP()
    • __asm__ __volatile__("nop") や __builtin_avr_nop() に等価。
  • (macro) _MemoryBarrier()
    • __asm__ __volatile__("":::"memory") に等価。
    • コンパイラの最適化を一部制約し、命令の実行順序を守らせる働きを持つ。
    • IOレジスタ操作順序や、volatile 変数の更新順序を変えさせないために使用する。
#include <avr/io.h>
#include <avr/cpufunc.h> /* _MemoryBarrier() に必要 */

void my_function(void) {
  // 何らかの処理
  _MemoryBarrier(); /* この前後のコンパイラの並べ替え移動を阻止(可能なら) */
  // 以降の処理
}

<avr/crc16.h> → <util/crc16.h>

(移動)CRC計算ユーティリティ。

<avr/delay.h> → <util/delay.h>

(移動)割込を使わない遅延関数ユーティリティ。

<avr/eeprom.h>

  • 依存性:<avr/io.h> <stddef.h> <stdint.h>

EEPROM 操作関数。

  • (attribute) EEMEM - .eeprom メモリセクション属性
  • (macro) eeprom_is_ready()
  • (macro) eeprom_busy_wait()
  • uint8_t eeprom_read_byte (const uint8_t *)
  • uint16_t eeprom_read_word (const uint16_t *)
  • uint32_t eeprom_read_dword (const uint32_t *)
  • float eeprom_read_float (const float *)
  • void eeprom_read_block (void *, const void *, size_t)
  • void eeprom_write_byte (uint8_t *, uint8_t)
  • void eeprom_write_word (uint16_t *, uint16_t)
  • void eeprom_write_dword (uint32_t *, uint32_t)
  • void eeprom_write_float (float *, float)
  • void eeprom_write_block (const void *, void *, size_t)
  • void eeprom_update_byte (uint8_t *, uint8_t)
  • void eeprom_update_word (uint16_t *, uint16_t)
  • void eeprom_update_dword (uint32_t *, uint32_t)
  • void eeprom_update_float (float *, float)
  • void eeprom_update_block (const void *, void *, size_t)
  • (macro) _EEPUT(addr, val) → eeprom_write_byte(addr, val)
  • (macro) _EEGET(var, addr) → (var) = eeprom_read_byte(addr)

<avr/fuse.h>

  • <avr/io.h> で読み込まれる。
  • 依存性:なし

FUSE 関係のメモリセクションや初期値を定義する。

  • FUSES 構造体を初期化し、.fuseメモリセクションを書き出して FUSE 初期化ファイルを作成するために必要。
  • しかし reduceAVR 系では機能しない。MZP-SDK [reduceAVR] で補完される。

<avr/interrupt.h>

  • 依存性:<avr/io.h>

割込ベクタと割込制御関係。

  • (macro) sei()

    • __asm__ __volatile__ ("sei" ::: "memory") に等価。
    • SREG に SREG_I をセットし、一般割込を許可。
  • (macro) cli()

    • __asm__ __volatile__ ("cli" ::: "memory") に等価。
    • SREG から SREG_I をクリアし、一般割込を禁止。
    • NMI 強制割込は禁止できない。
    • modernAVRの場合、不可視の"真の"グローバル割込フラグはreti(ISRエピローグで暗黙のうちに実行される)でのみクリアできる。
    • 故にそのままでは ISR 割込ベクタ内で sei を実行しても効果を発揮しない。→ ISR_NOBLOCK
  • (macro) reti()

    • __asm__ __volatile__ ("reti") に等価。
    • ISR 割込ベクタ を途中で抜ける時に、return に代えて使用する。

割込関数関係

  • (macro) ISR(vector, ...)
    • 割込ベクタ関数宣言。vectorは_AVR_IOXXX_H_に記載の割込ベクタ名。... は追加の任意個の属性フラグ。
    • ISR_BLOCK - 省略時の既定の属性。
    • ISR_NOBLOCK - ISRプロローグ先頭でSREG_Iフラグをセットする。つまり多重割込を許しうる。通常は使用しない。modernAVR では額面通りには動作しない。
    • ISR_NAKED - プロローグとエピローグを挿入しない。汎用レジスタは退避されず、retiも書かれない。通常は使用しない。
    • ISR_ALIASOF(target_vector) - ベクタを target_vector に別名置換する。
  • (macro) EMPTY_INTERRUPT(vector)
    • 単に reti() を実行するだけの空ベクタを宣言する。
  • (macro) ISR_ALIAS(vector, target_vector)
    • ISR(vector, ISR_ALIASOF(target_vector)) と等価。

<avr/lock.h>

  • <avr/io.h> 読み込まれる。
  • 依存性:なし

LOCK 関係のメモリセクションや初期値を定義する。modernAVR では使用しない。

<avr/parity.h> → <util/parity.h>

(移動)パリティ関係ユーティリティ。

<avr/pgmspace.h>

  • 依存性:<avr/io.h> <stddef.h> <inttypes.h>

プログラムスペースユーティリティ。標準Cライブラリ関数に_Pまたは_PFを付けた関数が多数ある。

  • (attribute) PROGMEM メモリ属性
    • __attribute__((__progmem__)) に等価
  • 型宣言:prog_void prog_char prog_uchar prog_int8_t prog_uint8_t prog_int16_t prog_uint16_t prog_int32_t prog_uint32_t prog_int64_t prog_uint64_t
  • (typedef) PGM_P - const char * - ショートカット
  • (typedef) PGM_VOID_P - const void * - ショートカット
  • (macro) PSTR(s) - static const char [] PROGMEM - ポインタ関数
  • uint8_t pgm_read_byte_near(address_short)
  • uint16_t pgm_read_word_near(address_short)
  • uint32_t pgm_read_dword_near(address_short)
  • float pgm_read_float_near(address_short)
  • uint16_t pgm_read_ptr_near(address_short)
  • uint8_t pgm_read_byte_far(address_long)
  • uint16_t pgm_read_word_far(address_long)
  • uint32_t pgm_read_dword_far(address_long)
  • float pgm_read_float_far(address_long)
  • uint16_t pgm_read_ptr_far(address_short)
  • uint8_t pgm_read_byte(address_short) → pgm_read_byte_near
  • uint16_t pgm_read_word(address_short) → pgm_read_word_near
  • uint32_t pgm_read_dword(address_short) → pgm_read_dword_near
  • float pgm_read_float(address_short) → pgm_read_float_near
  • uint16_t pgm_read_ptr(address_short) → pgm_read_ptr
  • uint32_t pgm_get_far_address(var)
  • const void * memchr_P(const void *, int, size_t)
  • int memcmp_P(const void *, const void *, size_t)
  • void * memccpy_P(void *, const void *, int, size_t)
  • void * memcpy_P(void *, const void *, size_t)
  • void * memmem_P(const void *, size_t, const void *, size_t)
  • void * memrchr_P(const void *, int, size_t)
  • char * strcat_P(char *, const char *)
  • const char * strchr_P(const char *, int)
  • const char * strchrnul_P(const char *, int)
  • int strcmp_P(const char *, const char *)
  • char * strcpy_P(char *, const char *)
  • int strcasecmp_P(const char *, const char *)
  • char * strcasestr_P(const char *, const char *)
  • size_t strcspn_P(const char *, const char *)
  • size_t strlcat_P(char *, const char *, size_t)
  • size_t strlcpy_P(char *, const char *, size_t)
  • size_t strnlen_P(const char *, size_t)
  • int strncmp_P(const char *, const char *, size_t)
  • int strncasecmp_P(const char *, const char *, size_t)
  • char * strncat_P(char *, const char *, size_t)
  • char * strncpy_P(char *, const char *, size_t)
  • char * strpbrk_P(const char *, const char *)
  • const char * strrchr_P(const char *, int)
  • char * strsep_P(char **, const char *)
  • size_t strspn_P(const char *, const char *)
  • char * strstr_P(const char *, const char *)
  • char * strtok_P(char *, const char *)
  • char * strtok_rP(char *, const char *, char **)
  • size_t strlen_PF(uint_farptr_t)
  • size_t strnlen_PF(uint_farptr_t, size_t)
  • void * memcpy_PF(void *, uint_farptr_t, size_t)
  • char * strcpy_PF(char *, uint_farptr_t)
  • char * strncpy_PF(char *, uint_farptr_t, size_t)
  • char * strcat_PF(char *, uint_farptr_t)
  • size_t strlcat_PF(char *, uint_farptr_t, size_t)
  • char * strncat_PF(char *, uint_farptr_t, size_t)
  • int strcmp_PF(const char *, uint_farptr_t)
  • int strncmp_PF(const char *, uint_farptr_t, size_t)
  • int strcasecmp_PF(const char *, uint_farptr_t)
  • int strncasecmp_PF(const char *, uint_farptr_t, size_t)
  • char * strstr_PF(const char *, uint_farptr_t)
  • size_t strlcpy_PF(char *, uint_farptr_t, size_t)
  • int memcmp_PF(const void *, uint_farptr_t, size_t)
  • static inline size_t strlen_P(const char *)

<avr/portpins.h>

  • <avr/io.h> で読み込まれる。
  • 依存性:なし

主に classicAVR 系 Xmega 属用の、Pxn<->PORTxn(例:PA0<->PORTA0)を生成するマクロファイル。 modernAVR では使用しない。

対象 AVR 群以外に対しても強制的に実行されうるため、ある意味余計な事をされてしまう。このマクロファイルの存在により PORTn DDn PINn PORTxn といった一般名称の使用には制約が課される。

<avr/power.h>

  • 依存性:<avr/io.h> <stdint.h>

classicAVR、regendAVR 用の 電力制御関連ユーティリティ。 modernAVR では使用しない。

<avr/str_defs.h>

  • <avr/io.h> で読み込まれる。
  • 依存性:なし

AVR-LIBC で多用するマクロユーティリティ。

  • (macro) _BV(bit)
    • (1 << (bit)) に同じ。→ 0x80 == _BV(7)
  • (define) _VECTOR(N)
    • __vector_N というラベルに変換する。つまり ISR()割込ベクタの第一引数を生成する。指定可能な N は _AVR_IOXXX_H_ で定義されている。
  • (macro) bit_is_set(sfr, bit)
    • (str | _BV(bit)) に同じ。
    • bit_set(sfr, bit)はない。→ MacroMicroAPI (core) で拡張実装
  • (macro) bit_is_clear(sfr, bit)
    • (str & _BV(bit)) に同じ。
    • bit_clear(sfr, bit)はない。→ MacroMicroAPI (core) で拡張実装
  • (macro) loop_until_bit_is_set(sfr, bit)
    • while (str & _BV(bit)) に同じ。
    • str に bit がセットされるまでループする。従って str は一般に、IOレジスタである。
  • (macro) loop_until_bit_is_clear(sfr, bit)
    • while (str | _BV(bit)) に同じ。
    • str から bit がクリアされるまでループする。従って str は一般に、IOレジスタである。

<avr/signal.h> → <avr/interrupt.h>

(廃止)<avr/interrupt.h>で代替された。

<avr/signature.h>

  • 依存性:<avr/io.h>

シグネチャーユーティリティ。インクルードすると const unsigned char __signature[3] が .signature メモリセクションに初期化済で宣言され、シグネチャー情報が ファイル書き出しが可能になる。

<avr/sleep.h>

  • 依存性:<avr/io.h> <stdint.h>

休止制御ユーティリティ。-mmcu=XXX に応じて以下のマクロ関数がセットアップされる。

  • (macro) set_sleep_mode(mode) - 指定可能な 休止 mode は <avr/io.h> で宣言される
    • SLEEP_MODE_ADC - classicAVR、reduceAVR で、可能な品種のみ
    • SLEEP_MODE_IDLE - CPUのみを休止する(modernAVR では、ほぼこれで十分)
    • SLEEP_MODE_PWR_DOWN - MPU 全機能休止
    • SLEEP_MODE_STANDBY - 個別に除外された機能を除いて全休止(既定状態の modernAVR では、PWR_DOWNと等価)
  • (macro) sleep_enable() - 休止制御器を有効化
  • (macro) sleep_cpu() - 休止状態へ移行(既定は普通IDLE)
  • (macro) sleep_disable() - 休止制御器を無効化
  • (macro) sleep_mode() - 上記の3関数を順に実行する
  • (macro) sleep_bod_disable() - (classicAVR で可能なら)休止時の BOD を無効化

<avr/version.h>

  • <avr/io.h> で読み込まれる。
  • 依存性:なし

AVR-LIBC の版番号を示すマクロ定数を宣言する。以下は一例。

  • (define) __AVR_LIBC_VERSION_STRING__ "2.0.0"
  • (define) __AVR_LIBC_VERSION__ 20000UL
  • (define) __AVR_LIBC_DATE_STRING__ "20150208"
  • (define) __AVR_LIBC_DATE_ 20150208UL
  • (define) __AVR_LIBC_MAJOR__ 2
  • (define) __AVR_LIBC_MINOR__ 0
  • (define)__AVR_LIBC_REVISION__ 0

<avr/wdt.h>

  • 依存性:<avr/io.h> <stdint.h>

WDT機能ユーティリティ。-mmcu=XXX に応じて実装内容は異なる。

  • (macro) wdt_enable(timeout)
    • (classicAVR)
      • WDTO_[15|30|60|120|250|500]MS
      • WDTO_[1|2]S
    • (modernAVR)
      • WDT_PERIOD_[8|16|32|64|128|256|512]CLK_gc
      • WDT_PERIOD_[1|2|4|8]KCLK_gc
  • (macro) wdt_disable()
  • (macro) wdt_reset()
    • __asm__ __volatile__ ("wdr") に等価

modernAVR は、WDT=1024 Hz(なので 8K=8.192s)
ただし AVR-SD は、WDT=32768 Hz(なので 8K=250ms)

<avr/xmega.h>

  • 依存性:なし

  • <avr/io.h> で読み込まれる。(modernAVR も)

Xmega 属用の 構成設定保護(CCP)された IOレジスタ更新ユーティリティ

  • (macro) _PROTECTED_WRITE(reg, value)
    • CCP保護された IOレジスタに value を書く
  • (macro) _PROTECTED_WRITE_SPM(reg, value)
    • SPM保護された IOレジスタに value を書く(NVMCTRL用)

前者は特別に有用なので、MZP-SDK [reduceAVR] にも移植されている。
後者は主にブートローダーで使われる。

<util/atomic.h>

  • 依存性:<avr/io.h> <avr/interrupt.h>

アトミックバリアーユーティリティ。ブロック突入前に SREG_I を保存し、ブロック先頭に指定の命令を挿入し、ブロック終了時に保存した SREG_I を復元する。

/* 割込許可不明 */
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  /* 割込禁止処理 */
  NONATOMIC_BLOCK(NONATOMIC_RESTORESTATE) {
    /* この間だけ、一時的に割込許可 */
  }
  /* 割込禁止処理 */
}
/* 割込許可不明 */
  • (macro) ATOMIC_BLOCK(type) - アトミック性ブロック
    • ATOMIC_RESTORESTATE - cli() を挿入(SREG_Iクリア:割込禁止)
    • ATOMIC_FORCEON - 以前の SREG_I を復元しない
  • (macro) NONATOMIC_BLOCK(type) - 非アトミック性ブロック
    • NONATOMIC_RESTORESTATE - sei() を挿入(SREG_Iセット:割込許可)
    • NONATOMIC_FORCEOFF - 以前の SREG_I を復元しない

<util/crc16.h>

  • 依存性:<stdint.h>

CRC計算ユーティリティ。MacroMicroAPI (core) で機能拡張。

  • uint16_t _crc16_update(uint16_t, uint8_t)
  • uint16_t _crc_xmodem_update(uint16_t, uint8_t)
  • uint16_t _crc_ccitt_update(uint16_t, uint8_t)
  • uint16_t _crc_ibutton_update(uint16_t, uint8_t)
  • uint16_t _crc8_ccitt_update(uint16_t, uint8_t)

<util/delay_basic.h>

  • 依存性:<inttypes.h>

単純遅延関数。

  • void _delay_loop_1(uint8_t)
    • 3 CPUクロック毎ループ(0指定は 256ループ)
  • void _delay_loop_2(uint16_t)
    • 4 CPUサイクル毎ループ(0指定は 65536ループ)

<util/delay.h>

  • 依存性:<inttypes.h> <util/delay_basic.h> <math.h>

遅延関数。事前にF_CPUの定義が必要。引数は float/double 型で与える。

  • void _delay_ms(double)
  • void _delay_us(double)

このファイルは度々修正/変更されており、AVR-LIBC バージョン依存動作をする。
通常の AVR-GCC は、doble == float 精度。この精度落ちのために意図した動作をしない場合がありうる。
(精度落ちしない)整数指定型は MacroMicroAPI (core) で機能実装。

<util/eu_dst.h>

  • 依存性:<time.h> <inttypes.h>

欧州連合(EU)向けサマータイム補正関数。メンテナンスされていないため、試験的。

  • int eu_dst (const time_t *, int32_t *)

<util/parity.h>

  • 依存性:なし

パリティ計算関数。

  • (macro) parity_even_bit(val)
    • val に含まれる 1のビット量を数えて奇数なら 真

GCC拡張 __builtin_popcount(x) としていることは同じ。

<util/setbaud.h>

  • 依存性:事前にF_CPUとBAUDの定義が必要。

classicAVR 用のボーレート(12-bit 精度)演算マクロ。 modernAVR では使用できない。

#include <avr/io.h>
#define F_CPU 4000000
static void
uart_9600(void) {
  #define BAUD 9600
  #include <util/setbaud.h>
  UBRRH = UBRRH_VALUE;
  UBRRL = UBRRL_VALUE;
#if USE_2X
  UCSRA |= (1 << U2X);
#else
  UCSRA &= ~(1 << U2X);
#endif
}

<util/twi.h>

  • 依存性:<avr/io.h>

classicAVR 用の I2C 関連ユーティリティ。 modernAVR では使用できない。

<util/usa_dst.h>

  • 依存性:<time.h> <inttypes.h>

米国(USA)向けサマータイム補正関数。メンテナンスされていないため、試験的。

  • int usa_dst (const time_t *, int32_t *)

<alloca.h>

  • 依存性:<stddef.h>

AVR-LIBC修正 alloca 関数インポート。

  • void * alloca (size_t)
    • __builtin_alloca(size) に等価。

<assert.h>

  • 依存性:<stdlib.h>

AVR-LIBC修正 assert マクロ関数インポート。

  • (macro) assert(e)
    • (通常)e式が偽ならabort()を実行。
    • (NDEBUG定義済)なにもしない。
    • (__ASSERT_USE_STDERR定義済)e式が偽なら void __assert(__func__, __FILE__, __LINE__, #e)を実行。

AVR-GCC では実装先がないので、実行時には単に割込禁止で無限ループ停止。

<ctype.h>

  • 依存性:なし

AVR-LIBC修正 キャラクタ文字判定/変換関数。引数はいずれもint型だが、char文字を格納して渡す。(つまり int read()と対応している)

  • int isalnum (int)
  • int isalpha (int)
  • int isascii (int)
  • int isblank (int)
  • int iscntrl (int)
  • int isdigit (int)
  • int isgraph (int)
  • int islower (int)
  • int isprint (int)
  • int ispunct (int)
  • int isspace (int)
  • int isupper (int)
  • int isxdigit (int)
  • int toascii (int)
  • int tolower (int)
  • int toupper (int)

<errno.h>

  • 依存性:なし

AVR-LIBC修正 エラー番号ユーティリティ。 <stdio.h>と合わせて使用する。

<fcntl.h> → <sys/types.h>

(代替)AVR-LIBC修正 ファイル制御関数。 <stdio.h>と合わせて使用する。

<inttypes.h>

  • 依存性:<stdint.h>

AVR-LIBC修正 整数マクロ定義。 printf引数型等が定義されている。 <stdio.h>と合わせて使用する。

<local.h>

AVR-LIBC修正 ロケール定義ファイル。 <stdio.h>と合わせて使用する。

<math.h>

  • 依存性:なし

AVR-LIBC修正 数学関数およびマクロ定数宣言。 ポインタ参照を含まない関数のほとんどは、いずれもコンパイル時点で静的に結果が定まるなら、単純定数に置換される。プリプロセッサ時点でも最適化除去されうる。

  • double cos (double)
  • double sin (double)
  • double tan (double)
  • double fabs (double)
  • double fmod (double, double)
  • double modf (double, double *)
  • float modff (float, float *)
  • double sqrt (double)
  • float sqrtf (float)
  • double cbrt (double)
  • double hypot (double, double)
  • double square (double)
  • double floor (double)
  • double ceil (double)
  • double frexp (double, int *)
  • double ldexp (double, int)
  • double exp (double)
  • double cosh (double)
  • double sinh (double)
  • double tanh (double)
  • double acos (double)
  • double asin (double)
  • double atan (double)
  • double atan2 (double, double)
  • double log (double)
  • double log10 (double)
  • double pow (double, double)
  • int isnan (double)
  • int isinf (double)
  • int isfinite (double)
  • double copysign (double, double)
  • int signbit (double)
  • int signbitf (double)
  • double fdim (double, double)
  • float fdimf (float, float)
  • double fma (double, double, double)
  • float fmaf (float, float, float)
  • double fmax (double, double)
  • float fmaxf (float, float)
  • double fmin (double, double)
  • float fminf (float, float)
  • double trunc (double)
  • float truncf (float)
  • double round (double)
  • float roundf (float)
  • long lround (double)
  • long lroundf (float)
  • long lrint (double)
  • long lrintf (float)

AVR-GCC では、float型関数はdouble型からの単なるマクロ別名になっている。

<setjmp.h>

  • 依存性:なし

広域跳躍関数。

  • int setjmp(jmp_buf)
  • void longjmp(jmp_buf, int)

<signal.h>

  • 依存性:なし

AVR-LIBC修正 シグナル関数の偽装実装。 libstdc++ v3 のプリコンパイル済ヘッダファイルのビルドを通すためにある。

<stdfix-avrlibc.h>

  • 依存性:なし

組み込みC言語における固定小数点数サポートのための avr-libc 補足ファイル。 単に<stdfix.h>を使用するよう促される。(代替しない)

<stdint.h>

  • 依存性:なし

AVR-LIBC修正 変数型宣言ヘッダファイル。 それぞれの型の上限/下限を示すマクロ定数も宣言される。 charからlong long intまでが対応範囲で、網羅的に対応する別名をtypedefする。

size_t は <stddef.h> を参照。(しなければint相当になりうる)
time_t は <time.h> を参照。(しなければint相当になりうる)

<stdio.h>

  • 依存性:<inttypes.h> <stdarg.h> <stddef.h>

AVR-LIBC修正 IOユーティリティ。 IOストリーム関数等を定義している。 しかし通常は STDIN/OUT/ERR 実体がないため機能しない。 拡張された _P付き関数はプログラムメモリー型(.text.rodataセクション)に対応している。

ファイルハンドル関連関数は、printfの再実装等で次のように使用する。

/* Print クラスでの実装例 */
#include <stdio.h>
#include <stdlib.h>

static int _printf_putchar (char _c, FILE *_fp) {
  return ((class Print *)(fdev_get_udata(_fp)))->write((uint8_t) _c);
}

Print& Print::printf (const char *_format, ...) {
  FILE _fp;
  va_list _ap;
  fdev_setup_stream(&_fp, _printf_putchar, NULL, _FDEV_SETUP_WRITE);
  fdev_set_udata(&_fp, this);
  va_start(_ap, _format);
  vfprintf(&_fp, _format, _ap);
  return *this;
}

// class PGM_t; /* typedef がわりの識別用空クラス */
// #define F(pmem_str) (reinterpret_cast<const PGM_t *>(PSTR(pmem_str)))
Print& Print::printf (const PGM_t *_format, ...) {
  FILE _fp;
  va_list _ap;
  fdev_setup_stream(&_fp, printf_putchar, NULL, _FDEV_SETUP_WRITE);
  fdev_set_udata(&_fp, this);
  va_start(_ap, _format);
  vfprintf_P(&_fp, (const char *) _format, _ap);
  return *this;
}
  • (define) EOF
  • (define) _FDEV_SETUP_READ
  • (define) _FDEV_SETUP_WRITE
  • (define) _FDEV_SETUP_RW
  • (define) _FDEV_ERR
  • (define) _FDEV_EOF
  • typedef fpos_t - long long
  • struct FILE
    • FILEハンドル構造体定義(ファイルハンドルintとは違う)
  • (macro) stdin() - FILEハンドル0を指すマクロ
  • (macro) stdout() - FILEハンドル1を指すマクロ
  • (macro) stderr() - FILEハンドル2を指すマクロ
  • (macro) fdev_set_udata(stream, u)
  • (macro) fdev_get_udata(stream)
  • (macro) fdev_setup_stream(stream, put, get, rwflag) - FILEハンドルの実行時初期化
  • (macro) FDEV_SETUP_STREAM(put, get, rwflag) - C++での静的初期化→FILE _myfh FDEV_SETUP_STREAM(...)
  • FILE * fdevopen (&put_char, &get_char)
  • int fclose (FILE *)
  • (macro) fdev_close ()
  • int vfprintf (FILE *, const char *, va_list)
  • int vfprintf_P (FILE *, const char *, va_list)
  • int fputc (int, FILE *)
  • int putc (int, FILE *)
  • int putchar (int)
  • int printf (const char *, ...)
  • int printf_P (const char *, ...)
  • int vprintf (const char *, va_list)
  • int sprintf (char *, const char *, ...)
  • int sprintf_P (char *, const char *, ...)
  • int snprintf (char *, size_t, const char *, ...)
  • int vsprintf (char *, const char *, va_list)
  • int vsprintf_P (char *, const char *, va_list)
  • int vsnprintf (char *, size_t, const char *, va_list)
  • int vsnprintf_P (char *, size_t, const char *, va_list)
  • int fprintf (FILE *, const char *, ...)
  • int fprintf_P (FILE *, const char *, ...)
  • int fputs (const char *, FILE *)
  • int fputs_P (const char *, FILE *)
  • int puts (const char *)
  • int puts_P (const char *)
  • size_t fwrite (const void *, size_t, size_t, FILE *)
  • int fgetc (FILE *)
  • int getc (FILE *)
  • int getchar (void)
  • int ungetc (int, FILE *)
  • char * fgets (char *, int, FILE *)
  • char * gets (char *)
  • size_t fread (void *, size_t, size_t, FILE *)
  • void clearerr (FILE *)
  • int feof (FILE *)
  • int ferror (FILE *)
  • int vfscanf (FILE *, const char *, va_list)
  • int vfscanf_P (FILE *, const char *, va_list)
  • int fscanf (FILE *, const char *, ...)
  • int fscanf_P (FILE *, const char *, ...)
  • int scanf (const char *, ...)
  • int scanf_P (const char *, ...)
  • int vscanf (const char *, va_list)
  • int vscanf_P (const char *, va_list)
  • int sscanf (const char *, const char *, ...)
  • int sscanf_P (const char *, const char *, ...)
  • int fgetpos (FILE *, fpos_t *)
  • FILE * fopen (const char *, const char *)
  • FILE * freopen (const char *, const char *, FILE *)
  • FILE * fdoen (int, const char *)
  • int fseek (FILE *, long, int)
  • int fsetpos (FILE *, fpos_t *)
  • long ftell (FILE *)
  • int fileno (FILE *)
  • void peror (const char *)
  • int remove (const char *)
  • int rename (const char *, const char *)
  • void rewind (FILE *)
  • void setbuf (FILE *, char *)
  • int setvbuf (FILE *, char *, int, size_t)
  • FILE * tmpfile (void)
  • char * tmpnam (char *)

<stdlib.h>

  • 依存性:<stddef.h>

AVR-LIBC修正 ライブラリ関数ヘッダファイル。

  • struct div_t
  • struct ldiv_t
  • void abort (void) - exitと実質同じ
  • int abs (int)
  • lint labs (int)
  • void bsearch (const void *, const void *, size_t, size_t, &compar)
  • div_t div (int, int)
  • ldiv_t ldiv (long, long)
  • void qsort (void *, size_t, size_t, &compar)
  • long strtol (const char *, char **, int)
  • unsigned long strtoul (const char *, char **, int)
  • long atol (const char *)
  • int atoi (const char *)
  • void exit (int) - AVR では cliして無限ループ
  • void * malloc (size_t)
  • void free (void *)
  • void * calloc (size_t, size_t)
  • void * realloc (void *, size_t)
  • double strtod (const char *, char **)
  • double atof (const char *)
  • int rand (void)
  • void srand (unsigned int)
  • int rand_r (unsigned long *)
  • char * itoa (int, char *, int)
  • char * ltoa (long, char *, int)
  • char * utoa (unsigned int, char *, int)
  • char * ultoa (unsigned long, char *, int)
  • long random (void)
  • void srandom (unsigned long)
  • long random_r (unsigned long *)
  • char * dtostre (double, char *, unsigned char, unsigned char)
  • char * dtostrf (double, signed char, unsigned char, char *)
  • int atexit (&func)
  • int system (const char *)
  • char * getenv (const char *)

<string.h>

  • 依存性:<stddef.h>

AVR-LIBC修正 文字列操作関数。

  • void * memccpy (void *, const void *, int, size_t)
  • void * memchr (const void *, int, size_t)
  • int memcmp (const void *, const void *, size_t)
  • void * memcpy (void *, const void *, size_t)
  • void * memmem (const void *, size_t, const void *, size_t)
  • void * memmove (void *, const void *, size_t)
  • void * memrchr (const void *, int, size_t)
  • void * memset (void *, int, size_t)
  • char * strcat (char *, const char *)
  • char * strchr (const char *, int)
  • char * strchrnul (const char *, int)
  • int strcmp (const char *, const char *)
  • char * strcpy (char *, const char *)
  • int strcasecmp (const char *, const char *)
  • char * strcasestr (const char *, const char *)
  • size_t strcspn (const char *, const char *)
  • char * strdup (const char *)
  • size_t strlcat (char *, const char *, size_t)
  • size_t strlcpy (char *, const char *, size_t)
  • size_t strlen (const char *)
  • char * strlwr (char *)
  • char * strncat (char *, const char *, size_t)
  • int strncmp (const char *, const char *, size_t)
  • char * strncpy (char *, const char *, size_t)
  • int strncasecmp (const char *, const char *, size_t)
  • size_t strnlen (const char *, size_t)
  • char * strpbrk (const char *, const char *)
  • char * strrchr (const char *, int)
  • char * strrev (char *)
  • char * strsep (char **, const char *)
  • size_t strspn (const char *, const char *)
  • char * strstr (const char *, const char *)
  • char * strtok (char *, const char *)
  • char * strtok_r (char *, const char *, char **)
  • char * strupr (char *)
  • int strcoll (const char *, const char *)
  • char * strerror (int)
  • size_t strxfrm (char *, const char *, size_t)

<time.h>

  • 依存性:<inttypes.h> <stdlib.h>

AVR-LIBC修正 時間型関数ヘッダファイル。 これを導入しないとtime_tはlong int等価(半精度)になりうる。

  • (typedef) time_t - uint32_t に等価
  • (typedef) clock_t - uint32_t に等価
  • enum _WEEK_DAYS_
  • enum _MONTHS_
  • clock_t clock(void)
  • struct tm
  • struct week_date
  • time_t time (time_t *)
  • time_t difftime (time_t, time_t)
  • time_t mktime (struct tm *)
  • time_t mk_gmtime (const struct tm *)
  • tm * gmtime (const time_t *)
  • tm * localtime (const time_t *)
  • char * asctime (const struct tm *)
  • char * ctime (const time_t *)
  • char * isotime (const struct tm *)
  • void gmtime_r (const time_t *, struct tm *)
  • void localtime_r (const time_t *, struct tm *)
  • void asctime_r (const struct tm *, char *)
  • void ctime_r (const time_t *, char *)
  • void isotime_r (const struct tm *, char *)
  • size_t strftime (char *, size_t, const char *, const struct tm *)
  • void set_dst (int &func(const time_t *, int32_t *))
  • void set_zone (int32_t)
  • void set_system_time (time_t)
  • void system_tick (void)
  • uint8_t is_leap_year (int16_t)
  • uint8_t month_length (int16_t, uint8_t)
  • uint8_t week_of_year (const struct tm *, uint8_t)
  • uint8_t week_of_month (const struct tm *, uint8_t)
  • week_date * iso_week_date (int, int)
  • void iso_week_date_r (int, int, week_date *)
  • uint32_t fatfs_time(const tm *)
  • void set_position(int32_t, int32_t)
  • int16_t equation_of_time (const time_t *)
  • int32_t daylight_seconds (const time_t *)
  • time_t solar_noon (const time_t *)
  • time_t sun_rise (const time_t *)
  • time_t sun_set (const time_t *)
  • int8_t moon_phase (const time_t *)
  • unsigned long gm_sidereal (const time_t *)
  • unsigned long lm_sidereal (const time_t *)

<sys/types.h>

  • 依存性:なし

次の1行だけがある、スタブヘッダ。

typedef long off_t;

他の実装ではssize_tに相当。

<unistd.h>

  • 依存性:<stddef.h> <sys/types.h>

低レベルスタブ関数ヘッダ。以下の 3種類が宣言されている。 これらは個々に実装されなければならないことを示しているに過ぎない。 第一引数のintは FILEハンドル番号 を指す。(FILEハンドル構造体型ではない)

  • int write (int, const void *, size_t)
  • int read (int, void *, size_t)
  • off_t lseek (int, off_t, int)

<float.h>

C標準 ISO C Standard: 5.2.4.2.2 Characteristics of floating types

<gcov.h>

C標準 GCOV interface routines

<iso646.h>

C標準 ISO C Standard: 7.9 Alternative spellings

<stdalign.h>

C標準 ISO C1X: 7.15 Alignment

<stdarg.h>

C標準 ISO C Standard: 7.15 Variable arguments

  • (macro) va_start (v,l)
  • (macro) va_end (v)
  • (macro) va_arg (v,l)
  • (macro) va_copy (d,s)

<stdatomic.h>

C標準 ISO C11 Standard: 7.17 Atomics

AVR では実質役に立たない。代替先→<util/atomic.h>

<stdbool.h>

C標準 ISO C Standard: 7.16 Boolean type and values

  • (define) _Bool
  • (define) bool
  • (define) true
  • (define) false

-std=XXX 次第では コンパイラ標準予約語になるため、既定では導入されていない(忘れている)ことがある。

<stddef.h>

C標準 ISO C Standard: 7.17 Common definitions

  • (typedef) size_t

size_t は HAL によって定義が変動しうる。最大値は SIZE_MAX で知れる。(AVRでは普通UINT16_MAXに等価)
このヘッダファイルが導入されていない場合、INT_MAX等価(つまり半精度)になりうることに注意。

<stdfix-gcc.h>

ISO/IEC JTC1 SC22 WG14 N1169 - GCC extension 関連

<stdfix.h>

ISO/IEC JTC1 SC22 WG14 N1169 - C extension 関連

<stdint-gcc.h>

<stdint.h> → <stdint-gcc.h>

C標準 ISO C Standard: 7.18 Integer types

<stdnoreturn.h>

C標準 ISO C1X: 7.23 _Noreturn

  • (define) noreturn

<unwind.h>

GCC クロスコンパイル環境互換性向上用定義

<varargs.h>

(廃止)<stdarg.h> を使うよう促される。

<syslimits.h> → <limits.h>

<limits.h>

C標準 修正

ほとんどは組み込みの__XXX__をXXXで置き換えるプリプロセッサ処理。 環境依存であるが、過大なマクロ定数の "置き換え" により挙動不審になった場合、これを確認すると良い。

LINKS

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

Clone this wiki locally