Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Appel à MemChunkNew en PNO sous PODS reset mon TX

4 réponses
Avatar
Frédéric Coste
bonjour,
Je développe une application en utilisant PODS (Palm OS Developper Suite) en
utilisant des routines ARM Natives.
A partir de mes routines natives, je fais des appels d'allocation dynamique
de la mémoire.

Ma routine est la suivante:

#define MEM_LARGE_MIN_SIZE 60000
#define memNewChunkFlagNonMovable 0x0200
#define memNewChunkFlagAllowLarge 0x1000
static tVoid* MemPtrNew(tULong size, tUShort OwnerID, const tVoid*
emulStateP, Call68KFuncType* call68KFuncP)
{
tVoid* newPtr;
tUChar args[8];
if (size < MEM_LARGE_MIN_SIZE)
{
// void* MemPtrNew(UInt32 size);
// MemPtrNew Parameters
*((tULong*)(&(args[0]))) = (tULong)EndianSwap32(size);
newPtr = (tVoid*)call68KFuncP(emulStateP,
PceNativeTrapNo(sysTrapMemPtrNew), &args, 4 | kPceNativeWantA0);
}
else
{
// void* MemChunkNew(UInt16 heapID, UInt32 reqSize, UInt16
attributes);
// MemChunkNew Parameters
*((tUShort*)(&(args[0]))) = 0;
*((tULong*)(&(args[2]))) = (tULong)EndianSwap32(size);
*((tUShort*)(&(args[6]))) = (tUShort)EndianSwap16(OwnerID |
memNewChunkFlagNonMovable | memNewChunkFlagAllowLarge);
newPtr = (tVoid*)call68KFuncP(emulStateP,
PceNativeTrapNo(sysTrapMemChunkNew), &args, 8 | kPceNativeWantA0);
}
return newPtr;
}

Sous le simulateur TX, mon appli fonctionne parfaitement bien.
Mais à partir de mon TX, mon appli provoque un reset dès que j'alloue un
bloc > 60000 octets.
D'où ma question, cette routine est-elle buggée ? Sinon, l'erreur vient
d'ailleurs prélablement à son utilisation ?
Merci
Frédéric

4 réponses

Avatar
Frédéric Coste
Non non !!

Cette routine est appelée uniquement à partir du code ARM Natif.

Mais bon, apparemment, le code ne te choque pas...donc le problème doit être
ailleurs.
D'autant plus qu'il fonctionne parfaitement avec le Simulateur TX.

Je cherche.....

Merci Patrick
Frédéric

"Patrick Vuichard" a écrit dans le message de
news:
Frédéric Coste a écrit, le 25/06/2006 21:03 :
static tVoid* MemPtrNew(tULong size, tUShort OwnerID, const tVoid*
emulStateP, Call68KFuncType* call68KFuncP)



Tes arguments arrivent de la partie 68k ? Si c'est le cas, ça peut être un
classique problème d'alignement...

--

Internet, newsgroups, e-mail => Netiquette
http://usenet-fr.news.eu.org/fr.usenet.reponses/usenet/netiquette.html
news:fr.bienvenue news:fr.bienvenue.questions
news:news.announce.newusers news:fr.usenet.reponses


Avatar
Frédéric Coste
Heu, en fait si, le OwnerID provient du 68k.
mais, une des première instruction de mon PNOMain est la suivante :

"
...
// Palm OS 68K interface
NativeCPC->memOwnerID = (tUShort)EndianSwap16(NativeCPC->memOwnerID);
...
"

et j'appele ma routine qui plante de la façon suivante :
"
...
NativeCPC->pbGPBuffer = (tUChar*)MemPtrNew(SIZETAB_GPBUFFER,
NativeCPC->memOwnerID, emulStateP, call68KFuncP);
...
"

memOwnerID est un mot 16 bits et est aligné sur une adresse paire que se
soit en 68k ou en ARM (si j'ai bien compris).

le OwnerID est passé dans le troisième paramètre :
"
...
*((tUShort*)(&(args[6]))) = (tUShort)EndianSwap16(OwnerID |
memNewChunkFlagNonMovable | memNewChunkFlagAllowLarge);
...
"

Je suis d'accord avec toi, j'utilise un FrmAlert pour savoir si j'arrive à
mon point :)

