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