Skip to content
Snippets Groups Projects
Commit 18efe156 authored by Thierno souleymane Bah's avatar Thierno souleymane Bah
Browse files

feat(semanphores implemented and tested with ping pong scenario)

parent f74f7cc9
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#define STACK_SIZE 16384 #define STACK_SIZE 16384
#define CTX_MAX 16 #define CTX_MAX 16
#define SEM_MAGIC 0xCAFEBABE
typedef int(func_t)(int); typedef int(func_t)(int);
typedef void(funct_t)(void *); typedef void(funct_t)(void *);
......
...@@ -10,6 +10,7 @@ void putc(char aChar); /* print a single char on screen */ ...@@ -10,6 +10,7 @@ void putc(char aChar); /* print a single char on screen */
void puts(const char *aString); /* print a string on the screen */ void puts(const char *aString); /* print a string on the screen */
void puthex(int aNumber); /* print an Hex number on screen */ void puthex(int aNumber); /* print an Hex number on screen */
void assert0(char b, const char *filename, const char *fct_name, const int line); void assert0(char b, const char *filename, const char *fct_name, const int line);
void irq_disable(); void irq_disable();
void irq_enable(); void irq_enable();
......
#include "idt.h"
#include "ioport.h" #include "ioport.h"
#include "gdt.h" #include "gdt.h"
#include "idt.h"
#include "keyboard.h"
#include "utils.h" #include "utils.h"
#include "context.h" #include "context.h"
#include "sem.h"
#include "keyboard.h"
/* print a char on the screen */ extern int cursor_x;
int cursor_x = 0; /* here is the cursor position on X [0..79] */ extern int cursor_y;
int cursor_y = 0; /* here is the cursor position on Y [0..24] */
int counter = 0; int counter = 0;
ctx_t *ping_ctx = NULL;
ctx_t *pong_ctx = NULL;
sem_t sping;
sem_t spong;
void empty_irq(int_regs_t *r) void empty_irq(int_regs_t *r)
{ {
} }
...@@ -57,6 +63,30 @@ void keyboard_handler(void *args) ...@@ -57,6 +63,30 @@ void keyboard_handler(void *args)
} }
} }
void ping(void *arg)
{
while (1)
{
puts("PING\n");
for (int i = 0; i < 100000000; i++)
;
sem_up(&spong);
sem_down(&sping);
}
}
void pong(void *arg)
{
while (1)
{
puts("PONG\n");
for (int i = 0; i < 100000000; i++)
;
sem_up(&sping);
sem_down(&spong);
}
}
/* multiboot entry-point with datastructure as arg. */ /* multiboot entry-point with datastructure as arg. */
void main(unsigned int *mboot_info) void main(unsigned int *mboot_info)
{ {
...@@ -73,7 +103,7 @@ void main(unsigned int *mboot_info) ...@@ -73,7 +103,7 @@ void main(unsigned int *mboot_info)
puts("\n\n"); puts("\n\n");
idt_setup_handler(0, timer_it); idt_setup_handler(0, empty_irq);
idt_setup_handler(1, empty_irq); idt_setup_handler(1, empty_irq);
__asm volatile("sti"); __asm volatile("sti");
...@@ -82,122 +112,15 @@ void main(unsigned int *mboot_info) ...@@ -82,122 +112,15 @@ void main(unsigned int *mboot_info)
puts("Hello world\n\n"); puts("Hello world\n\n");
ctx_t *ctx1 = create_ctx(counter_handler, NULL); sem_init(&sping, -1);
ctx_t *ctx2 = create_ctx(keyboard_handler, NULL); sem_init(&spong, 0);
for (;;)
; /* nothing more to do... really nothing ! */
}
void assert0(char b, const char *filename, const char *fct_name, const int line)
{
if (!b)
{
puts("Assertion error in ");
puts(filename);
puts(" in ");
puts(fct_name);
puts(" at 0x");
puthex(line);
puts("\n");
}
}
void irq_disable() ctx_t *ping_ctx = create_ctx(ping, NULL);
{ ctx_t *pong_ctx = create_ctx(pong, NULL);
__asm volatile("cli");
}
void irq_enable() //sem_down(&sping);
{ yield();
__asm volatile("sti");
_outb(0xA0, 0x20);
_outb(0x20, 0x20);
}
/* base address for the video output assume to be set as character oriented by the multiboot */
unsigned char *video_memory = (unsigned char *)0xB8000;
/* clear screen */
void clear_screen()
{
int i;
for (i = 0; i < 80 * 25; i++)
{ /* for each one of the 80 char by 25 lines */
video_memory[i * 2 + 1] = 0x0F; /* color is set to black background and white char */
video_memory[i * 2] = (unsigned char)' '; /* character shown is the space char */
}
}
/* print a string on the screen */
void puts(const char *aString)
{
const char *current_char = aString;
while (*current_char != 0)
{
putc(*current_char++);
}
}
/* print an number in hexa */
char *hex_digit = "0123456789ABCDEF";
void puthex(int aNumber)
{
int i;
int started = 0;
for (i = 28; i >= 0; i -= 4)
{
int k = (aNumber >> i) & 0xF;
if (k != 0 || started)
{
putc(hex_digit[k]);
started = 1;
}
}
}
void setCursor()
{
int cursor_offset = cursor_x + cursor_y * 80;
_outb(0x3d4, 14);
_outb(0x3d5, ((cursor_offset >> 8) & 0xFF));
_outb(0x3d4, 15);
_outb(0x3d5, (cursor_offset & 0xFF));
}
void putc(char c) for (;;)
{ ; /* nothing more to do... really nothing ! */
if (cursor_x > 79)
{
cursor_x = 0;
cursor_y++;
}
if (cursor_y > 24)
{
cursor_y = 0;
clear_screen();
}
switch (c)
{ /* deal with a special char */
case '\r':
cursor_x = 0;
break; /* carriage return */
case '\n':
cursor_x = 0;
cursor_y++;
break; /* new ligne */
case 0x8:
if (cursor_x > 0)
cursor_x--;
break; /* backspace */
case 0x9:
cursor_x = (cursor_x + 8) & ~7;
break; /* tabulation */
/* or print a simple character */
default:
video_memory[(cursor_x + 80 * cursor_y) * 2] = c;
cursor_x++;
break;
}
setCursor();
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment