Skip to content

fcamussi/thread4msx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

thread4msx

Librería para programar threads en C para MSX.

Éste proyecto es bastante personal, se trata de una implementación de multitarea apropiativa (preemptive multitasking) para una computadora MSX del año 1983! que utiliza un procesador Z80 corriendo a una velocidad de 3.58MHz 😁. El motivo del desarrollo fue poder probar algunos problemas típicos de sistemas operativos en ésta belleza 💙.

animacion-counters

Requisitos

  • Compilador SDCC versión 3.4.0
  • Una computadora MSX o un emulador para la ejecución

Funciones y primitivas

A continuación se detallan las funciones y primitivas implementadas, tanto para el manejo de threads como de semáforos para sincronización entre threads.

thread_init

void thread_init();

Inicializa la librería.

thread_uninit

void thread_uninit();

Desinicializa la librería.

thread_create

void thread_create(thread_t *thread, uint16_t stack_size,
                   void *(*fun)(void *), void *arg);

Crea un nuevo hilo y lo pone en ejecución. thread es una variable de tipo thread_t, stack_size es el tamaño de memoria que se reserva para la pila, fun es la función a ejecutarse y arg son los argumentos que se le pasan a la función fun.

thread_join

void *thread_join(thread_t *thread);

Espera hasta que finalice la ejecución de un thread y retorna el valor retornado por la función del thread.

thread_sleep

void thread_sleep();

Bloquea el thread actual.

thread_yield

void thread_yield();

Cede la ejecución del thread actual a otro thread.

thread_finish

void thread_finish(thread_t *thread);

Finaliza la ejecución de un thread.

sem_create

void sem_create(sem_t *sem, uint8_t value);

Crea un semáforo con el valor value. sem es una variable de tipo sem_t.

sem_destroy

void sem_destroy(sem_t *sem);

Libera la memoria utilizada por un semáforo.

sem_p

void sem_p(sem_t *sem);

Decrementa el valor de un semáforo. Si el nuevo valor es cero, el thread se bloquea y se agrega a la cola del semáforo.

sem_v

void sem_v(sem_t *sem);

Si hay algún thread en la cola del semáforo lo remueve de la cola y lo prepara para que se siga ejecutando. Luego se incrementa el valor del semáforo.

delay

void delay(uint32_t vt);

Duerme el thread actual durante vt interrupciones del VDP.

Ejemplos

En el directorio examples hay 3 programas de prueba:

  • counters: 10 threads contando en simultaneo y mostrando el resultado en pantalla.
  • mt: Es el problema de los molinetes (turnstiles) donde varios procesos incrementan una variable compartida y se produce una condición de competencia (race condition), por lo que se pierden conteos. A menos que se serialice la zona crítica, es decir, el incremento de la variable compartida, utilizando semáforos mutex (semáforos con valor 1).
  • shell: Un pequeño shell que permite ejecutar programas hardcodeados en primer y segundo plano.

Compilación

Descargar SDCC versión 3.4.0 y descomprimir. Luego, supondiendo que $SDCC_DIR contiene la ruta donde se descomprimió SDCC, tipear:

export PATH=$PATH:$SDCC_DIR/bin:$SDCC_DIR/share
cd backend
make
cd ../thread
make
cd ../examples/counters
make
cd ../mt
make
cd ../shell
make

Ejecución

Por ejemplo para ejecutar el programa shell, tipiamos en MSX-BASIC:

bload "shell.msx",r

Releases

No releases published

Packages

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy