Repository navigation
AVR_LIBC_Header
- 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/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> より先に)
- スタックポインタ:
SPSPLSPH - ステータスレジスタ:
SREG - 特殊レジスタ:
CCP(存在するなら)RAMPZ - マクロ関数:(必要なら)
_WORDREGISTER(regname)_DWORDREGISTER(regname)
- 依存性:
<avr/io.h><inttypes.h><limits.h><avr/eeprom.h>
classicAVR 用のブートローダー作成ユーティリティー。modernAVR では使用できない。
- 依存性:なし
以下の 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/io.h>で読み込まれる。アセンブラ.Sでも使用可能。
多用する IOレジスタの番地や、ビットフラグに名前をつける。
- スタックポインタ:
SPSPLSPH - ステータスレジスタ:
SREG - ステータスフラグ:
SREG_CSREG_ZSREG_NSREG_VSREG_SSREG_HSREG_TSREG_I- これらはビット番号で宣言されているので、適宜
_BV()で括って使用する。
- これらはビット番号で宣言されているので、適宜
- 特殊レジスタ:(存在するなら)
EINDRAMPDRAMPXRAMPYRAMPZ - アセンブリ汎用レジスタ:(R26〜31の別名)
XLXHYLYHZLZH
- 依存性:
<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(); /* この前後のコンパイラの並べ替え移動を阻止(可能なら) */
// 以降の処理
}(移動)CRC計算ユーティリティ。
(移動)割込を使わない遅延関数ユーティリティ。
- 依存性:
<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/io.h>で読み込まれる。 - 依存性:なし
FUSE 関係のメモリセクションや初期値を定義する。
- FUSES 構造体を初期化し、
.fuseメモリセクションを書き出して FUSE 初期化ファイルを作成するために必要。 - しかし reduceAVR 系では機能しない。MZP-SDK [reduceAVR] で補完される。
- 依存性:
<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/io.h>読み込まれる。 - 依存性:なし
LOCK 関係のメモリセクションや初期値を定義する。modernAVR では使用しない。
(移動)パリティ関係ユーティリティ。
- 依存性:
<avr/io.h><stddef.h><inttypes.h>
プログラムスペースユーティリティ。標準Cライブラリ関数に_Pまたは_PFを付けた関数が多数ある。
- (attribute)
PROGMEMメモリ属性-
__attribute__((__progmem__))に等価
-
- 型宣言:
prog_voidprog_charprog_ucharprog_int8_tprog_uint8_tprog_int16_tprog_uint16_tprog_int32_tprog_uint32_tprog_int64_tprog_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/io.h>で読み込まれる。 - 依存性:なし
主に classicAVR 系 Xmega 属用の、Pxn<->PORTxn(例:PA0<->PORTA0)を生成するマクロファイル。
modernAVR では使用しない。
対象 AVR 群以外に対しても強制的に実行されうるため、ある意味余計な事をされてしまう。このマクロファイルの存在により
PORTnDDnPINnPORTxnといった一般名称の使用には制約が課される。
- 依存性:
<avr/io.h><stdint.h>
classicAVR、regendAVR 用の 電力制御関連ユーティリティ。 modernAVR では使用しない。
-
<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/interrupt.h>で代替された。
- 依存性:
<avr/io.h>
シグネチャーユーティリティ。インクルードすると const unsigned char __signature[3] が .signature メモリセクションに初期化済で宣言され、シグネチャー情報が ファイル書き出しが可能になる。
- 依存性:
<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/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/io.h><stdint.h>
WDT機能ユーティリティ。-mmcu=XXX に応じて実装内容は異なる。
- (macro)
wdt_enable(timeout)- (classicAVR)
WDTO_[15|30|60|120|250|500]MSWDTO_[1|2]S
- (modernAVR)
WDT_PERIOD_[8|16|32|64|128|256|512]CLK_gcWDT_PERIOD_[1|2|4|8]KCLK_gc
- (classicAVR)
- (macro)
wdt_disable() - (macro)
wdt_reset()-
__asm__ __volatile__ ("wdr")に等価
-
modernAVR は、WDT=1024 Hz(なので 8K=8.192s)
ただし AVR-SD は、WDT=32768 Hz(なので 8K=250ms)
-
依存性:なし
-
<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] にも移植されている。
後者は主にブートローダーで使われる。
- 依存性:
<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を復元しない
-
- 依存性:
<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)
- 依存性:
<inttypes.h>
単純遅延関数。
- void
_delay_loop_1(uint8_t)- 3 CPUクロック毎ループ(0指定は 256ループ)
- void
_delay_loop_2(uint16_t)- 4 CPUサイクル毎ループ(0指定は 65536ループ)
- 依存性:
<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) で機能実装。
- 依存性:
<time.h><inttypes.h>
欧州連合(EU)向けサマータイム補正関数。メンテナンスされていないため、試験的。
- int
eu_dst (const time_t *, int32_t *)
- 依存性:なし
パリティ計算関数。
- (macro)
parity_even_bit(val)- val に含まれる 1のビット量を数えて奇数なら 真
GCC拡張
__builtin_popcount(x)としていることは同じ。
- 依存性:事前に
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
}- 依存性:
<avr/io.h>
classicAVR 用の I2C 関連ユーティリティ。 modernAVR では使用できない。
- 依存性:
<time.h><inttypes.h>
米国(USA)向けサマータイム補正関数。メンテナンスされていないため、試験的。
- int
usa_dst (const time_t *, int32_t *)
- 依存性:
<stddef.h>
AVR-LIBC修正 alloca 関数インポート。
- void *
alloca (size_t)-
__builtin_alloca(size)に等価。
-
- 依存性:
<stdlib.h>
AVR-LIBC修正 assert マクロ関数インポート。
- (macro)
assert(e)- (通常)
e式が偽ならabort()を実行。 - (
NDEBUG定義済)なにもしない。 - (
__ASSERT_USE_STDERR定義済)e式が偽なら void__assert(__func__, __FILE__, __LINE__, #e)を実行。
- (通常)
AVR-GCC では実装先がないので、実行時には単に割込禁止で無限ループ停止。
- 依存性:なし
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)
- 依存性:なし
AVR-LIBC修正 エラー番号ユーティリティ。
<stdio.h>と合わせて使用する。
(代替)AVR-LIBC修正 ファイル制御関数。
<stdio.h>と合わせて使用する。
- 依存性:
<stdint.h>
AVR-LIBC修正 整数マクロ定義。
printf引数型等が定義されている。
<stdio.h>と合わせて使用する。
AVR-LIBC修正 ロケール定義ファイル。
<stdio.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型からの単なるマクロ別名になっている。
- 依存性:なし
広域跳躍関数。
- int
setjmp(jmp_buf) - void
longjmp(jmp_buf, int)
- 依存性:なし
AVR-LIBC修正 シグナル関数の偽装実装。 libstdc++ v3 のプリコンパイル済ヘッダファイルのビルドを通すためにある。
- 依存性:なし
組み込みC言語における固定小数点数サポートのための avr-libc 補足ファイル。
単に<stdfix.h>を使用するよう促される。(代替しない)
- 依存性:なし
AVR-LIBC修正 変数型宣言ヘッダファイル。
それぞれの型の上限/下限を示すマクロ定数も宣言される。
charからlong long intまでが対応範囲で、網羅的に対応する別名をtypedefする。
size_tは<stddef.h>を参照。(しなければint相当になりうる)
time_tは<time.h>を参照。(しなければint相当になりうる)
- 依存性:
<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とは違う)
- FILEハンドル構造体定義(ファイルハンドル
- (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 *)
- 依存性:
<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 *)
- 依存性:
<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)
- 依存性:
<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 *)
- 依存性:なし
次の1行だけがある、スタブヘッダ。
typedef long off_t;他の実装では
ssize_tに相当。
- 依存性:
<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)
C標準 ISO C Standard: 5.2.4.2.2 Characteristics of floating types
C標準 GCOV interface routines
C標準 ISO C Standard: 7.9 Alternative spellings
C標準 ISO C1X: 7.15 Alignment
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)
C標準 ISO C11 Standard: 7.17 Atomics
AVR では実質役に立たない。代替先→
<util/atomic.h>
C標準 ISO C Standard: 7.16 Boolean type and values
- (define)
_Bool - (define)
bool - (define)
true - (define)
false
-std=XXX次第では コンパイラ標準予約語になるため、既定では導入されていない(忘れている)ことがある。
C標準 ISO C Standard: 7.17 Common definitions
- (typedef)
size_t
size_tは HAL によって定義が変動しうる。最大値はSIZE_MAXで知れる。(AVRでは普通UINT16_MAXに等価)
このヘッダファイルが導入されていない場合、INT_MAX等価(つまり半精度)になりうることに注意。
ISO/IEC JTC1 SC22 WG14 N1169 - GCC extension 関連
ISO/IEC JTC1 SC22 WG14 N1169 - C extension 関連
C標準 ISO C Standard: 7.18 Integer types
C標準 ISO C1X: 7.23 _Noreturn
- (define)
noreturn
GCC クロスコンパイル環境互換性向上用定義
(廃止)<stdarg.h> を使うよう促される。
C標準 修正
ほとんどは組み込みの
__XXX__をXXXで置き換えるプリプロセッサ処理。 環境依存であるが、過大なマクロ定数の "置き換え" により挙動不審になった場合、これを確認すると良い。
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(日本語訳)