トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

WinAVRバグ情報

最終更新時間:2007年09月15日 07時49分10秒

WinAVR 20060125/WinAVR20060421

 mfileに関するバグ(1)

症状

新しく作成したMakefileでメモリの利用状況が正常に表示されない

  • WinAVR20060119で不具合あり
  • WinAVR20060125(第1版、ファイルサイズ24,683,835)も修正されていない
  • WinAVR20060125(第2版、ファイルサイズ24,713,318)は修正済み
  • WinAVR20060421はmfileに関するバグ(2)を参照
原因

コンパイルの前後にメモリの利用状況を表示するのに以前は「bin\avr-mem.sh」を使用していました。今回から「avr-size.exe」を使用するようになりましたがmfileのmakefile_templateで「avr-size.exe」の呼び出しパラメータが不足しています

対策
make_tamplateの346行目を下の様に変更してください

ELFSIZE = $(SIZE) --format=avr $(TARGET).elf       ##間違い
ELFSIZE = $(SIZE) --format=avr --mcu=$(MCU) $(TARGET).elf
  • Makefileをすでに作成している場合はMakefileも同様に修正します

 mfileに関するバグ(2) WinAVR20060421

症状

新しく作成したMakefileでメモリの利用状況が正常に表示されない。又はMakefileが正常に動作しない

  • こちらはWinAVR20060421での不具合です
原因
  • メモリ利用状況の表示にavr-mem.shを使うように変更されているのにavr-mem.shが添付されていない。
  • 新たにCPP関連の設定が追加になっているが一部ゴミが残っている
対策
  • ちょっと修正したバージョン
  • makefile_template_20060421_new(105)
    • mfileのディレクトリのmakefile_templateをバックアップします
    • mfileのディレクトリにmakefile_templateとしてコピーしてください
  • 上記のものはavr-mem.shの代わりにavr-size.exeを使用するようにしています
    • avr-mem.shを使用したい場合はこちらをどうぞ
    • WinAVR20060421でサポートしているMCUをすべて入れてあります
    • avr-mem.shはWinAVRのbinディレクトリにコピーしてください

  

 avr-gccに関するバグ(1)

症状

includeファイルが No such file or directory となる

  • WinAVR20060119で不具合あり
  • WinAVR20060125/WinAVR20060421で修正済み
原因

avr-gccが c:/msys/1.0/WinAVR で作成されています。

c:/WinAVR等にWinAVRをインストールするとディレクトリ位置が違うためデフォルトのincludeディレクトリを見つけることが出来ません

対策
Makefileでインクルードディレクトリを指定してください

(例) E:ドライブにインストールした場合

CINCS = -Ie:/WinAVR/avr/include

または

EXTRAINCDIRS = e:/WinAVR/avr/include
  • この手の不具合がWinAVRには毎回ありますね

  

 avr-gccに関するバグ(2)

症状

AVR Studio 4.12 (SP1)でavr-gccでコンパイルすると固まる場合がある

  • WinAVR20060119で不具合あり
  • WinAVR20060125/WinAVR20060421ではパッチで対応
原因
  • はっきりとした原因は不明
  • AVRStudioのプラグインの処理とマッチしていないようです
対策

Atmel betaサイトのAVRStudioSP2のパッチをあててください  

 avr-gccに関するバグ(3)

症状

gccのwarningやerrorメッセージが文字化けする場合がある

  • WinAVR20060119/WinAVR20060125で不具合あり
  • WinAVR20060421は問題なし
原因
  • gccのconfigure時に国際化対応で作成されていますがローカライズの処理がWindows版ではうまく処理できてないため文字化けします。
対策
  • --disable-nlsを指定して国際化しなければ大丈夫です(英語版)
  • WinAVR20060421で対応されました(--disable-nls)
  • ここでいう国際化版とはソースコードに日本語が使用できるということではなくコンパイラの出力するメッセージのことです。

  

 機能追加版 2006-04-22

