Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » SDK gcc pour addin 35e2/portage KhiCAS
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

SDK gcc pour addin 35e2/portage KhiCAS

Posté le 16/04/2019 20:58

Souhaitant porter KhiCAS sur la nouvelle casio 35, j'ouvre le sujet d'un SDK pour la Graph 35e2. La branche liberation du code source d'Eigenmaths (https://git.planet-casio.com/Nemh/Eigenmath/tree/liberation) contient une version gcc qui suffit pour compiler Eigenmaths, elle convient aussi pour tommath (entiers longs utilisables avec giac) mais pas pour porter la uSTL, la libc est incomplete, il manque par exemple printf, fprintf, errno, etc. Et cette libc est fournie sans code source (c'est probablement la libc du SDK de Casio?).
Je pense qu'il doit etre possible de porter la libc que j'utilise pour KhiCAS (https://www-fourier.ujf-grenoble.fr/~parisse/casio/libfxcg.tar.gz), en remplacant principalement dans stdio.c les appels fxcg vers libfx. Mais Lephenixnoir me suggere d'utiliser le portage de newlib par Memallox https://git.planet-casio.com/Memallox/libc
Question: est-ce que ce portage est compatible avec la 35e2?
Existe-t-il une version compilee (libc.a et fichiers headers) quelque part?



Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 25/04/2019 21:22 | #


Parisse a écrit :
Je vais essayer en testant tous les timers jusqu'a en trouver un inutilise.

Mauvaise idée, si je peux me permettre.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 25/04/2019 21:24 | #


Ce qui m'etonne c'est qu'en principe j'arrete bien les timers! Il y a un couple set_abort() clear_abort() autour des evaluations.

Ajouté le 25/04/2019 à 21:35 :
Le code qui gere les timers est le suivant:

  int execution_in_progress = 0; // set to 1 during program execution

  static void check_execution_abort() {
    if (execution_in_progress) {
      // HourGlass();
      unsigned int key=0;
      int res = GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF,0,1,&key);//PRGM_GetKey_();
      if(res==KEYREP_KEYEVENT && key == KEY_CTRL_AC){
    puts("ACON");
    esc_flag = 1;
      }
    }
  }
  
  static int aborttimer = 0;
  void set_abort(){
    for (int i=1;i<=5;++i){
      aborttimer=SetTimer(i,100,check_execution_abort);
      if (aborttimer==i)
    return;
    aborttimer=-1;
    // aborttimer = Timer_Install(0, check_execution_abort, 100);
    // if (aborttimer > 0) { Timer_Start(aborttimer); }  
  }
  
  void clear_abort(){
    if (aborttimer > 0) {
      KillTimer(aborttimer);
      //Timer_Stop(aborttimer);
      //Timer_Deinstall(aborttimer);
    }
  }


Autour de chaque evaluation il y a un couple execution_in_progress=1; set_abort(); ... clear_abort(); execution_in_progress=0;
Pendant une evaluation il y a des couples clear_abort()... set_abort() dans la fonction input et pour les mises a jour VRAM vers ecran.

Ajouté le 25/04/2019 à 22:00 :
Bon, en mettant des affichages, j'ai compris ce qui ne va pas, c'est que la valeur renvoyee par SetTimer est decalee de 5 de la valeur passee en argument. Apres ca, le handler de sortie fonctionne.

Ajouté le 25/04/2019 à 22:11 :
Par contre le timer ne fonctionne pas, impossible d'interrompre en appuyant sur AC/ON, le test

...
GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF,0,1,&key);//PRGM_GetKey_();
      if(res==KEYREP_KEYEVENT && key == KEY_CTRL_AC){
    puts("ACON");
    esc_flag = 1;

n'est pas pris.

Ajouté le 26/04/2019 à 08:35 :
Apparamment, key n'est pas modifie par GetKeyWait (d'ou peut-etre le "broken?" dans https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_syscalls.htm). IsKeyDown et IsKeyUp crashent. Si je mets un GetKey(&key) lorsque res==KEYREP_KEYEVENT ca bloque. Donc je ne sais pas quoi utiliser pour tester la touche ON, pour le moment je vais interrompre des qu'une touche est pressee.
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 26/04/2019 08:47 | #


Bon, en mettant des affichages, j'ai compris ce qui ne va pas, c'est que la valeur renvoyee par SetTimer est decalee de 5 de la valeur passee en argument. Apres ca, le handler de sortie fonctionne.

Ça c'est à cause des numéros de timers :

  There are 11 timers with numbers 0..10. Timers 0..4 are ETMU. Timers 5..10
  are software timers that run on ETMU0. The status of ETMU0 is special.

                     v- Used to run the software timers
    Timer numbers    0  1  2  3  4  5  6  7  8  9  10
                     +-- ETMU ---+  +-- Software ---+

