Il etait une fois un petit noyau multi-tache...

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Il etait une fois un petit noyau multi-tache...

Message par cgh »

... qui vient de se reveiller apres plus de 20 ans de sommeil profond :)

C'est vers 1992 que j'ai commence a developper un petit noyau multi-tache pour un "certain pocket" :geek:
A l'epoque je travaillais sous VxWorks, et j'ai eu envie de realiser moi-meme un scheduler et les services associes. Ne possedant pas de PC, je l'ai developpe sur... mon PC-1500 !

C'etait un peu la pagaille dans les differents WAV que je conservais mais j'ai reussi, grace a mes notes aussi, a "rebatir" un petit noyau fonctionnel :)

De plus, j'ai decouvert un truc que j'avais oublie: les services du kernel sont accessibles avec une instruction BASIC 8), nommee TASK. Ainsi, par exemple, un TASK ARUN demarre le scheduler et "cree" une tache qui n'est autre que le BASIC lui-meme. Et oui, le BASIC sera "schedule" comme les autres ;)

Dans les services supportes par le noyau, on va trouver:
  • Creation (RUN), destruction (END), arret (STOP), reprise (CONT) de tache, suspension sur delai variable (PAUSE),
  • Changement de priorite (NEW) de 0 (la plus prioritaire) a 7 (la moins). La "tache BASIC" a une priorite de 3, mais je vais plutot lui assigner 6 ou 7, le BASIC ne se suspendant que tres rarement. Le scheduler donne la main a la (aux) tache(s) de priorite 0 jusqu'a ce que celle(s)-ci se suspende(nt), puis ce sera(ont) les taches de priorite moindre 1, 2, 3..., jusqu'aux taches les moins prioritaires ...6 puis 7. Deux taches de meme priorite seront schedulees l'une apres l'autre. Si une tache de priorite plus elevee devient "eligible", elle prendra la main devant une autre tache moins prioritaire.
  • Utilisation de verrous d'exclusion mutuelle (LOCK, LOCK WAIT, UNLOCK),
  • Utilisation de semaphores de synchronisation associe aux verrous avec attente (PEEK) et signal (POKE). Dans les "versions legacy", je ne comprenais pas le code que j'ai recupere et... je n'avais de notes sur le sujet. J'ai donc reecris "from scratch" un systeme de synchronisation base sur le "mecanisme mutex/condition" de POSIX.
  • Reception (INPUT) et emission (PRINT, PRINT WAIT, PRINT INPUT) de messages synchrones. Certainement a l'epoque un essai de portage des "Rendez-vous" de ADA83. Ce mecanisme est aussi present dans MMPS,
  • Reception (READ, READ WAIT) et emission (DATA) de messages asynchrones par mailbox. Bon, la mailbox est limitee a un seul message, mais elle a le merite d'exister. J'ai un autre binaire du multi-tache avec une gestion de FIFO (queues), mais a part provoquer des plantages de toute beaute, je n'arrive pas a tirer grand chose. Cela prefigure quand-meme la gestion des QUEUE et DUPLEX fournis par MMPS,
  • Enregistrement d'une routine d'appel (GOTO), activation (ON), deactivation (OFF) d'evenements et envoie d'un evenement (CALL) a une tache. En fait, pour les Unixiens, c'est tout simplement une gestion de signal !


Pour vous amusez (enfin ceux qui ont suivi jusqu'au bout), un petit exemple amusant. Que fait le programme suivant une fois "lance" dans une tache (il faut une priorite importante, prenons par exemple 1) ?

Code : Tout sélectionner

ex6:
                LD      B,<XREG
                LD      C,>XREG
                LD      L,&07
                DI
pushXREGloop:
                LDI     (BC)
                PUSH    A
                DJC     pushXREGloop
                CALL    &E5B4   ; TIME
                DEC     BC
                DEC     BC
                DEC     BC
                LDI     (BC)
                INC     BC
                STA     H
                LD      L,&07
popXREGloop:
                POP     A
                STD     (BC)
                DJC     popXREGloop
                EI
                LDA     H
                BIT     0F
                JR      NZ,notMM=00
                CALL    BEEP1
notMM=00:
                LD      B,&00    ; Delay
                LD      C,&40
                LD      D,t?PAUSE ; Enters the mt-kernel for a PAUSE
                CALL    t?KRNREQ
                JR      ex6
La suite demain ! La nuit va etre longue ;)
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

Voila, finalement les "mailbox" ont ete supprimees et remplacees par des FIFO de taille variable. Une tache peut donc recevoir plusieurs messages asynchrones et non plus un seul.

