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 » Bibliothèque standard pour GCC
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Bibliothèque standard pour GCC

Posté le 01/06/2014 19:50

Comme vous l'avez peut-être remarqué, LePhenixNoir nous a gratifié d'un tuto accessible afin de mettre en place GCC et donc une nouvelle manière de compiler des add-ins pour nos Casios.

Afin d'ouvrir le développement au libre, une bibliothèque C standard à vu le jour et avance petit à petit.
Un dépôt git est disponible ici.
L'objectif est, au final, d'avoir une bibliothèque dont on connaisse le contenu, qui soit maintenable et qui remplisse le rôle d'une librairie C standard à l'échelle de nos calculatrices, compatible SH4 et SH3, enfin un truc bien quoi !

Le code étant écrit par des membres de PC, depuis rien, le choix de la licence est ouvert, de mon côté, comme pour LePhenixNoir, placer celui-ci dans le domaine publique paraît intéressant, reste à voir avec les autres (notamment Dark Storm pour le moment ).
Message initial
Cliquer pour enrouler
Seulement, si le support de l'architecture SuperH est relativment "natif" pour GCC, le support des librairies et des parties spécifique aux calculatrices Casio l'est beaucoup moins. Ainsi, si il est possible de récupérer les fonctions correspondants à "fxlib.h" dans un format utilisable par GCC, la librairie C standard fournie par casio dans le SDK ne semble pas aussi simple à récupérer (voire irrécupérable ? ).

Le plus simple est je pense de "réecrire" une bibliothèque standard C.
A mon avis, il pourrait aussi être intéressant d'essayer de s'affranchir de la bibliothèque "fxlib" fournie par Casio, toujours en la réecrivant (c'est à dire simplement refaire les appels de Syscalls pour la plupart des fonctions, "fxlib" étant majoritairement basée sur les Syscalls), mais en travaillant sur certains points et avoir d'emblée une compatibilité SH4 par exemple. On "enlèverait" aussi la plupart du code propriétaire de Casio (bien qu'il reste les syscalls, mais bon... ).
Ce qui concerne "fxlib" n'est que mon point de vue étant donné qu'on peut très bien conserver le fichier de Casio, j'amorce juste une réflexion à ce niveau là ;).

Quoi qu'il en soit, ce topic est là pour permettre de réfléchir sur le projet ,c'est à dire la réimplémentation d'une bibliothèque C à peu près standard (en s'appuyant sur les syscalls déjà existants, va faloir sortir la doc ) pour fonctionner sur GCC de manière correcte, voire plus intéressante que sur le SDK de Casio (pourquoi pas implémenter des fopen(...) par exemple, là encore, simple suggestion à cogiter ).
C'est aussi pour voir si il y a des gens qui seraient intéressés pour travailler là dessus, et voir vos idées sur la manière de travailler dessus.

Je pense qu'à la longue, un dépot git (ou autre) sur gitorious ou quelque chose du même style pourrait servir, qu'en dites vous ? Enfin, le projet semble intéressant, d'autant plus qu'un GCC bien fonctionnel pour compiler des add-ins, ça serait cool ! :D.
Donc n'hésitez pas à mettre vos idées pour commencer et avancer !
[/spoiler]


Précédente 1, 2, 3, 4, 5, 6, 7, 8 Suivante
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 08/06/2014 08:33 | #


Pas mal, je vois que tu avances bien (contrairement à moi pour le tuto ).
Je crois qu'il manque pas mal de fonctions de string aux syscalls, mais elles sont assez faciles à écrire de manière très optimisée, donc ça devrait aller.
On risque de devoir zapper qsort() et bsearch()... le reste devrait pouvoir se faire.
Par contre, on risque d'avoir du boulot au niveau de sprintf() et surtout de sscanf(), mais j'ai déjà mon idée sur comment les reprogrammer.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 08/06/2014 08:44 | #


Le qsort est pas très compliqué lorsque l'on sais comment ça fonctionne. Bon, de là à aller faire un truc hyper optimisé, je dis pas x)
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 08/06/2014 08:49 | #


Il faut que ce soit irréprochable, un truc digne de gcc
De même, le bsearch() est simple dès qu'on sait que c'est dichotomique. Mais de même, il faut optimiser.

Au passage, je pense qu'on devrait pas mettre du tri rapide, mais plutôt du tri fusion. Le qsort est linéarithmique au mieux et quadratique au pire, alors que le mergesort est en O(n log n) tout le temps.
En revanche, je n'ai réussi à le coder qu'avec une complexité spatiale assez gênante (à la fin il faut allouer un tableau de la même taille que le premier), donc si on ne peut pas le corriger autant utiliser un algorithme linéaire.
Enfin, on verra quand on y sera.

Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Citer : Posté le 08/06/2014 19:09 | #


Enfin, "j'avance bien", c'est tout relatif ^^. (Hier, je n'ai fait qu'écrire et corriger des Makefile en fait ). D'autant plus que le tuto est fini maintenant !

Quoi qu'il en soit, tu parlais des syscalls qui existaient par rapport aux manipulation de chaînes, c'est le genre de fonction que l'on peut se permettre assez aisément de réecrire même si elles existent déjà pour s'affranchir des syscalls, en plus des fonctions manquantes au niveau des syscalls.
En fait, au final, je pense qu'on pourra arriver à un stade où il ne restera que les malloc & cie (pas simple à réimplémenter) et des fonctions par rapport à la gestion des fichiers (encore que pour la lecture, il faut voir si on peut récupérer une partie du travail de Kristaba, et l'adapter) sous forme de syscalls, le reste "refait à la main".
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 08/06/2014 19:10 | #