Les timers que tu manipules sont numérotés à partir de 5.

Apparamment, key n'est pas modifie par GetKeyWait (d'ou peut-etre le "broken?" dans https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_syscalls.htm). IsKeyDown et IsKeyUp crashent. Si je mets un GetKey(&key) lorsque res==KEYREP_KEYEVENT ca bloque. Donc je ne sais pas quoi utiliser pour tester la touche ON, pour le moment je vais interrompre des qu'une touche est pressee.

Oui, GetKeyWait() a exactement ce problème. Je ne sais pas pourquoi IsKeyDown() crashe ici, mais c'est tant mieux à la limite. GetKey() bloque toujours. La solution est d'utiliser le syscall GetKeyWait(), qui lui marche.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 09:43 | #


Donc pas de possibilite de tester si c'est bien la touche ON qui est pressee?
Sinon, je constate que RTC_GetTicks() fonctionne. On va pouvoir mettre a l'heure et l'afficher, utile en situation d'examen (les etudiants n'ont plus de montre).
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 26/04/2019 10:06 | #


Donc pas de possibilite de tester si c'est bien la touche ON qui est pressee?

Si, tu peux utiliser le syscall GetKeyWait(). Attention, comme d'habitude si plusieurs touches sont pressées à la fois ça n'en donne qu'une.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 11:10 | #


Je n'y arrive pas avec GetKeyWait, car il ne met rien dans la variable key avec l'appel GetKeyWait(KEYWAIT_HALTOFF_TIMEROFF,0,1,&key)
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 26/04/2019 11:36 | #


Tu as bien implémenté l'appel de syscall ? Pour éviter les conflits d'édition des liens, tu devrais lui donner un nom différent.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 12:24 | #


Je n'ai rien fait pour lui, car il etait dans le sdk.
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 26/04/2019 12:45 | #


C'est bien ça le problème, la version SDK est cassée. Pas le syscall.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 12:54 | #


C'est bien 0x247?

Ajouté le 26/04/2019 à 13:06 :
Ca crashe avec 0x247. Tant pis, ca interrompra avec n'importe quelle touche.
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 26/04/2019 13:15 | #


Oui mais attention, ce n'est pas le même prototype. (Sinon à quel endroit la fonction de fxlib pourrait-elle se planter ?)
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 13:39 | #


Ah d'accord, merci!
Critor En ligne Administrateur Points: 2673 Défis: 18 Message

Citer : Posté le 26/04/2019 14:06 | #


KhiCAS sur Graph 35+E II a fait son petit effet sur le stand Casio à l'Orme hier.
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 15:55 | #


Bon, j'ai fini par reussir a utiliser getkeywait, le code renvoye dans key ne sert a rien, mais le code de colonne et de ligne a l'air d'etre 1 et 1 pour AC.
Encore pas mal de boulot en perspective, je pense que la partie CAS est utilisable maintenant (meme si l'editeur 2d a encore des bugs et s'il manque encore des menus, en particulier VARS et CATALOG).

Ajouté le 26/04/2019 à 15:58 :
Critor a écrit :
KhiCAS sur Graph 35+E II a fait son petit effet sur le stand Casio à l'Orme hier.

Je n'ai pas encore fait part de mes progres a Camille Margot, j'attendais que ce soit un peu plus robuste et aussi d'avoir la partie programmation, c'est super si vous l'avez montre la-bas!
Critor En ligne Administrateur Points: 2673 Défis: 18 Message

Citer : Posté le 26/04/2019 16:08 | #


Je l'ai montré rapidement sur Graph 35+E II au directeur commercial qui avait fait le déplacement.

Niveau visiteurs il n'y avait pas grand monde d'intéressant sur les stands.
Les plus nombreux devaient être le matin les élèves de primaire, plusieurs enseignants ayant amené leur classe.
Sur le stand de TI, le robot TI-Innovator Rover qui faisait du park-assist a davantage retenu leur attention, certes...
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 26/04/2019 21:58 | #


La persistance devrait fonctionner maintenant (console et variables, sauf pour la position justifiee a droite/gauche dans la console, mais c'est peut-etre pas plus mal comme ca on voit bien l'ancien et le nouveau). Ainsi que la gestion des modes (Python/Xcas et RAD/DEG) via shift-SETUP, avec affichage de l'etat (et de l'heure) juste au-dessus de la ligne de menu, ou il y a toujours de la place libre, sauf quand on edite une ligne de commande (et dans ce cas l'etat n'est pas affiche). Pour mettre a l'heure il faut faire time(hh,mm) (pour le moment en tout cas).