J'ai aussi implemante une fonction TIMER qui "reveille" une tache en attente au bout d'un certain delai. Le TIMER peut de plus etre arrete. La tache reveillee recoit une error timeout quand le TIMER echoit. De meme, un WAIT est disponible; cela va passer la tache en mode "WAIT"; elle sera "reveillee" lors d'un message sur les FIFOs, la liberation d'un verrou, la synchronisation par semaphore et bien par TIMER. Les nouveaux prototype de TASK:

Code : Tout sélectionner

TASK ARUN
TASK ?<var>
TASK RUN <entry>,<stack>[,<prio>[,<tid>]];<var>
TASK END <tid>
TASK STOP <tid>
TASK CONT <tid>
TASK NEW <prio>[,<tid>]
TASK PAUSE <delay>
TASK LOCK <lockid>
TASK LOCK WAIT <lockid>
TASK UNLOCK <lockid>
TASK INPUT <var$>
TASK PRINT <tid>,<var$>
TASK PRINT WAIT <tid>,<var$>
TASK PRINT INPUT <tid>,<var$>
TASK GOTO [<handler>]
TASK ON <eventid>
TASK OFF <eventid>
TASK CALL <eventid>,[<tid>]
TASK TIME [<delay>]
TASK WAIT
TASK PEEK <lockid>,<cntid>
TASK POKE CLS <lockid>,<cntid>
TASK POKE <lockid>,<cntid>
TASK DIM <fifo>,<size>
TASK READ WAIT <var>
TASK READ <var>
TASK DATA <var>[,<tid>]
A bientot pour de nouvelles aventures ;)
Modifié en dernier par cgh le 19 avr. 2015 11:48, modifié 1 fois.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Il etait une fois un petit noyau multi-tache...

Message par gege »

Bonjour,
Peux-tu donner un exemple d'utilisation genre "1) je charge le truc dans mon 1500 en tapant ça... 2) ensuite je tape ceci dans le mode RUN/PRO/?...".
J'avoue ne pas faire le lien entre tes commandes TASK et la machine, est-ce un ordre Basic ?
Merci, on doit pouvoir faire des choses assez rigolotes, l'idéal serait plusieurs programmes Basic qui tournent en même temps mais chacun aurait besoin de pointeurs sauvegardés, etc ?
G.E.
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