WinAVR20060421が出ました 2006-04-26

  • 下記のものはWinAVR20060421で不具合が出た場合に試してみてください。
  • 2006-04-21 avr-libc-1.4.4がコンパイルできるようにavr-gcc/binutilsを更新しました
  • 7-zip 4.32で圧縮してあります。
  • WinAVR20060125をインストールしたディレクトリに上書きしてください
  • avr-gccはgcc-3.4.6 正式版を使用しています
    • gccの3.4シリーズはこれが最終バージョンとなるようです
  • 以前との互換性のためにavr-mem.shも最新版をいれてあります
  • avr-gcc-3.4.6-20060422.7z(98)
    • gcc-3.4.6 release版にサポートmcuを追加
    • avr-libc-1.4.4(MCU追加・変更)対応
    • 新tinyシリーズのmovw命令対応
    • 日本語ソースコード対応
      • -finput-charset=cp932 -fexec-charset=cp932 を指定
  • avr-binutils-2.16.1-20060421.7z(100)
    • binutils-2.16.1にサポートmcuを追加
    • avr-libc-1.4.4(MCU追加・変更)対応
  • avr-binutils-2.16.1-20060422-relax.7z(126)
    • avr-libc-1.4.4(MCU追加・変更)対応
    • relaxation-pacth
    • 最適化関連オプションが使用可能です
      • -fdata-sections
      • -ffunction-sections
      • -Wl,--relax -Wl,--gc-sections
    • 現在のcvs版binutilsには含まれましたがbinutils-2.16.1へバックポートしました
      • 未使用のデータ領域またはコード領域を削除する
      • call/jmpを出来る限りrcall/rjmpに置き換える
      • ret直前のrcall/call を rjmp/jmp に置き換える
      • AVRのFlashにぎりぎり収まらないような時には有効かも
    • ただしこれらのオプションはデバッガ使用時に不都合が出ることもあります
  • avr-libc-bin-1.4.4+.7z(161) 2006-04-22cvs
    • サポートMCUが追加・変更されました

  

WinAVR 20050214

  

 set_sleep_modeに関するバグ

http://lists.nongnu.org/archive/html/avr-gcc-list/2005-03/msg00349.html

tiny2313とtiny26に関してバグがあります。fixされるまでこのデバイスについてはset_sleep_mode()を使わない方が良さそうです。

 ペアレジスタへの書き込みに関するバグ

  • avr-gcc バグ情報

http://lists.nongnu.org/archive/html/avr-gcc-list/2005-02/msg00220.html

avr-gcc mailing-listに16bitI/Oアクセスのバグ情報が出ていました。(2005/2/26)
16bitI/Oのアドレスを変数を使用して書込時に上位・下位の順番が間違っています。
アドレスを定数でアクセスする場合は問題ありません。
読込はどちらでも問題ありません。
---
void out16test(volatile uint16_t *preg, uint16_t dat)
{ *preg = dat; }
---
上記は本来上位バイトが先に書き込まれなければなりません。
実際は下位バイトが先に書き込まれる間違ったコードとなります。
avr-gcc 3.4.1と avr-gcc3.4.3の両方で確認しました。
ご注意ください。

コメント

確認できました。avr-gcc 3.3以降ではpregの宣言時にvolatileをつけると下位バイトを先にするコード最適化を切る仕様になっているはずなのですが、volatileつけても下位を先に書き込むようです。

  2:abc.c         **** void out16test(volatile uint16_t *preg, uint16_t dat)
  3:abc.c         **** { *preg = dat; }
 60               	.LM1:
 61               	/* prologue: frame size=0 */
 62               	/* prologue end (size=0) */
 63 0000 F92F      		mov r31,r25
 64 0002 E82F      		mov r30,r24
 65 0004 6083      		st Z,r22<==下位が先になっている
 66 0006 7183      		std Z+1,r23
 67               	/* epilogue: frame size=0 */
 68 0008 0895      		ret
 69               	/* epilogue end (size=1) */
 70               	/* function out16test size 5 (4) */

コメント2

アドレスを定数でアクセスする場合は問題ありません。」っていうのは

#include <avr/io.h>
int main( void )
{
    unsigned int tmr;
    tmr = 0x1234;
    TCNT1=tmr;
}

↑こういう感じ(ごく普通の使い方、って言ったら語弊があるが)のやつです。これは、↓ちゃんと上位からストアされます。

---- test.c -------------------------------------------------------------------
2:        int main( void )
3:        {
+00000035:   EFCF        SER     R28              Set Register
+00000036:   E0D2        LDI     R29,0x02         Load immediate
+00000037:   BFDE        OUT     0x3E,R29         Out to I/O location
+00000038:   BFCD        OUT     0x3D,R28         Out to I/O location
6:            TCNT1=tmr;
+00000039:   E384        LDI     R24,0x34         Load immediate
+0000003A:   E192        LDI     R25,0x12         Load immediate
+0000003B:   93900085    STS     0x0085,R25       Store direct to data space
+0000003D:   93800084    STS     0x0084,R24       Store direct to data space
8:        } 

コメント3

avr-gcc-listにあがっていたpatchを確認してみました。

http://lists.nongnu.org/archive/html/avr-gcc-list/2005-02/txt7GOU9Bix1s.txt

当方の環境ではそのままパッチは当てられませんでしたがRejectされたものをマニュアルパッチして確認しました。

 41:main.c        **** void out16test(volatile uint16_t *preg, uint16_t w)
 42:main.c        **** {	*preg = w;	}
