Posté le 09/05/2018 17:27
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 103 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 29/07/2018 22:59 | #
En effet, le makefile ajoutait des trucs -o à la fin, j'ai ajouté le -lgcc à la fin de la commande de build :
$(ECHO) "LINK $@"
$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS) -lgcc
$(Q)$(SIZE) $@
J'ai ajouté le setjmp.s de gint, et maintenant ça compile merci lephé !
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/07/2018 23:00 | #
Dommage que tu n'aies pas réalisé que c'est $(LIBS) qui compte et pas -o... d'ailleurs ça compilait déjà, c'est l'édition des liens qui foirait ; mais on te pardonne ce vocabulaire approximatif.
Citer : Posté le 03/08/2018 00:08 | #
Du coup pour le python je suis bloqué au niveau de l'implémentation des floats, la libfx ne contient pas les fonctions nanf(), copysignf() et nearbyintf() (car c'est du c99).
Pour nanf(), j'ai fait 0.0/0.0 qui retourne normalement un qNaN.
Pour nearbyintf() : j'ai implémenté l'implémentation de la glibc, mais en implémentant les dépendances je suis bloqué sur feholdexcept(), je ne trouve aucun code C pour ça... du coup je peux pas avancer tant que j'ai pas ce code C.
Pour copysignf() : j'ai pas encore implémenté (je fais déjà nearbyintf).
Du coup si quelqu'un a une idée ça m'arrangerait beaucoup (parce que les floats dans python c'est quand même utile )
En attendant, je fais le côté éditeur en forkant Edit.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 03/08/2018 07:46 | #
Pour nanf(), j'ai fait 0.0/0.0 qui retourne normalement un qNaN.
Dans un FPU ça retourne sNaN. Pour obtenir un qNaN avec le FPU de la calto il faut faire un calcul avec un sNaN. Pourquoi ne renvoies-tu juste pas 0x7f800000 réinterprété en float ?
e.x = 0x7f800000;
return e.f;
As-tu compris ce que feholdexcept() est ?
C'est le plus facile !
Ajouté le 03/08/2018 à 07:47 :
Les float de Python sont des double en général, je rappelle.
Citer : Posté le 03/08/2018 13:32 | #
Parce que sur google j'ai trouvé nulle part de représentation d'un qNaN
Ton code il marche comment, tout ce qui est mis dans x est mis aussi dans f ?
Nope, aucune idée de son utilité, je connais juste son prototype. (et de toute façon j'ai pas trop envie d'implémenter la fonction moi même à partir d'une description de ce qu'elle fait, parce que s'il y a un bug je vais galérer à le trouver )
Ha ben oui je suis con j'avais défini MICROPY_FLOAT_IMPL_FLOAT au lieu de MICROPY_FLOAT_IMPL_DOUBLE ._.
Bon par contre ça m'arrange pas (et c'est pour ça que j'ai testé le float au lieu du double), j'ai toujours les mêmes fonctions qui manquent :
Ajouté le 03/08/2018 à 14:04 :
D'ailleurs, selon Wikipédia, 0x7F800000 c'est l'infini, pas le qNaN, les qNaN commencent à 0x7FC00000.
Du coup pour le qNaN en double ce serait 0x7FF8000000000000 si j'ai bien compté.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 03/08/2018 19:52 | # | Fichier joint
x et f partagent la même zone mémoire donc modifier x modifie aussi f, mais au niveau des bits.
Aaarh >_<
Du coup pour le qNaN en double ce serait 0x7FF8000000000000 si j'ai bien compté.
J'ai pu me tromper sur le passage en hexa toutefois.
Citer : Posté le 03/08/2018 20:08 | #
Je sais pas où t'as trouvé ça, mais stackoverflow (et wikipédia) disent le contraire :
As with IEEE 754-1985, the biased-exponent field is filled with all 1 bits to indicate either infinity (trailing significand field = 0) or a NaN (trailing significand field ≠ 0).
[...]the standard recommends 0 for signaling NaNs, 1 for quiet NaNs
https://stackoverflow.com/a/21345453 : 0x7FF8000000000000 (soit tous les bits de la mantisse à 1, et le 1er bit du significand à 1) est un qNaN.
(bref, ça résout pas mes problèmes de copysign et nearbyint )
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 03/08/2018 20:24 | #
Mais c'est épuisant de discuter dans le vide. Teste donc, en l'occurrence tu as raison, le FPU sur SH3 n'est pas standard. Ce n'est pourtant pas compliqué de le démontrer par l'exemple x)
#define _GNU_SOURCE
#include <stdio.h>
#include <math.h>
int main(void)
{
union { int x; float f; } u;
u.f = NAN;
printf("%#08x\n", u.x);
u.x = 0x7f800000;
printf("%lf\n", u.f);
return 0;
}
† ./a
0x7fc00000
inf
†
Citer : Posté le 06/08/2018 15:01 | #
Quand je tape un calcul avec des doubles (même juste taper "1.1") dans l'interpréteur ça fait ça (toujours la même erreur) :
J'ai foutu des getkey bloquants sur les fonctions que j'ai implémentées et ça fait rien du coup ça doit pas être ça, mais d'autres fonctions.
J'ai cherché pour la constante 0x7FF00000 (qui est l'infini) mais je la trouve que dans pow.c, sin.c et log.c.
Là j'ai franchement aucune idée de comment faire
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 06/08/2018 18:02 | #
Il s'agit d'un déréférencement de pointeur nul, selon toute apparence. Y a-t-il une de tes fonctions qui risque de faire ça ?
La valeur affichée pour PC est inutilisable. En théorie c'est supposé être l'endroit du code où l'erreur a eu lieu. Mais là elle ne ressemble à rien. Je doute que ce soit un infini puisque tu es passé en double nan ?
Comme tu ne peux pas produire de call trace, je t'invite à parcourir dans le code de Python ce qui se passe quand tu évalues une telle constante. [Et si ça marchait quand tu étais en float, alors cherche en particulier, ce qui peut changer quand tu passes au double.]
Ajouté le 06/08/2018 à 18:04 :
Ah oui, je réponds aussi à ta question sur le chat pour savoir si cette implémentation était valide :
Je serais tenté de dire que tu n'as même pas besoin de renvoyer 1 dans les conditions exceptionnelles que tu as notées. J'aurais directement renvoyé 0 tout le temps, sinon Python risque de croire qu'il y a une erreur, alors que la situation que l'on souhaite est plutôt « pas d'erreur, mais les exceptions ne marchent pas ».
Citer : Posté le 06/08/2018 19:22 | #
Ca m'étonnerait que ce soit mes fonctions : au début de chaque fonction que j'ai implémentée, j'ai foutu un print suivi d'un getkey, et vu que l'erreur a lieu immédiatement c'est pas ces fonctions là.
Le PC correspond à quoi exactement, pourquoi l'adresse ressemble à rien ici ?
Aucune idée de si ça marche quand j'étais en float, vu que j'avais pas réussi à implémenter les fonctions.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 06/08/2018 19:59 | #
PC signifie Program Counter, c'est un registre du processeur (qui porte ce nom-là dans 90% des architectures d'ailleurs) qui contient l'adresse de l'instruction en cours d'exécution (grosso modo).
Lorsqu'une exception se produit, PC est sauvegardé dans un coin pour que la procédure qui gère l'exception (ici celle qui affiche System ERROR!!) puisse savoir où le problème a eu lieu. C'est ça la valeur qui est affichée.
Ici elle ne ressemble à rien parce que le code de l'add-in occupe des adresses qui sont toujours entre 00300000 et 00380000 sur Graph 85. La RAM est elle dans une plage d'adresses qui commence à 88000000. L'OS serait entre 80000000 et 80400000 ou entre a0000000 et a0400000. Vue comme addresse, 7ff00000 c'est une bizarrerie située à la fin de la zone P0 et où jamais rien n'a été placé sur la calculatrice.
Ce n'est pas la première fois que je vois des trucs absurdes dans ce champ, il n'est pas impossible que dans certaines situations l'OS affiche autre chose que la valeur de PC, ou alors il y a une maladresse.
Pour ta gouverne, ce qui est écrit après TARGET, quand l'erreur est une TLB ERROR, est l'adresse à laquelle le programme a tenté d'accéder, mais qui n'existe pas (n'est pas mappée). Tu as de la chance, sur SH4 ce bug serait passé inaperçu et tu aurais été encore plus dans la merde...
Je fais une remarque auxiliaire : quand je travaille sur gint, la moitié des bugs sont indétectables à coups de GetKey() et de Print(). Dans des applications complexes (typiquement avec interruptions...) le flot d'exécution est beaucoup plus compliqué qu'il n'y paraît. J'ai eu plusieurs situations où modifier du code qui ne se faisait jamais exécuter créait des crashs à d'autres endroits. Souviens-toi que cette méthode de debuggage est souvent fiable, mais loin d'être parfaite.
Citer : Posté le 23/08/2018 15:00 | #
J'essaie d'utiliser le syscall GetKeyWait (0x247), mais il bloque totalement : il ne semble pas reconnaître mes appuis de touches, et seul le retour au menu marche.
int type_of_waiting = 0;
int timeout_period = 0;
unsigned short key;
int menu = 0;
locate(1,1); Print("azer");
ML_display_vram();
getkey(&column, &row, type_of_waiting, timeout_period, menu, &key);
//ce code n'est jamais atteint
locate(1,1); Print("reza");
ML_display_vram();
Apparemment le syscall GetKeyWait marche (ce qui n'est pas le cas de la fonction du SDK), du coup c'est une erreur de mon côté ou non ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 15:04 | #
Je n'ai pas le temps de regarder tout de suite (orage en approche), mais il a 5 paramètres donc il est possible que tu sois obligé d'utiliser la procédure assembleur pour l'appeler. Dans mon tuto sur l'utilisation du clavier il y a un appel à GetKeyWait, il me semble, tu peux regarder de ce côté-là :
https://www.planet-casio.com/Fr/forums/topic14175-1-[Tutoriel]_La_gestion_du_clavier_en_C.html
Citer : Posté le 23/08/2018 15:12 | #
J'ai tenté de remplacer les .export par .global et .data.l par .long, mais il y a toujours des erreurs de syntaxe, il faudrait le convertir au format gcc stp
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 15:24 | #
Tu veux pas apprendre la syntaxe plutôt ? Ça te sera bien plus utile par la suite
Citer : Posté le 23/08/2018 15:28 | #
Je connais aucun des 2 donc ça va être chaud
(après, si c'est de simples substitutions, autant faire un topic qui les recense)
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 16:46 | #
Pour le coup tu n'as qu'à utiliser la procédure d'appel normale avec le numéro de syscall de GetKeyWait(), ça devrait marcher si tu penses à compiler avec -mrenesas.
Citer : Posté le 23/08/2018 17:23 | #
La procédure d'appel normale, c'est à dire ?
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 23/08/2018 19:59 | #
Un copier/coller du code assembleur que tu m'as demandé de traduire tout à l'heure en changeant le numéro. Le fait ici est qu'il y a plus de 4 arguments donc la pile intervient, et elle gêne.
Citer : Posté le 24/08/2018 03:19 | #
Ah, mais justement ça marche pas
Ecrivez vos programmes basic sur PC avec BIDE