Voici un exemple avec le petit programme dans le premier post.
En BASIC (RUN ou PRO), on va demarrer le scheduler et creer la "tache BASIC" (ou une autre d'ailleurs) avec:

Code : Tout sélectionner

TASK ARUN
A partir de cet instant, le "scheduler" est actif. On peut le verifier en PEEKant la valeur du compteur.
Ensuite, lancons la programme du premier post dans une tache (l'adresse du programme est ne &47C0 et la pile en &47BF [ces valeurs sont des exemples]) par un:

Code : Tout sélectionner

TASK RUN &47C0,&47BF,1;T
La syntaxe est RUN le point d'entree de la tache, la pile, la priorite (1 c'est tres prioritaire). Au retour T contient le TID (task identifier) de la tache creee.
Et on attend. En effet, des que l'unite des minutes vaut 0 et tant qu'elle vaut 0, le PC-1500 va emettre un BEEP !
On peut de meme lancer le petit programme:

Code : Tout sélectionner

10 WAIT 0
20 PRINT TIME:GOTO 20
qui va afficher l'heure continuellement et comme la tache d'exemple est plus prioritaire, le BASIC sera pre-empte pour l'execution de la tache.
En fait, c'est une simplication de la gestion d'un agenda et des rendez-vous. Mais il faudrait aussi pouvoir "allumer" le PC-1500 quand un timer echoit. Le scheduler etant "arrete" par le OFF.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

gege a écrit :Bonjour,
Peux-tu donner un exemple d'utilisation genre "1) je charge le truc dans mon 1500 en tapant ça... 2) ensuite je tape ceci dans le mode RUN/PRO/?...".
J'avoue ne pas faire le lien entre tes commandes TASK et la machine, est-ce un ordre Basic ?
Merci, on doit pouvoir faire des choses assez rigolotes, l'idéal serait plusieurs programmes Basic qui tournent en même temps mais chacun aurait besoin de pointeurs sauvegardés, etc ?
G.E.
Plusieurs programmes BASIC seraient en theorie possible, mais le BASIC n'est pas reentrant, et vu la taille des donnees (pointeurs BASIC, registres XREG... ) la commutation serait chere payee. Mais une tache BASIC schedulee avec d'autres tache, cela peut etre deja rigolo !
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7147
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Il etait une fois un petit noyau multi-tache...

Message par gege »

Bonjour,
C'est vrai, mais vu que 99% des gens sont incapables d'écrire de l'assembleur (moi le premier), tu aurais un public bien plus étendu en rendant possible le lancement de quelques programmes Basic simultanés.
Facile à dire je sais...
Certes avec un petit compilateur C, on doit pouvoir déjà dépanner les "incapables" ci-dessus.
Mais imaginons des trucs qui calculent en arrière plan pendant une interaction utilisateur : un programme qui pilote le personnage de l'utilisateur, un qui pilote les ennemis, un qui s'occupe du "monde"... hop un programme de jeu de rôle totalement novateur !
Voilà, une idée, ça ne fatigue pas d'en proposer :wink: !
G.E.
Avatar du membre
Rom1500
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 701
Enregistré le : 29 nov. 2013 16:24
Localisation : Pas très loin de Lyon
Contact :

Re: Il etait une fois un petit noyau multi-tache...

Message par Rom1500 »

Ca serait plutôt un outil pour piloter un combat de PC-1500 robotisés.
Un bon module d'Entrées/Sorties avec pilotage de moteurs et hop un PC-2 et un PC-1500 sur le ring.
Toutes les infos : http://www.pc-1500.info
PC-1500+CE-150 : EU PC1500, PC1500A / JP PC1500, PC1500D, PC1501 / HU PTA4000, PTA4000+16 / US TRS80 PC2 / BR PC-1500RP, PC-1500RP2 / CN PC-1500, PC-1500A, Nanfeng PC-1500A
PC-1600 : PC-1600K V2, CE-1600M, CE-1604L, CE-515P, module 32Ko, module 512Ko
Extensions en boite : CE-150/151/152/153/154/155/156/157/158/159/160/161/162E/163 sans boite
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

gege a écrit :Bonjour,
C'est vrai, mais vu que 99% des gens sont incapables d'écrire de l'assembleur (moi le premier), tu aurais un public bien plus étendu en rendant possible le lancement de quelques programmes Basic simultanés.
Facile à dire je sais...
Certes avec un petit compilateur C, on doit pouvoir déjà dépanner les "incapables" ci-dessus.
Mais imaginons des trucs qui calculent en arrière plan pendant une interaction utilisateur : un programme qui pilote le personnage de l'utilisateur, un qui pilote les ennemis, un qui s'occupe du "monde"... hop un programme de jeu de rôle totalement novateur !
Voilà, une idée, ça ne fatigue pas d'en proposer :wink: !
G.E.
Oui. Gege, je sais, ta remarque est tres pertinente et tu as tout a fait raison, mais pour les programmes BASIC simultanes, tu oublies... tant que nous utiliserons la ROM actuelle... car celle-ci n'est pas reentrante ! D'ailleurs dans la partie suivante du programme d'exemple:

Code : Tout sélectionner

                LD      B,<XREG
                LD      C,>XREG
                LD      L,&07
                DI
pushXREGloop:
                LDI     (BC)
                PUSH    A
                DJC     pushXREGloop
                CALL    &E5B4   ; TIME
                DEC     BC
                DEC     BC
                DEC     BC
                LDI     (BC)
                INC     BC
                STA     H
                LD      L,&07
popXREGloop:
                POP     A
                STD     (BC)
                DJC     popXREGloop
                EI
je suis oblige de sauvegarder le registre XREG (le premier nvieau de calcul) avant de lire TIME (routine &E5B4), car cette routine copie la valeur du temps dans ce meme registre XREG. Or ce registre XREG (encore lui !) est aussi utilise pour l'evaluation des arguments des commandes et fonctions ou lors des calculs. Une fois l'heure lue et l'octet codant les minutes sauvegarde, le XREG d'origine est restaure, pour etre rendu au BASIC. Ah oui, cette manip est realisee avec les interruptions desactivees (DI ... EI) pour eviter que les XREG/BASIC et XREG/TIME ne se melangent; n'oublions pas que les interruptions peuvent intervenir n'importe quand, entre 2 instructions machine. Ici, on parle de 8 octets... mais la "zone systeme BASIC" pese 2Ko (Il y a entre-autres les 52 variables A-Z et A$-Z$) ! En l'etat, ce serait sans interet, car le scheduler passerait son temps a sauvegarder et restaurer des zones. Avec le TE-1560, si la ROM peut evoluer (si nous sommes capables de le faire), ce serait envisageable... De plus il est necessaire que le "noyau" soit le maitre du systeme. Ici, ce n'est qu'une brique ajoutee... J'en ai reve aussi, mais j'ai abandonne :( Du coups, j'ai developpe un OS complet qui s'affranchit du BASIC: MMPS ! Mais la, j'ai ete limite par la memoire :geek:

Pour le compilateur C (ou autre), c'est dans mes projets, ce sera actif des que j'aurais fini avec le MT. Mais n'oublions pas que nous disposons aussi d'autres langages :) Entre autre, le sympathique FORTH de phe78, et un couplage "MT-Kernel-cgh/Forth-phe78" :!: devrait nous faire marrer un moment et ce ne serait pas pour me deplaire... apres tout ce n'est qu'une question de temps, de motivation et de disponibilite.
Par contre pour un compilateur C, son utilisation en natif (sur le PC-1500) risque d'etre limitee pour cause de memoire. Le C ce n'est pas le BASIC ! La aussi, avec les possibilites du TE-1560... etc... Et puis la programmation C, ce n'est malheureusement pas non plus la programmation BASIC.
Bon, vous me repondrez: "Un compilateur croise sur PC/Windows/Linux vers le SHARP"... Oui, je regarde ce cote aussi. Un lhcc dans mes lhTools me brancherait bien 8)
Nous avions commence a regarder un compilateur C avec remy, mais je butais sur la generation de code, car il me manquait toujours un registre... a suivre !

