その時に作ってたプログラムのソースファイルが消えてしまったというのが前回の日記です。
その後、一から作り直して無線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 <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();
}
#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」に//の部分を加えたら同じようになると思います。#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;
}
実行結果
arm9 installUserFIFO
Message on the way...
arm9 userValue32Handler
message is back!!!
arm7からarm9の関数が呼ばれています。呼ばれなければ2行目で止まっているはずですから。
Message on the way...
arm9 userValue32Handler
message is back!!!