1
7
8uint8_t R=0, currentTaskId=0, nextTaskId=0;
9
10typedef enum status{t_ready, t_busy} status;
11
12typedef struct TaskControlBlock
13{
14 uint8_t task_id;
15 enum status state;
16 unsigned int stack_pointer_begin;
17 unsigned int stack_pointer_end;
18 void (*fnctpt)(void);
19} tcb;
20tcb task[maxTask];
21
22int main(void)
23{
24 cli();
25
26 timer_init();
27 Neutron_kernel_init();
28
29
30 StackPointer=task[0].stack_pointer_begin;
31 currentTaskId=task[0].task_id;
32 if(task[0].state==t_ready)
33 task[0].state=t_busy;
34 sei();
35
36 task[0].fnctpt();
37
38 while (1);
39}
40
41ISR(TIMER0_COMPA_vect)
42{
43 uint8_t q=0;
44 PORTB^=(1<<PORTB5);
45 cli();
46
47 task[currentTaskId].stack_pointer_end=StackPointer;
48 for(q=0; q<maxTask; q++)
49 {
50 if(task[q].state==t_ready)
51 {
52
53 task[q].state=t_busy;
54 currentTaskId=task[q].task_id;
55 StackPointer=task[q].stack_pointer_begin;
56 sei();
57 task[q].fnctpt();
58 }
59 R=q;
60 }
61 if(R==maxTask-1)
62 {
63 if(nextTaskId==maxTask) nextTaskId=0;
64 if(task[nextTaskId].state==t_busy)
65 {
66
67 StackPointer=task[nextTaskId].stack_pointer_end;
68 currentTaskId=nextTaskId;
69 nextTaskId=task[nextTaskId].task_id+1;
70 }
71 }
72}
73