A propos de langages de programmation, une petite maxime que j'ai retrouvee dernierement:
"C programmers never die. They are just cast into void !
Assembly programmers never die. They are just shifted right !"
;)
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

Voila. En ecrivant les programmes d'exemples, je viens de developper un tache "agenda" qui va gerer des alarmes et vos rendez-vous. C'est une ebauche encore, mais ca fonctionne :geek: !
Pour le moment, la message a rappeller est limite a 5 caracteres.
On "envoie" un message a la tache agenda, qui vous previendra qu'il est l'heure d'aller vous couchez ;)
Dans ce qui suit, on suppose que la tache "agenda" a le TID 4.
Exemple pour programmer "DODO!" a 22h30, on fait:

Code : Tout sélectionner

D$="2230 DODO!"
TASK DATA 4,D$
Cela enverra la chaine contenue dans D$ a la tache agenda via un message et quand 22h30 sonnera, vous aurez 5 beep avec " DODO!" affiche 8) Il faudrait que j'ajoute l'heure en plus dans l'affichage :!: Et bien sur, cela fonctionne meme si le PC est utilise a autre chose comme un calcul ou l'execution d'un programme 8)
Si le rendez est deja passe, l'alarme sonnera immediatement. De meme, comme le scheduler est arrete par le OFF du PC-1500, au redemarrage du scheduler par un TASK ARUN, la tache agenda vous rappellera tous vos rendez-vous passes !
Par contre, il n'est pas possible d'allumer le PC (PowerON) par une interruption quand celui-ci est eteint... :(

Ohhh ! Ca vient de sonner ! Bonne nuit ...
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Avatar du membre
Rom1500
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 701
Enregistré le : 29 nov. 2013 16:24
Localisation : Pas très loin de Lyon
Contact :

Re: Il etait une fois un petit noyau multi-tache...

Message par Rom1500 »

Excellent !
Et dire que tu es donc obligé de mettre des alarmes pour t'indiquer qu'il est l'heure d'aller dormir… :lol: :lol: :lol:
Toutes les infos : http://www.pc-1500.info
PC-1500+CE-150 : EU PC1500, PC1500A / JP PC1500, PC1500D, PC1501 / HU PTA4000, PTA4000+16 / US TRS80 PC2 / BR PC-1500RP, PC-1500RP2 / CN PC-1500, PC-1500A, Nanfeng PC-1500A
PC-1600 : PC-1600K V2, CE-1600M, CE-1604L, CE-515P, module 32Ko, module 512Ko
Extensions en boite : CE-150/151/152/153/154/155/156/157/158/159/160/161/162E/163 sans boite
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

Hello,

Mon petit noyau multi-taches, ainsi l'instruction BASIC TASK et la petite tache "agenda" sont maintenant a disposition sur le site de repaire.

Vous trouverez les binaires pour les 4 modules memoire (CE-151, 155, 159, 161+163) en WAV (audio) ou en bin158 (serie via CE-158).
Il y a des images completes (MT-kernel+TASK+driver clavier) et reduites (MT-kernel+CALLREGS). Les images completes occupent 3Ko, mais requirent une ROM A02 ou superieure. Les images reduites 2Ko fonctionnent sur toutes les ROMs (mais sans l'instruction TASK). A noter qu'une extension memoire est necessaire sauf dans le cas du PC-1500A.

Merci a repaire pour l'herbergement.

A bientot pour de nouvelles aventures palpitantes :)
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: Il etait une fois un petit noyau multi-tache...

Message par cgh »

Yo,

Petite mise a jour du mtask2015 sur le site de repaire.
J'avais oublie de mettre certaines images pour le PC1500A (donc maj de la documentation).
De plus, il y avait 2 erreurs dans les programmes d'exemples.

Que le PC1500 soit avec vous ! :geek:
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
Répondre

Retourner vers « Tous les Pockets »