Ajouté le 27/04/2019 à 13:58 :
J'ai rajoute l'UI de la touche VARS, mais pas moyen de detourner CATALOG qui renvoie toujours sur le catalogue Casio, c'est normal? Du coup, j'utilise pour l'instant OPTN. Il faudra peut-etre que je mette une touche en F pour le catalogue quitte a deplacer un menu configurable (F4, en mettant plot en F6 et misc sur shift-X,theta,T),.
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 27/04/2019 14:02 | #


J'ai rajoute l'UI de la touche VARS, mais pas moyen de detourner CATALOG qui renvoie toujours sur le catalogue Casio, c'est normal?

Absolument, c'est intégré à la fonction GetKey(), comme la modification du contraste et le fait que Shift+OPTN allume le rétro-éclairage. Ce genre de raccourcis que tu ne peux pas contourner.

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 28/04/2019 12:05 | #


Nouveau probleme, assez incomprehensible, en ajoutant l'editeur de script. Crash avec
ADDRESS(R)
TARGET=E6FF2136
PC=8804F800
Lorsque je commente une partie du code, le crash ne se produit pas. Si le code n'est pas commente, le crash se produit *apres* l'affichage du texte source du script (on voit le texte affiche en-dessous de System Error) mais avant d'avoir pu taper quoi que ce soit au clavier. Le code commente correspond a la gestion de certaines touches du clavier.
Ce qui est incomprehensible, c'est que GetKey(&key) n'est pas atteint avant le crash lorsque le code #if 0 ... #endif est decommente, c'est comme si le CPU savait a l'avance qu'il y avait cette portion de code apres GetKey et qu'il decidait de crasher.

...
  unsigned int key;
  GetKey(&key);
...
    switch(key){
    case KEY_CTRL_DEL:
      if (clipline>=0){
    giac::copy_clipboard(get_selection(text,true),true);
    // erase selection
    clipline=-1;
      }
   ...
#if 0
    case KEY_CTRL_EXE:
      if(text->allowEXE) return TEXTAREA_RETURN_EXE;
      if (search.size()){
    for (;;){
      if (!move_to_word(text,search,replace,isFirstDraw,totalTextY,scroll,textY))
        break;
    }
    show_status(text,search,replace);
    continue;
      }
#endif

Il n'y a rien de particulier dans ce code pourtant.

Ajouté le 28/04/2019 à 14:05 :
J'avance un peu dans la localisation du crash, mais je ne vois toujours pas pourquoi ca crashe. Le crash se produit a la fin de l'appel a la fonction textarea_disp qui affiche le source du script, lorsque cette fonction est presente plus qu'une fois dans le code source. Peut-etre que si elle est presente une seule fois alors elle est inlinee par le linker (a cause de l'option -lflto), ce qui fait la difference. Son prototype est
void textarea_disp(textArea * text,int & isFirstDraw,int & totalTextY,int & scroll,int & textY);
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 28/04/2019 16:04 | #


0xe6ff2136 est une adresse inutilisable donc elle est probablement fausse (m'étonnerait que tu ailles lire là-bas). Quant à 0x8804f800, c'est une adresse dans la deuxième moitié de la RAM, peut-être dans la pile ou dans le tas ; en tous cas pas du code, je doute que tu alloues dynamiquement du code ?

Ce genre d'erreur où ajouter du code semble causer des problèmes avant que le code en question soit exécuté... c'est bizarre, hein ? Ça m'est arrivé plusieurs fois et à chaque fois c'était un problème d'alignment ou de linker sur mes données ; ajouter du code décalait des choses dans la mémoire et causait un problème à cause du changement d'adresse.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Parisse Hors ligne Membre Points: 506 Défis: 0 Message

Citer : Posté le 28/04/2019 16:32 | #


Je me demande si ce n'est pas la fonction textarea_disp qui aurait un bug avec des chaines C qui ecraserait une adresse de retour sur la pile, je cherche...

Ajouté le 28/04/2019 à 16:40 :
Bon, je ne sais pas si j'ai trouve, mais en allouant une chaine sur la pile au lieu du malloc/free qui etait a l'origine, ca ne crashe plus. Et c'est de toute facon bien mieux d'allouer sur la pile

Ajouté le 29/04/2019 à 18:26 :
Update avec l'editeur de script qui fonctionne a peu pres et les menus a peu pres finalises.
Comment fonctionne les touches CLIP et PASTE, on peut les capturer ? Ca n'a pas l'air du tout la meme chose que sur la 90.
Lephenixnoir En ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 29/04/2019 18:27 | #


D'après la doc tu peux les capturer avec KEY_CTRL_CLIP et KEY_CTRL_PASTE. Je n'ai jamais essayé, cependant.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 71 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