fxSDK, un SDK alternatif pour écrire des add-ins
Posté le 29/08/2014 22:00
Cette page sert d'index pour la série de topics du fxSDK.
Le fxSDK est une collection d'outils permettant de développer des add-ins pour les calculatrices Casio des séries Graph. C'est une alternative au
fx-9860G SDK et
PrizmSDK qui ne sont plus activement maintenus, et le compagnon classique de mon noyau
gint.
Index des topics
Ce projet existe depuis 2015, alors il y a pas mal de topics liés. En voici une liste complète !
Topics principaux
Installation du fxSDK
Tutoriels
Compatibilité sur calculatrice et PC
Côté PC, le fxSDK est compatible avec
Linux, Mac OS, et WSL pour Windows ; normalement tout le monde peut l'utiliser. Je teste constamment sous Linux, et WSL est un Linux donc c'est testé aussi. Je n'ai pas de Mac OS donc il peut y avoir quelques surprises, mais en général c'est l'affaire de corriger un bug ou deux.
En termes de calculatrices, le fxSDK supporte :
Calculatrices monochromes
- Graph 35+E II
- Graph 35+ USB / Graph 35+E (SH3/SH4)
- Graph 75/75+/75+E
- Graph 85/85 SD/95 (SD) (pas activement testé)
Calculatrices couleurs
- Graph 90+E / fx-CG 50
- Prizm fx-CG 10/20
Comment installer le fxSDK et coder des add-ins
Le fxSDK s'installe à partir de dépôts Git sur la
forge de Planète Casio (par exemple
Lephenixnoir/fxsdk). Il y en a un peu beaucoup, donc manuellement c'est assez long. Pour que ça aille plus vite et pour simplifier le travail des débutants, il y a un outil appelé
GiteaPC qui peut faire ça pour vous.
Si vous utilisez Windows, vous aurez besoin de WSL pour accéder à un système Linux dans Windows. Heureusement, Microsoft a fait ça bien et c'est facile à faire. Voyez le
tutoriel d'installation de WSL 2 (et l'explication rapide de
ce que WSL 2 est).
Si vous utilisez Mac OS, ouvrez l’œil en lisant les topics pour ne pas manquer les informations supplémentaires et éventuelles déviations par rapport à la procédure normale sous Linux.
Méthode automatique avec GiteaPC (plus rapide / recommandée pour les débutants)
- Suivez le tutoriel d'utilisation de GiteaPC, qui explique comment obtenir le fxSDK.
Méthode automatique avec plugin VS Code
- Yannis300307 a créé un plugin VS Code Casio Dev Tools qui fonctionne sous Windows (avec WSL) et Debian (probablement les dérivés aussi).
Méthode AUR pour les utilisateurs Arch/Manjaro/dérivés (ils se reconnaîtront)
- Dark Storm maintient MiddleArch, un dépôt de paquets précompilés qui a entre autres le fxSDK.
Méthode manuelle (plus fine / classique pour les habitués)
- Compilez et installez le cross-compilateur GCC pour SuperH.
- installez (dans cet ordre) les dépôts fxSDK, OpenLibm, fxlibc, gint ; en option, Slyvtt/µSTL_2.3.
Description sommaire du fxSDK
Pour une introduction à l'utilisation du fxSDK qui montre comment utiliser les outils pour développer un add-in, lisez plutôt les
tutoriels d'utilisation de gint. Cette section est juste une description sommaire.
Le cœur du fxSDK est un cross-compilateur GCC pour SuperH, habituellement nommé
sh-elf-gcc. Bien sûr on a avec toute la suite d'outils, dont
as,
ld,
objdump,
objcopy (entre autres). Contrairement au vieux compilateur du SDK, GCC est un compilateur moderne avec beaucoup d'options et capable de très solides optimisations.
Sur la calculatrice, c'est
le noyau gint qui fait la majorité du travail. Il remplace fxlib/libfxcg et une partie de l'OS pour vous offrir des fonctionnalités plus cool et plus rapides. Les add-ins développés avec le fxSDK utilisent gint toutes les trois lignes !
Il y a enfin plusieurs outils utiles sur le PC qui sont utilisés durant le développement ou l'utilisation des add-ins :
- fxsdk est un script shell qui permet de créer et compiler les projets sans se prendre trop la tête. Le système de compilation officiel pour les add-ins est CMake, mais un système plus ancien de Makefile est encore supporté.
- fxconv est un outil très polyvalent qui convertit à la compilation les assets (images, polices, maps....). Il permet de travailler avec des logiciels et formats de fichiers normaux sur le PC et d'avoir automatiquement un format optimisé sur la calculatrice. fxconv est extrêmement extensible et chaque projet peut ajouter des conversions personnalisées.
- fxgxa crée les fichiers g1a (format des add-ins pour Graph monochromes) et g3a (format des add-ins pour Graph couleurs) à partir des programmes compilés.
- fxlink est un outil de communication qui peut transférer des fichiers vers les Graph 35+E II et Graph 90+E en ligne de commande, mais aussi échanger interactivement avec les add-ins gint par le câble USB, et est couramment utilisé pour réaliser des captures d'écran ou captures vidéo des add-ins.
Changelog et informations techniques
Ci-dessous se trouve la liste des posts annonçant les nouvelles versions du fxSDK, ainsi que des liens vers les instructions/tutoriels supplémentaires publiés avec.
Citer : Posté le 03/02/2024 13:23 | #
Le mode append n'est pas bien supporté mais oui tu peux réécrire dans un fichier sans le supprimer. C'est le cas sur 35+E II et 90+E.
Citer : Posté le 03/02/2024 13:32 | #
On peut modifier juste quelques bytes dans le fichier sans avoir à tout réécrire ? Il me semble que j'avais eu des problèmes ou je devais supprimer le fichier avant de le recréée de 0.
Citer : Posté le 03/02/2024 13:50 | #
Sur le vieux fs avant le 35+E II ou la Prizm il fallait. Sur le nouveau fs c'est bon. C'est l'un des quelques bénéfices qu'on récupère en échange de l'atroce lenteur.
Citer : Posté le 10/04/2024 18:26 | #
heu j'ai un prit problème je comprends pas pq j'ai cette erreur
CMake Error at CMakeLists.txt:10 (find_package):
By not providing "FindGint.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Gint", but
CMake did not find one.
Could not find a package configuration file provided by "Gint" (requested
version 2.9) with any of the following names:
GintConfig.cmake
gint-config.cmake
Add the installation prefix of "Gint" to CMAKE_PREFIX_PATH or set
"Gint_DIR" to a directory containing one of the above files. If "Gint"
provides a separate development package or SDK, be sure it has been
installed.
-- Configuring incomplete, errors occurred!
See also "/home/dualforce/CasioTiles/build-cg/CMakeFiles/CMakeOutput.log".
See also "/home/dualforce/CasioTiles/build-cg/CMakeFiles/CMakeError.log".
Collège fx92+
Aucun projet en cour faut déjà que j'apprenne a faire des add-in et donc a programmer en C un minimum
Citer : Posté le 10/04/2024 18:28 | #
gint n'est pas installé. Comment est-ce que tu as installé le fxSDK ? Si tu as pris la méthode GiteaPC, assure-toi d'avoir été à la fin de la section "Installation du fxSDK avec GiteaPC" de cette page.
Citer : Posté le 10/04/2024 18:31 | #
a oui jai oublie giteapc install Lephenixnoir/gint vu que j'ai lu trop vite
Collège fx92+
Aucun projet en cour faut déjà que j'apprenne a faire des add-in et donc a programmer en C un minimum
Citer : Posté le 06/07/2024 10:24 | #
Nouvelle version : fxSDK 2.11.0
Release associée de gint : gint 2.11.0
Release associée de la fxlibc : fxlibc 1.5.1
⚠️ Vous devez réinstaller les libs et recompiler vos add-ins avec -B. Instructions ci-dessous.
C'est la première version sortie depuis plus d'un an, donc il y a plein de petites choses à dire.
Fonctionnalités majeures :
Nouveautés un peu moins majeures :
Et quelques détails :
Améliorations de performance : LTO et soft-fp
Cette version du fxSDK affecte le compilateur, GCC, de deux façons qui amélioreront la performance des add-ins.
D'abord, elle active pour tous les projets et bibliothèques la LTO, ou Link-Time Optimization, qui est une forme d'optimisation qui se fait à la toute dernière étape de compilation. Sans rentrer dans les détails, contrairement aux optimisations classiques qui n'optimisent qu'un seul fichier à la fois, la LTO peut optimiser les fichiers entre eux, ce qui améliore à la fois la vitesse du programme et la taille du code.
De plus, suite au topic GCC vs Renesas SHC compiler de CalcLoverHK, j'ai modifié la configuration de GCC pour utiliser une version plus rapide du code de calcul en point flottant ("soft-fp" au lieu de "fp-bit"). Ça donne une accélération entre 2x et 3x pour les calculs en float et double en C, ce qui affecte vos add-ins mais aussi les fonctions de maths de la lib standard.
Instructions de mise à jour
Cette mise à jour du fxSDK contient une mise à jour de GCC. Modifier le compilateur signifie qu'il faut réinstaller tout le reste des bibliothèques (surtout si on utilise la LTO), du coup il n'y a pas vraiment de "mise à jour" ici c'est surtout une désinstallation + réinstallation.
Avec GiteaPC, désinstallez d'abord tous les dépôts liés au SDK, ce qui probablement tous sauf GiteaPC lui-même (utilisez giteapc list pour avoir la liste) :
% giteapc uninstall fxsdk
Ensuite resuivez la procédure d'installation, ce qui vous donne ça en accéléré :
% giteapc install Lephenixnoir/sh-elf-gdb
% giteapc install Lephenixnoir/OpenLibm Vhex-Kernel-Core/fxlibc
% giteapc install Lephenixnoir/sh-elf-gcc
% giteapc install Lephenixnoir/gint # ... et autres bibliothèques
Ça va recompiler binutils, gcc et gdb ce qui prend du temps. Selon la puissance de votre machine comptez entre 15 minutes et une heure. Vous pouvez faire autre chose en même temps, il vous suffit de garder un oeil dessus.
Citer : Posté le 09/07/2024 09:58 | #
J'avais pas vu passer ce post, la LTO et l'amélioration des calculs en float me semblent vraiment très intéressants.
Je vais tester sur la librairie cBox2D qui utilise intensément les calculs en virgule flottante pour voir si on observe une amélioration des performances.
Je ferai un petit post au passage pour vous donner les résultats.
Citer : Posté le 09/07/2024 21:33 | # | Fichier joint
Je rencontre des problèmes en cascade avec la compilation de cBox2D.
Après avoir réinstallé toutes les composantes du fxSDK, je me prends des erreurs sur un manque de header dans la freestanding :
[ 2%] Building CXX object CMakeFiles/cBox2D.dir/src/collision/b2_broad_phase.cpp.obj
Dans le fichier inclus depuis /home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/cmath:41,
depuis /home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/math.h:36,
depuis /home/sylvain/.local/share/giteapc/Slyvtt/cBox2D/include/box2d/b2_math.h:26,
depuis /home/sylvain/.local/share/giteapc/Slyvtt/cBox2D/include/box2d/b2_collision.h:29,
depuis /home/sylvain/.local/share/giteapc/Slyvtt/cBox2D/include/box2d/b2_broad_phase.h:28,
depuis /home/sylvain/.local/share/giteapc/Slyvtt/cBox2D/src/collision/b2_broad_phase.cpp:23:
/home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/bits/requires_hosted.h:34:4: erreur: #error "This header is not available in freestanding mode."
34 | # error "This header is not available in freestanding mode."
| ^~~~~
Dans le fichier inclus depuis /home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/bits/specfun.h:47,
depuis /home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/cmath:3898:
/home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/tr1/gamma.tcc: Dans la fonction « _Tp std::__detail::__log_gamma(_Tp) »:
/home/sylvain/.local/share/fxsdk/sysroot/sh3eb-elf/include/c++/14.1.0/tr1/gamma.tcc:236:18: erreur: « __throw_domain_error » n'est pas un membre de « std »; vouliez-vous employer « __throw_runtime_error » ?
236 | std::__throw_domain_error(__N("Argument is nonpositive integer "
| ^~~~~~~~~~~~~~~~~~~~
| __throw_runtime_error
Je mets la sortie complète de l'installation avortée de cBox2D en PJ.
Est-ce lié à la montée de version de GCC en 14.1.0 ?
Citer : Posté le 09/07/2024 22:04 | #
Ajoute -fno-freestanding aux flags de compilation. Le fxSDK utilise -ffreestanding parce que l'environnement d'exécution était historiquement loin du standard. Mais ça implique un mode dégradé pour la lib C++. On doit être capables de l'enlever maintenant ; je vais expérimenter en local sans -ffreestanding et on verra.
Citer : Posté le 10/07/2024 07:57 | #
Merci Lephe, ça passe crème en effet désormais.
Je mettrai à jour le dépôt afin de tenir compte de ces erreurs.
J'ai donc pu comparer le même exécutable (le programme d'exemple d'application de cBox2D) et le gain de performance est vraiment notable.
Lorsque il n'y a pas d'objet "dynamique", les temps d'update de la boucle de calcul Box2D passent de 0,225ms à 0,194ms. Ce qui n'est pas énorme, par contre on a un FPS qui passe de 49ips à 51ips.
Lors de la mise en place de blocs "dynamiques", avec calculs de collisions et de gravité, là le gain devient vraiment très impressionnant. Avec 11 blocs rectangulaires, je passe de 1-2ips (voir moins) à 10-12ips.
Il faudrait que je regarde plus dans le détail, mais ça rentabilise le prix d'une recompilation
Par contre pour la taille de l'addin, je note une augmentation de taille. Celui-ci passe de 259ko à 266ko. C'est pas énorme, mais on a une légère perte.
Citer : Posté le 17/07/2024 04:56 | #
Nouvelle version : fxSDK 2.11.0
Release associée de gint : gint 2.11.0
Release associée de la fxlibc : fxlibc 1.5.1
⚠️ Vous devez réinstaller les libs et recompiler vos add-ins avec -B. Instructions ci-dessous.
C'est la première version sortie depuis plus d'un an, donc il y a plein de petites choses à dire.
Fonctionnalités majeures :
Nouveautés un peu moins majeures :
Et quelques détails :
Améliorations de performance : LTO et soft-fp
Cette version du fxSDK affecte le compilateur, GCC, de deux façons qui amélioreront la performance des add-ins.
D'abord, elle active pour tous les projets et bibliothèques la LTO, ou Link-Time Optimization, qui est une forme d'optimisation qui se fait à la toute dernière étape de compilation. Sans rentrer dans les détails, contrairement aux optimisations classiques qui n'optimisent qu'un seul fichier à la fois, la LTO peut optimiser les fichiers entre eux, ce qui améliore à la fois la vitesse du programme et la taille du code.
De plus, suite au topic GCC vs Renesas SHC compiler de CalcLoverHK, j'ai modifié la configuration de GCC pour utiliser une version plus rapide du code de calcul en point flottant ("soft-fp" au lieu de "fp-bit"). Ça donne une accélération entre 2x et 3x pour les calculs en float et double en C, ce qui affecte vos add-ins mais aussi les fonctions de maths de la lib standard.
Instructions de mise à jour
Cette mise à jour du fxSDK contient une mise à jour de GCC. Modifier le compilateur signifie qu'il faut réinstaller tout le reste des bibliothèques (surtout si on utilise la LTO), du coup il n'y a pas vraiment de "mise à jour" ici c'est surtout une désinstallation + réinstallation.
Avec GiteaPC, désinstallez d'abord tous les dépôts liés au SDK, ce qui probablement tous sauf GiteaPC lui-même (utilisez giteapc list pour avoir la liste) :
% giteapc uninstall fxsdk
Ensuite resuivez la procédure d'installation, ce qui vous donne ça en accéléré :
% giteapc install Lephenixnoir/sh-elf-gdb
% giteapc install Lephenixnoir/OpenLibm Vhex-Kernel-Core/fxlibc
% giteapc install Lephenixnoir/sh-elf-gcc
% giteapc install Lephenixnoir/gint # ... et autres bibliothèques
Ça va recompiler binutils, gcc et gdb ce qui prend du temps. Selon la puissance de votre machine comptez entre 15 minutes et une heure. Vous pouvez faire autre chose en même temps, il vous suffit de garder un oeil dessus.
Why can't we use giteapc install -u to update everything?
Citer : Posté le 17/07/2024 07:53 | #
Good question. This is because there is a bit of friction in a source-based distribution and GiteaPC is a fairly primitive tool that doesn't handle it perfectly. If you update with giteapc install -u, there are mostly two problems that I identified (there could be more along the same lines).
The first is that since part of GCC's install folders are versioned, you would have some of the old GCC 11 files staying around while the new GCC 14 would override part of the others. While not immediately a breaking issue, I dislike letting that happen because it makes debugging more complicated when someone's install fails.
The second is that because CMake does not count the compiler as a dependency for some reason, libraries would not be automatically rebuilt. However, it's important to use libraries built with the same compiler version, for consistency, to avoid potential weird bugs, and in fact with LTO it is absolutely necessary because the object files in LTO contain code written in a compiler-version-specific format.
There's no conceptual limit preventing the update with giteapc install -u, but it's more consistent to reinstall (and not longer anyway). To be honest, debugging bad SDK installs on other people's machines is not a pleasant experience, so I try to avoid it. x_x
Citer : Posté le 31/07/2024 14:13 | #
Hello les gens !
J'ai essayé de mettre a jour gint en tapant ces commandes :
giteapc install Lephenixnoir/libprof
giteapc install -u sh-elf-binutils sh-elf-gcc fxsdk gint libprof
Et j'ai eu ces erreur :
[ 64%] Building C object CMakeFiles/fxlink.dir/fxlink/tui/layout.c.o
[ 67%] Building C object CMakeFiles/fxlink.dir/fxlink/tui/render.c.o
[ 70%] Building C object CMakeFiles/fxlink.dir/fxlink/tui/tui-interactive.c.o
make[3]: *** No rule to make target '/usr/lib/x86_64-linux-gnu/libSDL2.so', needed by 'fxlink'. Stop.
make[3]: Leaving directory '/root/.local/share/giteapc/Lephenixnoir/fxsdk/build'
make[2]: *** [CMakeFiles/Makefile2:113: CMakeFiles/fxlink.dir/all] Error 2
make[2]: Leaving directory '/root/.local/share/giteapc/Lephenixnoir/fxsdk/build'
make[1]: *** [Makefile:130: all] Error 2
make[1]: Leaving directory '/root/.local/share/giteapc/Lephenixnoir/fxsdk/build'
make: *** [giteapc.make:15: build] Error 2
error: error 2 in command: make -f giteapc.make build
Albert Einstein
Citer : Posté le 31/07/2024 14:47 | #
Tu peux utiliser un -u sans dépôt pour MaJ tout, sauf dans le cas où il a une grosse MaJ
Là c'est le cas, voir ce post de Lephé. C'est probalement a cause de ça que le build échoue
Caltos : G35+EII, G90+E (briquée )
Citer : Posté le 31/07/2024 14:54 | #
Ça pue le dossier de build qui a pourri après une mise à jour, tu peux aller dans cd $(giteapc show -p fxsdk), rm -rf build, et réessaie de giteapc install fxsdk.
Citer : Posté le 31/07/2024 14:55 | #
Okay merci !
Mais du coup j'ai tout réinstallé, mais je n'ai plus le libsupc++.a
j'ai fait fxsdk path lib pour récupérer le path
mais quand je fait ls il n'est plus là
Albert Einstein
Citer : Posté le 31/07/2024 14:57 | #
Une fois que tu as fxlibc il faut réinstaller gcc, ça retourne dans le dossier de build et ça compile la lib C++
Citer : Posté le 18/11/2024 16:40 | #
Bonjour,
Je viens de installer le fxSDK, mais je n'arrive pas a utiliser les fonctions de stdio.h. J'ai essaié printf et sprintf, l'addin compile comme il faut, mais rien ne ce passe quand je lance l'addin. J'ai ajouté les lib c et m dans target_link_libraries pour voir s'y ça fait quelque chose, mais l'addin fait toujour la meme chose. sprintf ne fait rien non-plus, si l'array est deja defini avant rien n'est écrasé. Je suis un peut perdu
Citer : Posté le 18/11/2024 16:49 | #
Bonjour ! Tu as bien accès à ces fonctions sans toucher à target_link_libraries() car la libc est incluse par défaut.
sprintf() devrait totalement marcher, gint s'en sert tout le temps. Je veux bien voir ton code : peut-être qu'un problème s'est glissé dedans. (Y'a que les formats flottants %f et compagnie qu'il faut activer manuellement, ils prennent beaucoup de place et tout le monde n'en a pas besoin.)
Pour printf(), il y a quelque chose d'un peu inhabituel. Quand tu lances un add-in t'as juste un écran pour dessiner, pas de "terminal" où envoyer la sortie standard, et donc printf() ne sait pas quoi faire du texte. gint te propose de spécifier une fonction qui récupère le texte et en fait ce qui t'intéresse (habituellement : l'affiche à l'écran). Vois le tutoriel de capture des flux standard.
Note que si tu es en train d'écrire un programme de zéro, la façon la plus simple d'afficher à l'écran est d'utiliser dprint(), qui fait comme printf() mais à une position à l'écran :
dclear(C_WHITE);
// Dessin du texte "6*7=0042" au pixel x=2, y=3
dprint(2, 3, "6*7=%04d", 6*7);
// Mise à jour de l'écran
dupdate();
gint a toute une variété de fonctions dont le nom commence par d qui permettent de dessiner. Une bonne partie est listée dans <gint/display.h> avec quelques définitions en plus dans <gint/display-fx.h> et <gint/display-cg.h> selon ton modèle.
Citer : Posté le 18/11/2024 17:21 | #
Ah, bas justement j'éssai d'utiliser les flottants! Alors ça s'explique tout seul. Je n'ai pas trouvé comment les activer