Add missing files
This commit is contained in:
15
os/process.c
Normal file
15
os/process.c
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include "process.h"
|
||||||
|
#include "alloc.h"
|
||||||
|
|
||||||
|
void create_process_table(ProcessTable **table) {
|
||||||
|
*table = malloc(sizeof(ProcessTable));
|
||||||
|
(*table)->entries = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int create_process(ProcessTable *table, void *entrypoint) {
|
||||||
|
if (table->entries>=MAX_PROCESS) return 1;
|
||||||
|
|
||||||
|
Process *pentry = &table->process_list[table->entries++];
|
||||||
|
pentry->entrypoint = entrypoint;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
23
os/process.h
Normal file
23
os/process.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef PROCESS_H
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define PROCESS_H
|
||||||
|
#define MAX_PROCESS 16
|
||||||
|
|
||||||
|
#define STACK_SIZE 32
|
||||||
|
#define STACK_START(stack) (&stack[STACK_SIZE-1])
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int (*entrypoint)();
|
||||||
|
uint32_t stack[STACK_SIZE];
|
||||||
|
} Process;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Process process_list[MAX_PROCESS];
|
||||||
|
int entries;
|
||||||
|
} ProcessTable;
|
||||||
|
|
||||||
|
void create_process_table(ProcessTable **table);
|
||||||
|
|
||||||
|
int create_process(ProcessTable *table, void *entrypoint);
|
||||||
|
#endif
|
||||||
31
os/scheduler.c
Normal file
31
os/scheduler.c
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#include "process.h"
|
||||||
|
|
||||||
|
uint32_t **current_sp;
|
||||||
|
|
||||||
|
extern void puts(const char *s);
|
||||||
|
|
||||||
|
void start_task(Process *pentry) {
|
||||||
|
__asm volatile(
|
||||||
|
"mov %0, sp"
|
||||||
|
: "=r" (*current_sp)
|
||||||
|
);
|
||||||
|
__asm volatile(
|
||||||
|
"mov sp, %0\n"
|
||||||
|
:: "r" (STACK_START(pentry->stack))
|
||||||
|
);
|
||||||
|
pentry->entrypoint();
|
||||||
|
__asm volatile(
|
||||||
|
"mov sp, %0\n"
|
||||||
|
:: "r" (*current_sp)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run(ProcessTable *ptable) {
|
||||||
|
while(1) {
|
||||||
|
for (int i = 0; i<ptable->entries; i++) {
|
||||||
|
Process *pentry = &ptable->process_list[i];
|
||||||
|
|
||||||
|
start_task(pentry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1
os/scheduler.h
Normal file
1
os/scheduler.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
void run();
|
||||||
15
startup.s
Normal file
15
startup.s
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// The .word directive allocates a 32-bit value in the memory. In this case it allocates in memory
|
||||||
|
// the address of the stack_top (value in the linker.ld file) and _Reset.
|
||||||
|
.word stack_top // Address of the stack_top
|
||||||
|
.word _start // Address of the _start function
|
||||||
|
|
||||||
|
// The thumb_func is used to make sure the function is in thumb mode,
|
||||||
|
// which is required for the Cortex-M0+.
|
||||||
|
.thumb_func
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
|
.global _start
|
||||||
|
|
||||||
|
_start:
|
||||||
|
BL main
|
||||||
|
B .
|
||||||
11
tasks/tasks.c
Normal file
11
tasks/tasks.c
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#include "library.h"
|
||||||
|
|
||||||
|
int task2(void) {
|
||||||
|
puts("Hello World from task 1\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int task1(void) {
|
||||||
|
puts("Hello World from task 2\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user