commit c49d611c72bb8695818395f8fde47c1dbd5dbaa7
parent 8a347c5c0da05100a62c21f461cd4cc4e0e343ab
Author: Matsuda Kenji <info@mtkn.jp>
Date: Mon, 18 Mar 2024 13:02:55 +0900
contex switch, wip
Diffstat:
2 files changed, 21 insertions(+), 22 deletions(-)
diff --git a/ex3/main.c b/ex3/main.c
@@ -63,24 +63,9 @@ main(void) {
p1.r[15] = 0x20000101; // pc
p1.next = NULL;
- for (;;) {
- wfi();
- for (int i = 0; i < 17; i++) {
- printh(ptab.head->r[i]);
- puts("");
- }
- }
- return 0;
-}
+ proc0();
-// Save_context saves the context starting at sp to the current proc struct.
-void
-save_context(unsigned int r[17])
-{
- int i;
- for (i = 0; i < 17; i++) {
- ptab.head->r[i] = r[i];
- }
+ return 0;
}
void
@@ -88,15 +73,27 @@ scheduler(void) {
puts("scheduler called");
}
-void
-switch_context(void) {
+// Switch_context saves registers r to the currently executing proc struct
+// and then move it to the tail of task queue.
+// It returns the next PC of the next task in the queue
+unsigned int
+switch_context(unsigned int r[17]) {
proc *p;
+
+ // save context
+ int i;
+ for (i = 0; i < 17; i++) {
+ ptab.head->r[i] = r[i];
+ }
+ // update task queue
p = ptab.head;
ptab.head = ptab.head->next;
ptab.tail->next = p;
ptab.tail = p;
ptab.tail->next = NULL;
restore_context(ptab.head->r);
+
+ return ptab.head->r[15];
}
void
diff --git a/ex3/proc.s b/ex3/proc.s
@@ -4,6 +4,7 @@
proc0:
ldr r0, =msg0
bl puts
+ wfi
b proc0
.align 2
@@ -16,6 +17,7 @@ msg0:
proc1:
ldr r0, =msg1
bl puts
+ wfi
b proc1
.align 2
@@ -99,8 +101,6 @@ isr_alarm:
add r3, r3, #4
ldr r0, [r1, r2]
str r0, [r1, r3] // ReturnAddress(ExceptionType): The next pc at interrupt.
- ldr r0, =0x20000101 // The entry point of proc1
- str r0, [r1, r2]
add r2, r2, #4
add r3, r3, #4
@@ -108,7 +108,9 @@ isr_alarm:
str r0, [r1, r3]
mov r0, r1
- bl save_context
+ bl switch_context
+ sub r2, r2, #4
+ str r0, [r1, r2]
add sp, sp, #(17*4)
ldr r0, =(1000 * 1000)