gint : un noyau pour développer des add-ins
Posté le 20/02/2015 17:30
Ce topic fait partie de la série de topics du fxSDK.
En plus des options de programmation intégrée comme le Basic Casio ou Python, la plupart des calculatrices Casio supportent des
add-ins, des programmes natifs très polyvalents avec d'excellentes performances. Les add-ins sont généralement programmés en C/C++ avec l'aide d'un ensemble d'outils appelé SDK.
Plusieurs SDK ont été utilisés par la communauté avec le temps. D'abord le
fx-9860G SDK de Casio avec fxlib pour Graph monochromes (plus maintenu depuis longtemps). Puis le
PrizmSDK avec libfxcg pour Prizm et Graph 90+E (encore un peu actif sur Cemetech). Et plus récemment celui que je maintiens, le
fxSDK, dont gint est le composant principal.
gint est un unikernel, ce qui veut dire qu'il embarque essentiellement un OS indépendant dans les add-ins au lieu d'utiliser les fonctions de l'OS de Casio. Ça lui permet beaucoup de finesse sur le contrôle du matériel, notamment la mémoire, le clavier, l'écran et les horloges ; mais aussi de meilleures performances sur le dessin, les drivers et la gestion des interruptions, plus des choses entièrement nouvelles comme le moteur de gris sur Graph monochromes.
Les sources de gint sont sur la forge de Planète Casio :
dépôt Gitea Lephenixnoir/gint
Aperçu des fonctionnalités
Les fonctionnalités phares de gint (avec le fxSDK) incluent :
- Toutes vos images et polices converties automatiquement depuis le PNG, sans code à copier (via fxconv)
- Un contrôle détaillé du clavier, avec un GetKey() personnalisable et un système d'événements à la SDL
- Une bibliothèque standard C plus fournie que celle de Casio (voir fxlibc), et la majorité de la bibliothèque C++
- Plein de raccourcis pratiques, comme pour afficher la valeur d'une variable : dprint(1,1,"x=%d",x)
- Des fonctions de dessin, d'images et de texte optimisées à la main et super rapides, surtout sur Graph 90+E
- Des timers très précis (60 ns / 30 µs selon les cas, au lieu des 25 ms de l'OS), indispensables pour les jeux
- Captures d'écran et capture vidéo des add-ins par USB, en temps réel (via fxlink)
Avec quelques mentions spéciales sur les Graph monochromes :
Un moteur de gris pour faire des jeux en 4 couleurs !
La compatibilité SH3, SH4 et Graph 35+E II, avec un seul fichier g1a
Une API Unix/POSIX et standard C pour accéder au système de fichiers (Graph 35+E II seulement)
Et quelques mentions spéciales sur les Graph 90+E :
Une nouvelle police de texte, plus lisible et économe en espace
Le dessin en plein écran, sans les bordures blanches et la barre de statut !
Un driver écran capable de triple-buffering
Une API Unix/POSIX et standard C pour accéder au système de fichiers
Galerie d'add-ins et de photos
Voici quelques photos et add-ins réalisés avec gint au cours des années !
Arena (2016) — Plague (2021)
Rogue Life (2021)
Momento (2021)
Communication avec le PC (cliquez pour agrandir)
Utiliser gint pour développer des add-ins
Les instructions pour installer et utiliser gint sont données dans les divers tutoriels recensés dans le
topic du fxSDK. Il y a différentes méthodes de la plus automatique (GiteaPC) à la plus manuelle (compilation/installation de chaque dépôt). Le fxSDK est compatible avec Linux, Mac OS, et marche aussi sous Windows avec l'aide de WSL, donc normalement tout le monde est couvert
Notez en particulier qu'il y a des
tutoriels de développement qui couvrent les bases ; tout le reste est expliqué dans les en-têtes (fichiers
.h) de la bibliothèque que vous pouvez
consulter en ligne, ou dans les ajouts aux changelogs ci-dessous.
Changelog et informations techniques
Pour tester les fonctionnalités et la compatibilité de gint, j'utilise un add-in de test appelé gintctl (
dépôt Gitea Lephenixnoir/gintctl). Il contient aussi une poignée d'utilitaires d'ordre général.
Ci-dessous se trouve la liste des posts indiquant les nouvelles versions de gint, et des liens vers des instructions/tutoriels supplémentaires qui accompagnent ces versions.
Anecdotes et bugs pétés
Ô amateurs de bas niveau, j'espère que vous ne tomberez pas dans les mêmes pièges que moi.
TODO list pour les prochaines versions (2023-04-03)
gint 2.11
- Changements de contextes CPU. À reprendre du prototype de threading de Yatis pour permettre l'implémentation d'un véritable ordonnanceur. Demandé par si pour faire du threading Java.
- Applications USB. Ajouter le support de descripteurs de fichiers USB. Potentiellement pousser jusqu'à avoir GDB pour debugger.
- Support de scanf() dans la fxlibc. Codé par SlyVTT, plus qu'à nettoyer et fusionner.
Non classé
- Regarder du côté serial (plus facile que l'USB) pour la communication inter-calculatrices (multijoueur) et ultimement l'audio (libsnd de TSWilliamson).
- Un système pour recompiler des add-ins mono sur la Graph 90+E avec une adaptation automatique.
- Support des fichiers en RAM pour pouvoir utiliser l'API haut-niveau sur tous les modèles et éviter la lenteur de BFile à l'écriture quand on a assez de RAM.
Citer : Posté le 30/04/2018 20:22 | #
Merci de ton aide !
Le problème de disparation des add-ins est connu même s'il n'y a pas de solution claire. Je m'y suis frotté à plusieurs occasions, notamment quand j'ai utilisé une mauvaise zone de RAM sur les premières versions SH4 de gint [#133735]. J'ai déjà réussi à le résoudre en optimisant la mémoire de stockage. Il y a peut-être d'autres solutions ; le reset complet est définitivement la plus brutale.
Citer : Posté le 30/04/2018 20:24 | #
Normalement il faudrait juste dire à l'OS de re-scanner la mémoire principale pour les addins, il y a un syscall qui fait ça donc il suffirait de transférer un addin qui exécute ce syscall. L'optimisation appelle ce syscall car les adresses des addins dans le tableau des addins doivent être updatées, donc ça aurait pu régler ton problème.
Ecrivez vos programmes basic sur PC avec BIDE
Citer : Posté le 29/05/2018 19:10 | #
Normalement il faudrait juste dire à l'OS de re-scanner la mémoire principale pour les addins, il y a un syscall qui fait ça donc il suffirait de transférer un addin qui exécute ce syscall.
Je n'ai pas réussi à obtenir un résultat avec le syscall, par contre, j'ai réussi à trouver le problème...figurez-vous qu'il venait de...........FA-124
Tout mais add-in était corrompue, j'ai réinstallé FA-124 et c’était bon x)
Et le problème était bizarre: impossible de recevoir de add in via USB et 3-pins.
Quand je transférais un truc (basic, g1a, etc.) via 3-pins le transfert avait bien lieu, le programme était bien dans la mémoire de l'autre calot...mais impossible d'y accéder x)
Même après des changements d'OS, optimisation, formatage complet...bref c'était très bizarre
A part ça, gint a du nouveaux depuis 1 mois ?
Citer : Posté le 29/05/2018 19:14 | #
Eh bien, actuellement, j'ai bientôt fini de documenter les 1 (SH3) / 6 (SH4) timers supplémentaires à 32 kHz ajoutés par Casio. Je vais écrire les gestionnaires d'interruption et je pourrai finaliser le timer !
Ensuite, je ferai du graphique - à la fois sur la G85 et sur la G90. Je vous ferai une démo sympa sur la G90 !
Pour l'instant je suis en examens et après je serai en stage, alors ça ne pourra pas aller très vite... mais je vais faire de mon mieux pour vous donner des nouvelles régulières.
Citer : Posté le 12/06/2018 19:53 | #
Salut, c'est encore moi avec un problème avec la toolchain GCC!
J'ai un problème assez étrange pour compiler et installer gint...
make me donne:
mkdir build
gcc src/ctype/ctype_classes.c
gcc src/ctype/ctype_functions.c
gcc src/math/math_qdiv.c
as src/setjmp/setjmp.s
gcc src/stdio/sprintf.c
gcc src/stdio/snprintf.c
gcc src/stdio/stdio_format.c
gcc src/stdio/vsprintf.c
gcc src/stdio/vsnprintf.c
gcc src/stdlib/realloc.c
gcc src/stdlib/free.c
gcc src/stdlib/stdlib_abs.c
gcc src/stdlib/stdlib_rand.c
gcc src/stdlib/malloc.c
gcc src/stdlib/stdlib_div.c
gcc src/stdlib/calloc.c
gcc src/string/memchr.c
gcc src/string/strlen.c
gcc src/string/strcmp.c
gcc src/string/memcmp.c
gcc src/string/strcpy.c
gcc src/string/memcpy.c
gcc src/string/strnlen.c
gcc src/string/strncpy.c
gcc src/string/memset.c
gcc src/string/strchr.c
gcc src/time/time.c
gcc src/time/time_misc.c
gcc src/time/asctime.c
gcc src/time/time_util.c
gcc src/time/gmtime.c
gcc src/time/mktime.c
gcc src/time/ctime.c
ar ar libc.a
» Succesfully built libc (30624 bytes)
gcc src/bopti/bopti_internals.c
gcc src/bopti/dimage.c
gcc src/bopti/gimage.c
gcc src/clock/clock.c
gcc src/core/modules.c
gcc src/core/interrupt_maps_7305.c
gcc src/core/vbr_space.c
gcc src/core/interrupts.c
gcc src/core/gint_sh7705.c
gcc src/core/init_quit.c
gcc src/core/exceptions.c
gcc src/core/mpu.c
gcc src/core/interrupt_maps_7705.c
gcc src/core/gint.c
gcc src/core/gint_sh7305.c
as src/core/syscalls.s
as src/core/gint_vbr.s
gcc src/display/getMasks.c
gcc src/display/drect.c
gcc src/display/display_vram.c
gcc src/display/adjustRectangle.c
gcc src/display/dclear.c
gcc src/display/dpixel.c
gcc src/display/dupdate.c
gcc src/display/dline.c
gcc src/events/event_get.c
gcc src/events/event_push.c
gcc src/gray/gray_engine.c
gcc src/gray/gclear.c
gcc src/gray/gpixel.c
gcc src/gray/gline.c
gcc src/gray/grect.c
gcc src/init/crt0.c
gcc src/init/util.c
gcc src/keyboard/key_char.c
gcc src/keyboard/keyboard_sh7305.c
gcc src/keyboard/getkey.c
gcc src/keyboard/keyboard_sh7705.c
gcc src/keyboard/key_id.c
gcc src/keyboard/key_type.c
gcc src/keyboard/getPressedKeys.c
gcc src/keyboard/keyboard_core.c
gcc src/mmu/pseudoTLBInit.c
gcc src/rtc/rtc_callback.c
gcc src/rtc/rtc_getTime.c
gcc src/rtc/rtc_setTime.c
gcc src/rtc/rtc_interrupt.c
gcc src/screen/screen_display.c
gcc src/screen/screen_backlight.c
gcc src/tales/tales_gray.c
gcc src/tales/gprint.c
gcc src/tales/dprint.c
gcc src/tales/gtext.c
gcc src/tales/tales_internals.c
gcc src/tales/text_length.c
gcc src/tales/dtext.c
gcc src/tales/tales_configuration.c
gcc src/timer/common_api.c
gcc src/timer/virtual_timers.c
gcc src/timer/hardware_timers.c
fxconv -font src/display/font_system.bmp
ld build/version.o
sh3eb-elf-objcopy: error: the input file 'build/version.o' has no sections
Makefile:203 : la recette pour la cible « build/version.o » a échouée
make: *** [build/version.o] Erreur 1
Ce qui est assez étrange, étant donné que c'est pas sensé être une erreur...
Par contre, un make gintdemo.g1a fonctionne parfaitement.
Et si je make install quand même, il ne retourne pas d'erreur (mais quand je compile après il me donne une erreur).
sh3eb-elf-gcc `fxsdk --clfags` -c main.c -o main.o -I include -I `fxsdk --folder`/gint -I `fxsdk --folder` -Wall
In file included from /home/Nathan/share/fxsdk/gint/display.h:14,
from main.c:1:
/home/Nathan/opt/sh3eb-elf/lib/gcc/sh3eb-elf/8.1.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory
# include_next <stdint.h>
^~~~~~~~~~
compilation terminated.
Makefile:29 : la recette pour la cible « main.o » a échouée
make: *** [main.o] Erreur 1
Citer : Posté le 12/06/2018 20:01 | #
Prenons les choses dans l'ordre. Peux-tu effectuer make VERBOSE=1 dans le dépôt de gint pour m'afficher la commande qui a planté ? Je crois que je sais de quoi il s'agit, finalement.
L'erreur que tu rencontres à la compilation, c'est autre chose. Il faut passer -ffreestanding à gcc pour qu'il expose stdint.h sur ce système.
Citer : Posté le 12/06/2018 20:08 | #
Prenons les choses dans l'ordre. Peux-tu effectuer make VERBOSE=1 dans le dépôt de gint pour m'afficher la commande qui a planté ? Je crois que je sais de quoi il s'agit, finalement.
L'erreur que tu rencontres à la compilation, c'est autre chose. Il faut passer -ffreestanding à gcc pour qu'il expose stdint.h sur ce système.
J'arrive pas à croire que j'ai oublié le -ffreestanding
Maintenant, ld ne trouve pas -lc, mais c'est déjà plus un problème de GCC j'imagine.
Pour l'erreur de compilation de gint, make VERBOSE=1 me retourne ça:
mkdir -p build
sh3eb-elf-gcc -c src/ctype/ctype_classes.c -o build/ctype_ctype_classes.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/ctype/ctype_functions.c -o build/ctype_ctype_functions.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/math/math_qdiv.c -o build/math_math_qdiv.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-as -c src/setjmp/setjmp.s -o build/setjmp_setjmp.s.o
sh3eb-elf-gcc -c src/stdio/sprintf.c -o build/stdio_sprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/snprintf.c -o build/stdio_snprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/stdio_format.c -o build/stdio_stdio_format.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/vsprintf.c -o build/stdio_vsprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdio/vsnprintf.c -o build/stdio_vsnprintf.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/realloc.c -o build/stdlib_realloc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/free.c -o build/stdlib_free.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/stdlib_abs.c -o build/stdlib_stdlib_abs.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/stdlib_rand.c -o build/stdlib_stdlib_rand.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/malloc.c -o build/stdlib_malloc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/stdlib_div.c -o build/stdlib_stdlib_div.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/stdlib/calloc.c -o build/stdlib_calloc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memchr.c -o build/string_memchr.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strlen.c -o build/string_strlen.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strcmp.c -o build/string_strcmp.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memcmp.c -o build/string_memcmp.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strcpy.c -o build/string_strcpy.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memcpy.c -o build/string_memcpy.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strnlen.c -o build/string_strnlen.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strncpy.c -o build/string_strncpy.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/memset.c -o build/string_memset.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/string/strchr.c -o build/string_strchr.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/time.c -o build/time_time.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/time_misc.c -o build/time_time_misc.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/asctime.c -o build/time_asctime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/time_util.c -o build/time_time_util.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/gmtime.c -o build/time_gmtime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/mktime.c -o build/time_mktime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/time/ctime.c -o build/time_ctime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-ar rcs libc.a build/ctype_ctype_classes.c.o build/ctype_ctype_functions.c.o build/math_math_qdiv.c.o build/setjmp_setjmp.s.o build/stdio_sprintf.c.o build/stdio_snprintf.c.o build/stdio_stdio_format.c.o build/stdio_vsprintf.c.o build/stdio_vsnprintf.c.o build/stdlib_realloc.c.o build/stdlib_free.c.o build/stdlib_stdlib_abs.c.o build/stdlib_stdlib_rand.c.o build/stdlib_malloc.c.o build/stdlib_stdlib_div.c.o build/stdlib_calloc.c.o build/string_memchr.c.o build/string_strlen.c.o build/string_strcmp.c.o build/string_memcmp.c.o build/string_strcpy.c.o build/string_memcpy.c.o build/string_strnlen.c.o build/string_strncpy.c.o build/string_memset.c.o build/string_strchr.c.o build/time_time.c.o build/time_time_misc.c.o build/time_asctime.c.o build/time_time_util.c.o build/time_gmtime.c.o build/time_mktime.c.o build/time_ctime.c.o
» Succesfully built libc (30624 bytes)
sh3eb-elf-gcc -c src/bopti/bopti_internals.c -o build/bopti_bopti_internals.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/bopti/dimage.c -o build/bopti_dimage.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/bopti/gimage.c -o build/bopti_gimage.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/clock/clock.c -o build/clock_clock.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/modules.c -o build/core_modules.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/interrupt_maps_7305.c -o build/core_interrupt_maps_7305.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/vbr_space.c -o build/core_vbr_space.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/interrupts.c -o build/core_interrupts.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/gint_sh7705.c -o build/core_gint_sh7705.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/init_quit.c -o build/core_init_quit.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/exceptions.c -o build/core_exceptions.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/mpu.c -o build/core_mpu.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/interrupt_maps_7705.c -o build/core_interrupt_maps_7705.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/gint.c -o build/core_gint.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/core/gint_sh7305.c -o build/core_gint_sh7305.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-as -c src/core/syscalls.s -o build/core_syscalls.s.o
sh3eb-elf-as -c src/core/gint_vbr.s -o build/core_gint_vbr.s.o
sh3eb-elf-gcc -c src/display/getMasks.c -o build/display_getMasks.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/drect.c -o build/display_drect.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/display_vram.c -o build/display_display_vram.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/adjustRectangle.c -o build/display_adjustRectangle.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dclear.c -o build/display_dclear.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dpixel.c -o build/display_dpixel.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dupdate.c -o build/display_dupdate.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/display/dline.c -o build/display_dline.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/events/event_get.c -o build/events_event_get.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/events/event_push.c -o build/events_event_push.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gray_engine.c -o build/gray_gray_engine.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gclear.c -o build/gray_gclear.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gpixel.c -o build/gray_gpixel.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/gline.c -o build/gray_gline.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/gray/grect.c -o build/gray_grect.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/init/crt0.c -o build/init_crt0.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/init/util.c -o build/init_util.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/key_char.c -o build/keyboard_key_char.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/keyboard_sh7305.c -o build/keyboard_keyboard_sh7305.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/getkey.c -o build/keyboard_getkey.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/keyboard_sh7705.c -o build/keyboard_keyboard_sh7705.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/key_id.c -o build/keyboard_key_id.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/key_type.c -o build/keyboard_key_type.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/getPressedKeys.c -o build/keyboard_getPressedKeys.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/keyboard/keyboard_core.c -o build/keyboard_keyboard_core.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/mmu/pseudoTLBInit.c -o build/mmu_pseudoTLBInit.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_callback.c -o build/rtc_rtc_callback.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_getTime.c -o build/rtc_rtc_getTime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_setTime.c -o build/rtc_rtc_setTime.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/rtc/rtc_interrupt.c -o build/rtc_rtc_interrupt.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/screen/screen_display.c -o build/screen_screen_display.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/screen/screen_backlight.c -o build/screen_screen_backlight.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/tales_gray.c -o build/tales_tales_gray.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/gprint.c -o build/tales_gprint.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/dprint.c -o build/tales_dprint.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/gtext.c -o build/tales_gtext.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/tales_internals.c -o build/tales_tales_internals.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/text_length.c -o build/tales_text_length.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/dtext.c -o build/tales_dtext.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/tales/tales_configuration.c -o build/tales_tales_configuration.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/timer/common_api.c -o build/timer_common_api.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/timer/virtual_timers.c -o build/timer_virtual_timers.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
sh3eb-elf-gcc -c src/timer/hardware_timers.c -o build/timer_hardware_timers.c.o -m3 -mb -nostdlib -I include -ffreestanding -std=c11 -Os -Wall -Wextra @gcc.cfg -g0
fxconv -font src/display/font_system.bmp -o build/display_font_system.bmp.o -font -n gint_font_system
sh3eb-elf-ld -r -R build/version.o.txt -o build/version.o
sh3eb-elf-objcopy -R .stack build/version.o build/version.o
sh3eb-elf-objcopy: error: the input file 'build/version.o' has no sections
Makefile:203 : la recette pour la cible « build/version.o » a échouée
make: *** [build/version.o] Erreur 1
Citer : Posté le 12/06/2018 20:17 | #
Passe -nostdlib. Et normalement -ffreestanding implique -nostdlib, ce qui me fait dire que tu n'as pas passé au linker tous les flags de compilation. Tu devrais dès que tu linkes avec libgcc, c'est des détails qui traînent dans la doc mais qui peuvent te jouer un mauvais tour si tu l'oublies et que tu utilises des combinaisons d'options exotiques...
Ok, c'est ce que j'avais imaginé. Tu vois -R .stack ? C'est pour supprimer la section .stack, qui n'a aucune raison d'exister, mais que ma version du sh3eb-elf-ld me générait sans raison quand j'ai développé ce bout du code. Le ld x86 ne me le faisait pas, j'ai pensé que j'avais mal configuré le compilo et j'ai ajouté ça.
Sauf que le tien ne génère pas de section .stack, donc évidemment objcopy ne peut pas la supprimer. La vraie manière de procéder aurait été :
1. De générer le fichier sans -R .stack pour que ça marche à tous les coups
2. De jeter la section build/version.o(.stack) dans le linker script
Je viens de commit ça. N'oublie pas de nettoyer ou recompiler (make -B) parce que même si le objcopy échoue, comme le fichier de destination est le même que le fichier source, on peut continuer à compiler. D'ailleurs tu pourrais continuer comme tu es parti sans problème, mais c'est mieux de fixer le système de build.
Citer : Posté le 12/06/2018 20:37 | #
Passe -nostdlib. Et normalement -ffreestanding implique -nostdlib, ce qui me fait dire que tu n'as pas passé au linker tous les flags de compilation. Tu devrais dès que tu linkes avec libgcc, c'est des détails qui traînent dans la doc mais qui peuvent te jouer un mauvais tour si tu l'oublies et que tu utilises des combinaisons d'options exotiques...
Bizzare, fxsdk --cflags --ldflags me met pourtant le -ffreestanding tout seul... Mais en ajoutant le -nostdlib ça résout les problèmes de lib, effectivement. Par contre il arrive pas à linker correctement gint, il me manque tous les symboles... Faudra que j'essaie de réinstaller le fxsdk en entier pour voir...
Mais franchement la doc elle fait des miliers de lignes et c'est super chiant de trouver le flag qu'on veut dedans...J'imagine que j'ai signé pour ça en choisissant de compiler sur Linux...Je viens de commit ça. N'oublie pas de nettoyer ou recompiler (make -B) parce que même si le objcopy échoue, comme le fichier de destination est le même que le fichier source, on peut continuer à compiler. D'ailleurs tu pourrais continuer comme tu es parti sans problème, mais c'est mieux de fixer le système de build.
Oui, un make mrproper suivi de make puis de make install et plus aucune erreur
J'imagine que ça vient du combo GCC 8.1.0 et binutils 2.30 qui brise la rétrocompatibilité...
Note pour plus tard, la dernière version n'est pas forcément la meilleure.Citer : Posté le 12/06/2018 20:41 | #
Après un petit tour dans le manuel, je ne trouve pas trace de l'implication de -nostdlib par -ffreestanding. Je me suis peut-être mélangé les pinceaux...
La doc de GCC, il faut la parcourir avec la recherche, ou bien dans le manuel info, que tu peux trouver en ligne ( https://gcc.gnu.org/onlinedocs/ ).
Je ne sais pas trop d'où venait cette section .stack, mais le principal est que le problème soit résolu. Bon courage pour la suite de ton projet, et hésite pas à lâcher des détails sur le forum !
Citer : Posté le 12/06/2018 21:33 | #
Merci beaucoup
Oui, c'était effectivement un peu con d'essayer d'utiliser man pour la doc...
J'essaierai de mettre le programme en ligne avec un topic explicatif d'ici la semaine prochaine, avec les sources (GitHub ou le GitLab ?)
Citer : Posté le 12/06/2018 21:34 | #
Je dis ça mais j'utilise beaucoup le manuel quand il ne s'agit que des options...
Le Gitlab ! Le Gitlab !
Citer : Posté le 19/06/2018 12:29 | #
Je viens de tester Gint sur une sh3 la touche [menu] ne fonctionne pas (enfin le retour menu fonctionne une seule fois quand on appuie 2 fois sur le menu apres ça ne fonctionne plus du tout)
Citer : Posté le 19/06/2018 15:23 | #
Je vérifie dès que possible sur ma propre SH3. En attendant, il me faut une copie du bootlog (l'écran de contrôle de la figure 1). Tu peux me faire ça ?
Citer : Posté le 20/06/2018 17:13 | #
Voila
Citer : Posté le 01/08/2018 14:11 | #
(Note : Je n'oublie pas le bug que tu as trouvé, Yatis.)
J'ai fait marcher les timers supplémentaires de Casio ! On a donc sur SH4 (et donc sur Graph 90) :
- 3 timers précis à ~0.1 µs
- 6 timers précis à ~30 µs
J'ai monté un test assez solide pour tester tout ça : attendre 200 tranches de 50ms en changeant de timer à chaque tranche ! Je suis sensiblement convaincu que ça marche maintenant
Maintenant que j'ai implémenté les timers je vais pouvoir faire plusieurs choses cruciales :
- Des mesures de temps d'exécution réellement précises (100ns !)
- Donc un benchmarking très violent pour les applications limites en perfs (Windmill !)
- Améliorer le moteur de gris (couleurs légèrement plus stables)
- Mesurer la puissance de mon nouveau gestionnaire d'interruptions !
Ajouté le 01/08/2018 à 16:01 :
Une bonne chose faite : j'ai fait marcher tout ça sur SH3 également ! À quelques détails sur la façon dont le driver est structuré, s'il n'y a pas d'autres bugs, j'en ai fini avec les timers.
Je signale toutefois (si quelqu'un est intéressé par programmer du hardware) que les timers supplémentaires ont des comportements subtilement différents des timers normaux ; j'ai documenté les différences et adapté le code de gint mais c'est très fourbe et c'est ce qui m'a tenu en arrêt pas loin de deux mois.
Ajouté le 04/08/2018 à 17:56 :
Après avoir implémenté les timers sur Graph 90, j'ai remarqué que la fréquence que j'avais notée était surestimée. La fréquence réelle est un poil plus faible. Or j'ai tiré cette fréquence de calculs donnés par la doc qui marchent très bien sur Graph 75 SH4, et qui sont partagés par Ptune3.
Avant de pinger Sentaro21 sur ce problème, je veux m'assurer que les fréquences données par Ptune3 sont effectivement surestimées. Donc j'avais besoin de la RTC pour avoir un timer qui tourne à une fréquence bien connue d'avance.
J'ai donc porté mon ancien driver RTC sur SH4, puis - sans modification - sur Graph 90 et SH3. gint retrouve les fonctionnalités d'avant, mais cette fois en couleurs !
Plus de détails dans la RdP !
Ajouté le 04/08/2018 à 18:26 :
J'ai une autre bonne nouvelle.
Mon ancien gestionnaire d'interruptions arrivait à traiter 180'000 interruptions de timer par seconde. Il était en C et un peu bloated...
Mon nouveau gestionnaire, avec toutes les parties en assembleur, arrive à tenir 320'000 interruptions de timer par seconde !
La réactivité du gestionnaire d'interruptions est importante pour les applications qui exécuteront des tâches en boucle (son, transferts multijoueurs...). Le nouveau gestionnaire en assembleur devait améliorer ça : c'est chose faite !
Citer : Posté le 04/08/2018 19:49 | #
Good job!
Citer : Posté le 04/08/2018 22:08 | #
Bravo !
Je suis impressionné
Que veux-tu dire par "un benchmarking violent", en quoi ça pourrai me servir pour Windmill ?
Citer : Posté le 04/08/2018 22:14 | #
Merci à vous deux !
Si toutefois on arrivait à compiler Windmill sous gint... on pourrait se monter un profiler pour tracer quelles parties du code consomment le plus de temps de calcul, et avec une grande précision !
Citer : Posté le 04/08/2018 23:28 | #
Très bien ! Bah il faut qu'on essaye de le faire. La dernière fois ça n'avais pas marché.
Citer : Posté le 04/08/2018 23:49 | #
Seulement ça se complique au fur et à mesure que tu optimises... mais oui, à essayer.
Accessoirement tu peux récupérer le driver timer et basta. En l'occurrence gint n'est dans le principe pas nécessaire. L'OS peut emmerder mais avec un peu de chance non.