-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.c
105 lines (86 loc) · 2.87 KB
/
index.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void (*func_ptr_queue[16384])(int);
int func_ptr_queue_parameter[16384];
int func_ptr_queue_index = 0;
void (*func_ptr_exec_queue[16384])(int);
int func_ptr_exec_queue_parameter[16384];
int func_ptr_exec_queue_index = 0;
int interrupt_index = 0;
void task_create(void (*func_ptr)(int), int n) {
if (func_ptr_queue_index >= 16384) {
printf("Out of range!!\n");
return;
}
// printf("func_ptr_queue_index: %d\n", func_ptr_queue_index);
func_ptr_queue[func_ptr_queue_index] = func_ptr;
func_ptr_queue_parameter[func_ptr_queue_index] = n;
func_ptr_queue_index++;
}
void migrate_func_to_exec_queue(void (**func_ptr_queue)(int), int *func_ptr_queue_parameter, void (**func_ptr_exec_queue)(int), int *func_ptr_exec_queue_parameter) {
for (;func_ptr_exec_queue_index < func_ptr_queue_index; func_ptr_exec_queue_index++) {
func_ptr_exec_queue[func_ptr_exec_queue_index] = func_ptr_queue[func_ptr_exec_queue_index];
func_ptr_exec_queue_parameter[func_ptr_exec_queue_index] = func_ptr_queue_parameter[func_ptr_exec_queue_index];
}
}
void hand_func(void (**func_ptr_queue)(int), int *func_ptr_queue_parameter) {
if (interrupt_index == 0) {
migrate_func_to_exec_queue(func_ptr_queue, func_ptr_queue_parameter, func_ptr_exec_queue, func_ptr_exec_queue_parameter);
func_ptr_queue_index = 0;
}
clock_t start_t, timeout_t;
start_t = clock();
for (int i = interrupt_index; i < func_ptr_exec_queue_index; i++) {
timeout_t = clock();
if (((timeout_t - start_t) / CLOCKS_PER_SEC) > 2.0) {
printf("INTERRUPT!\n");
interrupt_index = i;
return;
}
(*func_ptr_exec_queue[i])(func_ptr_exec_queue_parameter[i]);
}
interrupt_index = 0;
func_ptr_exec_queue_index = 0;
}
void show_number(int n) {
printf("%d\n", n);
}
void number_power(int n) {
printf("%d\n", n*n);
}
void double_number(int n) {
printf("%d\n", n+n);
}
void longTimeShowNumber(int n) {
for (double i=0; i < 500000000; i++) {
}
printf("%d\n", n);
}
int main(void) {
int i = 11;
clock_t t1, t2;
t1 = clock();
for (int i=0; i < 10;i++) {
void (*func)(int) = longTimeShowNumber;
task_create(func, i);
}
while(1) {
hand_func(func_ptr_queue, func_ptr_queue_parameter);
t2 = clock();
if (((t2 - t1) / CLOCKS_PER_SEC) == 30.0) {
void (*func)(int) = longTimeShowNumber;
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
task_create(func, i++);
}
}
return 0;
}