多くの検索と試行錯誤の後、解決策を見つけました。
表示されていたエラーを誤解しましたが、トーマスは正しいです。自分の機能に追加すると、機能がチップに対して大きすぎました。
明らかな選択肢はどこにも行きませんでしたが、他の初心者がこの問題に遭遇したときに役立つように、ここにそれらをリストします.
itoa() - 16 ビットとultoa() - 32 ビットが実装されていますが、小さすぎます。
sprintf(%d)が小さすぎるため、sprintf(%lld)は WinAVR (AVR-GCC) に実装されていません。
このコードは機能します (注意事項があります):
void main()
{
unsigned long long tagid;
char tagid_str[12];
tagid = 109876543210ull
convert_to_decimal(tagid_str, tagid);
}
void convert_to_decimal(char* dst, unsigned long long src)
{
int i;
for (i = 0; i < 12; i ++)
{
dst[11 - i] = '0' + (int)(src % 10);
src /= 10;
}
dst[12] = 0;
}
しかし、統計を見てください:
プログラム: 7358 バイト ( 89.8% フル) (.text + .data + .bootloader)
データ: 256 バイト ( 25.0% フル) (.data + .bss + .noinit)
原因は%演算子です。long long でそれを使用すると、ほぼ 8k のコードが生成される理由を説明できません!
これが実用的な代替手段です。使用している RFID リーダーの形式に合わせて、最大 12 桁のunsigned long long (64 ビット)のみを使用するように変更しました。
void main()
{
unsigned long long tagid;
char tagid_str[12];
tagid = 000000000000ull;
ulltostr((unsigned long long)tagid, tagid_str);
tagid = 000000000001ull;
ulltostr((unsigned long long)tagid, tagid_str);
tagid = 109876543210ull;
ulltostr((unsigned long long)tagid, tagid_str);
tagid = 900000000000ull;
ulltostr((unsigned long long)tagid, tagid_str);
tagid = 999999999999ull;
ulltostr((unsigned long long)tagid, tagid_str);
}
//http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=31199
void ulltostr(unsigned long long val, char *s )
{
char *p;
unsigned char d, i;
unsigned char zero;
unsigned long long test;
unsigned long long uval = val;
p = s;
zero = 1;
i = 12;
do{
i--;
if ( i==0) test =10;
else if ( i==1) test =100;
else if ( i==2) test =1000;
else if ( i==3) test =10000;
else if ( i==4) test =100000;
else if ( i==5) test =1000000;
else if ( i==6) test =10000000;
else if ( i==7) test =100000000;
else if ( i==8) test =1000000000;
else if ( i==9) test =10000000000;
else if ( i==10) test=100000000000;
else if ( i==11) test=1000000000000;
else if ( i==12) test=10000000000000;
for( d = '0'; uval >= test; uval -= test )
{
d++;
zero = 0;
}
if( zero == 0 )
*p++ = d ;
}while( i );
*p++ = (unsigned char)uval + '0';
}
そして統計:
プログラム: 758 バイト ( 9.3%フル) (.text + .data + .bootloader)
データ: 0 バイト ( 0.0%フル) (.data + .bss + .noinit)
はるかに良い:)
私はほとんどの時間をDouglas Jonesと一緒に過ごしましたが、最終的にAVR Freaksから答えが得られました。