Mais je ne comprends pas.
Les malloc() et cie sont des syscalls.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Citer : Posté le 08/06/2014 19:13 | #


C'est ce que je dis, les seuls syscall qu'on utilisent seraient ceux des malloc & cie. Tout ce qui relève de la manipulation de chaîne / mémoire ferait mieux de ne pas se baser sur ces derniers à mon avis ;).
C'est peut-être moi qui suis un peu confus dans mes messages en fait ...

(Je parle beaucoup pour dire peu en fait aussi )
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 08/06/2014 19:16 | #


Ok, mais les syscalls prennent de la place en mémoire, alors si désassemblés ils sont optimisés je ne vois pas l'intérêt d'en rajouter en plus.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 08/06/2014 19:17 | #


Tu veux directement modifier les syscalls dans l'OS ?!
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 08/06/2014 19:18 | #


Casio != optimisé
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Citer : Posté le 08/06/2014 19:21 | #


@Drac0300 : Non, je disais juste que au lieu d'appeler les syscall memset, on pourrait réecrire la fonction memset par exemple...

Après, c'est vrai que je n'avais pas trop réfléchi à la question de la taille :-/, donc si les syscall sont optimisés, pas de raison de ne pas les garder c'est vrai :).

Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 08/06/2014 19:24 | #


Oui, ça j'avais compris mais je parlais de ce que proposait lePhé dans le message précédant
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 08/06/2014 20:17 | #


Mais non.
Si les sycalls déjà présents dans l'OS sont optimisés, autant les utiliser car programmer nos propres fonctions prendrait plus de place. On pourrait aisément modifier les sycalls de l'OS, mais comme tout le monde n'en profiterait pas -- la majorité en fait -- les programmes seraient plus lents sur certaines machines, ce qui serait regrettable.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 08/06/2014 22:23 | #


Lephenixnoir a écrit :
Mais non.
Si les sycalls déjà présents dans l'OS sont optimisés, autant les utiliser
Dark storm a écrit :
Casio != optimisé

Je crois que tout est dit
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 08/06/2014 22:29 | #


J'ai compris, on les refera en Assembleur.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Citer : Posté le 08/06/2014 23:03 | #


Pour l'instant, j'ai utilisé les syscalls correspondants aux fonctions de manipulation de chaînes. J'ai aussi ajouté un début de support de "time.h" et les fonctions rand() / srand(). Rien n'est testé sur calculatrice pour l'instant (j'imagine que ça doit à peu près marcher, mais aucune certitude donc ), il faut que j'arrive à lancer mon add-in sur l'émulateur... (je ne sais pas si il faut directement toucher au crt0.s pour les arguments à l'appel de main, ou si c'est qu'il manque "INIT_ADDIN_APPLICATION()", si quelqu'un en sait plus ), mais ça compile bien, que ce soit la bibliothèque en elle même ou en linkant dans un projet.
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 09/06/2014 07:19 | #


J'en sais plus.
La fonction INIT_ADDIN_APPLICATION() ne fait pas partie de fxlib. Ma solution, qui a fonctionné sur la calculatrice... est de virer tout le joyeux bazar avec leurs #pragma et leur _BR_size.
De plus, je pense que vous faites le lien entre le nom de cette variable et l'erreur (invariable, elle ) du compilateur Hitachi :
"The size of B&R section should be 0x2000 bytes or less".
Ce qui signifie que gcc passe outre cette erreur, donc plus de limitations de mémoire. Faites donc attention à la RAM qui pourrait ne pas survivre au choc.

