{{htmlmetatags>metatag-robots=()
metatag-title=(Hello world | Multithreading on retrocomputers)
metatag-keywords=(Multithreading,Commodore 64,Commodore VIC20,Atari,Commodore128,MIDRES Library,6502,6510)
metatag-description=(Come implementare il multithreading veloce ed efficiente su computer con risorse limitate.)
metatag-media-og:image=(:mt6502.png)
metatag-og:title=(Hello world | Multithreading on retrocomputers)
metatag-og:description=(Come implementare il multithreading veloce ed efficiente su computer con risorse limitate.)
}}
====== Multithreading sui retrocomputer ======
===== "HELLO WORLD" CON DUE PROTOTHREAD =====
Il codice su [[https://github.com/spotlessmind1975/midres/blob/master/src/tutorial_protothread1.c|tutorial_protothread1.c]] mostra come realizzare due thread che, in concorrenza, accederanno alla CPU per stampare la scritta "Hello world". Per distinguerli, aggiungeremo il numero del protothread in fondo.
Qui commentiamo il codice:
mr_protothread firstThread;
mr_protothread secondThread;
Il tipo ''mr_protothread'' è specifico della libreria MIDRES, e permette di riservare i famosi due byte necessari a memorizzare lo stato (continuazione locale) del protothread. In questo caso, definiamo due variabili perché andremo a far partire due protothread simultanei.
MR_PT_THREAD(first) {
Questa è la definizione standard, per indicare che una funzione è in realtà un protothread. ''first'' è il nome della funzione, che dovrà essere poi richiamata dando l'indirizzo della variabile ''firstThread''.
MR_PTI_BEGIN();
Il protothread inizia effettivamente da qui.
while (1) {
printf("Hello world 1\n");
Introduciamo qui un loop infinito, che faccia eseguire la logica di questa funzione, che si limiterà a stampare la scritta "Hello world 1".
MR_PTI_YIELD();
Qui il programma indica che è possibile rilasciare il controllo ad altri thread. Quando gli altri faranno lo stesso, il controllo tornerà sull'istruzione successiva a questa.
}
MR_PTI_END();
}
Qui termina il loop del primo thread e, inoltre, si segnala che da questa riga che termina anche la definizione del protothread.
MR_PT_THREAD(second) {
MR_PTI_BEGIN();
while (1) {
printf("Hello world 2\n");
MR_PTI_YIELD();
}
MR_PTI_END();
}
La seconda funzione è identica alla prima, con la differenza che stamperà "Hello world 2".
void tutorial_protothread1() {
while (1) {
first(&firstThread);
second(&secondThread);
}
}
This is the main loop of the program, which continuously calls the first function and the second function.
===== COME COMPILARLO =====
E' possibile compilare il tutorial con questa linea di comando:
make tutorial=PROTOTHREAD1 target=... all
Le piattaforme supportate sono:
* Commodore VIC-20 espanso (''vic2024'');
* Commodore 64 (''c64'');
* Commodore 128 (''c128'');
* Commodore PLUS/4 (''plus4'');
* Atari (8 bit) (''atari'').
===== RISULTATO =====
{{ youtube>C5_Ogje7wxg?medium }}
Vai a [[:it:mt6502:walking|ANIMAZIONI CON I PROTOTHREAD]].