- 305 名前:Moonlight mailto:sage [2006/08/31(木) 15:25:45 ID:rFaKnR6R]
- あ、大事なことを忘れていました。
もし、リングバッファをARM9でmallocしているなら、なのですが、メモリの設定をしていますか? ご存じの通り、NDSには2つのCPUがあって、それらが協調して動いているのですが、(たぶん標準のブートストラップは)メモリの調停機能がARM9優先になっていたと思いおます。 ためしに、以下のコードを入れて、VRAMの初期化直後にでも呼んでみてもらえますか。 #define _REG_WAIT_CR (*(vuint16*)0x04000204) static inline void SetARM9_REG_WaitCR(void){ u16 bw=_REG_WAIT_CR; bw&=BIT8 | BIT9 | BIT10 | BIT12 | BIT13; bw|=2 << 0; // 0-1 RAM-region access cycle control 0..3=10,8,6,18 cycles def.0 bw|=0 << 2; // 2-3 ROM 1st access cycle control 0..3=10,8,6,18 cycles def.0 bw|=0 << 4; // 4 ROM 2nd access cycle control 0..1=6,4 cycles def.0 bw|=0 << 5; // 5-6 PHI-terminal output control 0..3=Lowlevel, 4.19MHz, 8.38MHZ, 16.76MHz clock output def.0 bw|=0 << 7; // 7 Cartridge access right 0=ARM9, 1=ARM7 def.0 bw|=0 << 11; // 11 Card access right 0=ARM9, 1=ARM7 def.1 bw|=1 << 14; // 14 Main Memory Interface mode 0=Asychronous (prohibited!), 1=Synchronous def.1 bw|=1 << 15; // 15 Main Memory priority 0=ARM9 priority, 1=ARM7 priority def.0 _REG_WAIT_CR=bw; } #undef _REG_WAIT_CR 自分用なので冗長ですが、関数を呼ばずに直接一行だけ REG_WAIT_CR = (REG_WAIT_CR & (BIT8 | BIT9 | BIT10 | BIT12 | BIT13)) | (2 << 0) | (1 << 14) | (1 << 15); と書いても大丈夫だと思います。 ARM7内部メモリ(通称ARM7/IWRAM)を使うなら問題ないのですが、4MByteのメインメモリをARM7とARM9で同時にアクセスすると、ARM7が待たされてしまいます。 BIT15を立てると、同時アクセスでARM9が待たされることになるので、デコード処理が遅くなりますがプチノイズが乗るよりはましという感じで、私はARM7優先にしています。
|

|