Pour rand() et srand(), je t'invite à vérifier mathématiquement que ton algo n'est périodique au pire que sur une grande longueur, car les transformations affines (souvent utilisées) ne sont pas infaillibles.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Citer : Posté le 09/06/2014 07:34 | #


En fait mon problème est le suivant : l'add-in est reconnu et apparaît dans le menu de l'émulateur, mais au moment de le lancer, ce dernier me dit quelque chose comme : " Impossible de lancer ça sur l'émulateur" ou "programme non disponible sur émulateur" (je ne me rappelle plus de l.intitulé exact, mais la même erreur que lorsque l'on veut lancer "Run-Mat" par exemple).

Ensuite pour le rand, j'ai honteusement pompé la fonction dans la doc de Sim'Lo, je ferai une série de tests dans la journée :).
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 09/06/2014 07:37 | #


Je vais tester mon add-in (compilé avec gcc) sur l'émulateur, je t'en dirai des nouvelles.

Ajouté le 09/06/2014 à 07:40 :
Alors ça c'est intéressant...
Bon, transfère-le sur la calculatrice, ça devrait fonctionner.
En revanche, je pense savoir comment obtenir le code d'INIT_ADDIN_APPLICATION().

Ajouté le 09/06/2014 à 07:45 :
J'ai réussi à trouver quelque chose.
Quand on y réfléchit, cette fonction est constante, donc si on arrive à en récupérer le code on le désassemble et l'insère au début de tout programme à compiler.
Voici donc la fonction InitializeSystem() qui est appelé au milieu des #pragma.
D3 03 7F FC 2F 51 65 F1 65 5D 43 2B 7F 04 00 00 00 30 0C A6


Ajouté le 09/06/2014 à 07:48 :
J'ai aussi la fonction INIT_ADDIN_APPLICATION().
60 53 4F 22 7F F8 2F 42 BF D6 81 F2 E6 01 D2 15 65 63 42 0B E4 00 D4 14 D3 15 43 0B 00 09 85 F2 65 03 64 F2 65 5D D3 12 7F 08 43 2B 4F 26 08 10 00 08 00 30 0F 0C 00 30 0F 7C 00 30 0F BC 00 30 0F 8C 88 01 E0 00 08 10 20 00 00 30 0F FC 00 30 4B A4 00 30 4B A8 00 30 4B B0 00 30 4B AC 00 30 4B B4 08 10 00 00 00 30 0F EC 00 30 0C 0A 00 30 0F 9C 00 30 02 14

Il faudrait qu'on voie avec le désassembleur...

Heureusement que les messages sont fusionnés
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Nemhardy Hors ligne Grand maître des Traits d'Esprit Points: 1243 Défis: 54 Message

Citer : Posté le 09/06/2014 07:48 | #


Ah oui, pas bête !
En plus je suis plutôt curieux de voir leur action réelle :).
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 09/06/2014 07:55 | # | Fichier joint


Voilà la fonction InitializeSystem().


Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Lephenixnoir Hors ligne Administrateur Points: 24575 Défis: 170 Message

Citer : Posté le 13/06/2014 21:09 | # | Fichier joint


Bon, je me mets aussi à ce projet.
Es-tu sûr néanmoins qu'il faille utiliser les syscalls pour tout ce qui est string ? Je ne suis pas sûr qu'il soient optimisés, si tu vois ce que je veux dire...
Sinon, j'ai moi-même mes propres fonctions pour ça. Comme git m'est encore totalement étranger, je joins.
D'ailleur par chance, on dirait qu'il y en a que vous n'avez pas déjà.
N'hésitez pas à me donner votre avis, je les optimise à l'octet près.

C'est aussi un bon moyen de travailler ses pointeurs.

Ajouté le 13/06/2014 à 21:25 :
Je crois que j'ai un énorme problème.
Mon terminal ne reconnaît plus la commande sh3eb-objcopy. J'ai tenté de réinstaller certains composants, mais rien n'y fait... et la commande "find * |fgrep sh3eb-objcopy" n'a rien trouvé depuis /.
Du coup, impossible de compiler quoi que ce soit... une idée ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Précédente 1, 2, 3, 4, 5, 6, 7, 8 Suivante

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 167 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