159               	.LM9:
160               	/* prologue: frame size=0 */
161               	/* prologue end (size=0) */
162 006a F92F      		mov r31,r25
163 006c E82F      		mov r30,r24
164 006e 7183      		std Z+1,r23   <== 上位バイトからになっている
165 0070 6083      		st Z,r22
166               	/* epilogue: frame size=0 */
167 0072 0895      		ret
168               	/* epilogue end (size=1) */
169               	/* function out16test size 5 (4) */

 WinAVR20050214のATtiny13/2313でのレジスタペア利用

  • ATtiny13/ATtiny2313でmovw命令が使用可能となりましたがavr-gccで利用されていません。
以前のWinAVR20040720ではmovw命令(1クロック)が利用されています。
この時はtiny13/2313はATmega48/88と同じavr4でした。
ところがtiny13/2313にはmul命令がないため掛け算を使用する場合に
間違ったコードが出力される場合がありました。
WinAVR20050214では単純にavr2に格下げすることによってbug-fix.しています。
その結果movwの代わりにmov命令2つ(2クロック)に置き換えられています。
速度を重視する場合には考慮してください。
単にAT90S2313レベルに戻っただけなのですが・・・

 avr-gccが起動できない

症状

avr-gccを起動するたびに "There is no disk ..."のエラーダイアログが出る。 すべてのPCで出るということではない。

原因

 WinAVR20050214のavr-gccはインストールドライブをm:ドライブに作成しているようです。 そのため起動時にm:ドライブをサーチに行きます。(gccの仕様です) m:ドライブが固定ディスクか、存在していないPCでは問題は出ません。 m:ドライブがリムーバブルドライブとなっているPCでメディアが挿入されていないと "There is no disk ..."のエラーダイアログが出てしまいます。(ちなみにWinAVR20040720の時は e: ドライブとなっていました)

対策

 簡単には、m:ドライブをなくせばOKです。(ドライブレターを変更する) m:ドライブが必要な場合には以下の様に対策してください。

 "WinAVR\bin\avr-gcc.exe" "WinAVR\avr\bin\gcc.exe" "WinAVR\libexec\gcc\avr\3.4.3\cc1.exe" 等関係する実行ファイルをバイナリエディタ等を使用して変更してください。 それらのディレクトリの中のかなりの exeにパッチが必要かも?

 "m:/WinAVR/..."となっている箇所が数箇所あります。 すべて "c:/WinAVR/..."のように変更してください。

  WinAVR20051203 2005-12-03

WinAVR関連パッチ済みバージョン
  • 現在のもので不都合のない方はWinAVR20050214をお使いください
  • WinAVR20050214からの差分のみいれてあります
  • 解凍したら同じ名称のフォルダへ上書きコピーしてください
  • 以前のフォルダは必ずバックアップを取って置いてください
  • 圧縮率の関係で7-zip で圧縮してあります。
  • 細かな動作チェックはしていません、自己責任でお願いします
  • コンパイルにはmingw_5.0.0.exe/MSYS-1.0.10を使用しました
内容
  • ペアレジスタへの書き込みに関するバグを修正しました
  • m:ドライブ起動不具合を修正しました
  • サポートCPUを追加しました
[Known MCU names]
 avr1 avr2 avr3 avr4 avr5 at90s1200 attiny10 attiny11 attiny12 attiny15
 attiny28 at90s2313 at90s2323 at90s2333 at90s2343 attiny22 attiny26
 attiny13 attiny2313 attiny24 attiny25 attiny44 attiny45 attiny84
 attiny85 attiny261 attiny461 attiny861 atmega603 atmega103
 at90s4433 at90s4414 at90s4434 at90s8515 at90s8534 at90c8535
 at43usb320 at86rf401 at43usb355 at76c711
 atmega8515 atmega8535
 atmega48 atmega8 atmega83 atmega85 atmega88
 atmega16 atmega161 atmega162 atmega163 atmega164 atmega165
 atmega168 atmega169 atmega32 atmega323 atmega324 atmega325
 atmega3250 atmega329 atmega3290 atmega64 atmega640
 atmega644 atmega645 atmega6450 atmega649 atmega6490
 atmega128 atmega1280 atmega1281 atmega406
 at90pwm2 at90pwm3 at90can32 at90can64 at90can128 at94k
ファイル

 avrdude-4.4.0のバグ

  • ATmega48でロックビットがかけないというのが avrfreaks forumにあがっていました
    • ロックをかけている人しか問題になりませんが
    • avrdude.confに定義が抜けていますATmega88の部分をコピーしてくればOKみたいです
    • avrdude.confを見たら他にも間違いがありそう