このエントリーをはてなブックマークに追加

NDS開発のお話 プロセッサ間通信

グラフィック演算に取り掛かろうとdevkitProという開発キットをバージョンアップ。
その時に作ってたプログラムのソースファイルが消えてしまったというのが前回の日記です。

その後、一から作り直して無線LAN(Wifi)を使ってPCと通信が出来る所までいきました。
ほぼ前に作ってた所まで戻ってきました。

NintendoDSはプロセッサが二つあるようで(Arm7 と Arm9)
その二つのプロセッサの間を通信させるためにはIPC(Inter Process Communication)を使うのだと、どこかで読みました。
しかし、私のやり方が悪いのでしょうか、どうやっても出来ませんでした。

1日かけてようやく知ったことがあるのですが、今のバージョンのNDS用開発環境(devkitARM r24)では
IPCではなくFIFOで似たようなことが出来るようです。
以下にちょこっとサンプルソースを書きます。

arm7
#include <nds.h>
#include <dswifi7.h>
#include <maxmod7.h>
void VcountHandler() {
  inputGetAndSend();
}
void VblankHandler(void) {
  Wifi_Update();
}
//
static void arm7FuncHandler(u32 value, void* data) {
}
//
void installUserFIFO() {
  fifoSetValue32Handler(FIFO_USER_07, arm7FuncHandler, 0);
}
//
void sendMessageToArm9() {
  fifoSendValue32(FIFO_USER_08, 4);
}
int main() {
  irqInit();
  fifoInit();

  readUserSettings();

  initClockIRQ();

  SetYtrigger(80);

  installUserFIFO(); //
  installWifiFIFO();
  installSoundFIFO();

  mmInstall(FIFO_MAXMOD);

  installSystemFIFO();

  irqSet(IRQ_VCOUNT, VcountHandler);
  irqSet(IRQ_VBLANK, VblankHandler);

  irqEnable( IRQ_VBLANK | IRQ_VCOUNT | IRQ_NETWORK);  

  sendMessageToArm9(); //

  while (1) swiWaitForVBlank();
}
arm9
#include <nds.h>
#include <stdio.h>
static int test; //
//
static void arm9FuncHandler(u32 value, void* data) {
  test = 0;
  iprintf("arm9 userValue32Handler");
}
//
void installUserFIFO() {
  fifoSetValue32Handler(FIFO_USER_08, arm9FuncHandler, 0);
  iprintf("arm9 installUserFIFO");
}
//
void sendMessageToArm7() {
  test = 1;
  if(fifoSendValue32(FIFO_USER_07, 2))
    iprintf("Message on the way...");
  else
    iprintf("Message broadcast failed.");
  while(test == 1) swiWaitForVBlank();
  iprintf("message is back!!!");
}
int main(void) {
  consoleDemoInit();
  installUserFIFO(); //
  sendMessageToArm7(); //

  return 0;
}
devkitPro付属のサンプル「combined」に//の部分を加えたら同じようになると思います。
実行結果
arm9 installUserFIFO

Message on the way...

arm9 userValue32Handler

message is back!!!
arm7からarm9の関数が呼ばれています。呼ばれなければ2行目で止まっているはずですから。