Merci Patrick pour le temps que tu me consacre :)

"Patrick Vuichard" a écrit dans le message de
news:
[j'espère qu'il n'y aura pas de doublon...]

Frédéric Coste a écrit, le 26/06/2006 18:53 :

Cette routine est appelée uniquement à partir du code ARM Natif.



Ok. Tu es sûr qu'aucun des paramètres ne vient de la partie 68k ?

Mais bon, apparemment, le code ne te choque pas...donc le problème doit
être ailleurs.



Moui, enfin, j'ai pu passer au travers. Ah, tiens, pourquoi ne mets-tu
pas le ownerId ? Tu le forces à 8 ?

D'autant plus qu'il fonctionne parfaitement avec le Simulateur TX.



Hum, le problème, c'est que tu ne testes pas directement ton PNO avec le
Simulateur, mais une DLL Windows.

Je suppose que tu n'as pas de cable série pour utiliser le débugger ?
Dans ce cas, il reste le bon vieux WinDrawChars(), pour voir où ça
plante...

--

Internet, newsgroups, e-mail => Netiquette
http://usenet-fr.news.eu.org/fr.usenet.reponses/usenet/netiquette.html
news:fr.bienvenue news:fr.bienvenue.questions
news:news.announce.newusers news:fr.usenet.reponses


Avatar
Frédéric Coste
Oui, tu as raison pour l'utilisation unique de variables 32bits alloués.

Maintenant, j'exploite une autre possibilité en faisant faire le travail au
68k.
Je saurai ce soir si cette méthode est préférable.

Autrement, je sais que j'avais un reset au moment où j'utilisais la partie
memchunknew de ma fonction.
Mais bon, je vais chercher un peu pour te donner de meilleures infos.

Merci Patrick :)

"Patrick Vuichard" a écrit dans le message de
news:
Frédéric Coste a écrit, le 26/06/2006 20:16 :

memOwnerID est un mot 16 bits et est aligné sur une adresse paire que se
soit en 68k ou en ARM (si j'ai bien compris).



En théorie, oui, mais par prudence, il vaut mieux n'utiliser que des
variables alloués (dans la heap et non dans la stack) ayant des tailles
multiples de 32 bits.

Je suis d'accord avec toi, j'utilise un FrmAlert pour savoir si j'arrive
à mon point :)



Et dans ta fonction, ça plante où, exactement ?

--

Internet, newsgroups, e-mail => Netiquette
http://usenet-fr.news.eu.org/fr.usenet.reponses/usenet/netiquette.html
news:fr.bienvenue news:fr.bienvenue.questions
news:news.announce.newusers news:fr.usenet.reponses


Avatar
Frédéric Coste
Bon, hier soir, j'ai séparé les routines d'allocation mémoire.
Je laisse en Natif pour l'appel de MemPtrNew, par contre, j'effectue une
allocation avec MemChunkNew en passant par une routine 68k qui fait l'appel
à MemChunkNew.

De cette façon, mon TX ne reset plus.
J'ai l'impression que les allocations sont acceptées.

Merci Patrick ;)

PS : Un problème en cachant tout de suite un autre, je te poserai bientôt
une autre question, concernant un autre problème en PNO. Bonne journée :)

"Patrick Vuichard" a écrit dans le message de
news:
Frédéric Coste a écrit, le 28/06/2006 20:17 :

Mais bon, je vais chercher un peu pour te donner de meilleures infos.

Merci Patrick :)



De rien, ça me change de mes propres problèmes avec CodeWarrior qui me les
brise menu en ce moment (ce qui m'empèche de terminer mes PNO,
d'ailleurs).

--

Internet, newsgroups, e-mail => Netiquette
http://usenet-fr.news.eu.org/fr.usenet.reponses/usenet/netiquette.html
news:fr.bienvenue news:fr.bienvenue.questions
news:news.announce.newusers news:fr.usenet.reponses