Mercurial > lcfOS
diff doc/os.rst @ 322:44f336460c2a
Half of use of burg spec for arm
author | Windel Bouwman |
---|---|
date | Mon, 27 Jan 2014 19:58:07 +0100 |
parents | doc/design.rst@ea93e0a7a31e |
children | 9eb1fc6aad6c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/os.rst Mon Jan 27 19:58:07 2014 +0100 @@ -0,0 +1,103 @@ +OS +== + +Design +------ + +Processes / threads +~~~~~~~~~~~~~~~~~~~ + +Processes are completely seperated and fully pre-emptive. +This means a process can be unscheduled at any moment. + +Threads are co-operative. This means they yield control +voluntary. This means that mutexes and locks are not required. +This is done with the built-in language feature called tasks. + +If some heavy duty task must be performed, either way spawn +a new process, or yield frequently from this hard labour. + +tasks +~~~~~ + +Consider the following: + +.. code:: + + function int insanemath(int a) + { + while (a > 0) + { + a = a -1; + resume agent1; + } + return a - 1; + } + + task agent1() + { + start agent2; + } + + task agent2() + { + insanemath(55); + insanemath(44); + } + + task main() + { + start agent1; + join agent1; + } + + +Say to tasks are running in concurrent / parallel. + + + +Stack layout for tasks. +|| +|| +\/ ++---------+ +| return address +| locals +| ++------ +| return address +| locals +| ++--- + +Assembly code for the functions above: + +.. code:: + + .code + insanemath: + L1: + load r0, sp - 4 + cmp r0, 0 + jl L2 + dec r0 + store r0, sp - 4 + jmp L1 + L2: + ret + + agent1: + hlt? + + agent2: + hlt? + + main: + jmp agent1 + + .data + agent1_task: + dd 0 + agent2_task: + dd 0 +