# 1 "task.cpp" # 1 "" # 1 "" # 1 "task.cpp" # 1 "task.h" 1 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 1 3 # 121 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int int8_t __attribute__((__mode__(__QI__))); typedef unsigned int uint8_t __attribute__((__mode__(__QI__))); typedef int int16_t __attribute__ ((__mode__ (__HI__))); typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); typedef int int32_t __attribute__ ((__mode__ (__SI__))); typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); typedef int int64_t __attribute__((__mode__(__DI__))); typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); # 142 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int16_t intptr_t; typedef uint16_t uintptr_t; # 159 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int8_t int_least8_t; typedef uint8_t uint_least8_t; typedef int16_t int_least16_t; typedef uint16_t uint_least16_t; typedef int32_t int_least32_t; typedef uint32_t uint_least32_t; typedef int64_t int_least64_t; typedef uint64_t uint_least64_t; # 213 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int8_t int_fast8_t; typedef uint8_t uint_fast8_t; typedef int16_t int_fast16_t; typedef uint16_t uint_fast16_t; typedef int32_t int_fast32_t; typedef uint32_t uint_fast32_t; typedef int64_t int_fast64_t; typedef uint64_t uint_fast64_t; # 273 "c:/winavr-20080610/lib/gcc/../../avr/include/stdint.h" 3 typedef int64_t intmax_t; typedef uint64_t uintmax_t; # 7 "task.h" 2 namespace TaskManager{ enum TASK_TYPE{ SINGLE_RUN, MULTI_RUN, }; enum PRIORITY{ HIGH = 0, MEDIUM = 50, LOW = 150, }; struct Task{ void (*function)(void*,void*); void* arg0; void* arg1; TASK_TYPE type; uint16_t interval; uint32_t next_run; uint8_t priority; bool active; uint8_t pri_level; }; extern volatile uint8_t cur_tasks; extern volatile uint8_t cpu_usage; extern volatile Task tasks[12]; extern volatile uint8_t cur_priority[3]; extern void AddTask(void (*function)(void*,void*), void* arg0, void* arg1,TASK_TYPE type,uint16_t interval,PRIORITY pri); extern uint8_t ExecuteNextTask(void); extern void DeleteTask(void (*function)(void*,void*)); extern void Init(void); }; # 2 "task.cpp" 2 # 1 "clock_o.h" 1 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/interrupt.h" 1 3 # 38 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/interrupt.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 1 3 # 94 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/sfr_defs.h" 1 3 # 126 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/sfr_defs.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/inttypes.h" 1 3 # 77 "c:/winavr-20080610/lib/gcc/../../avr/include/inttypes.h" 3 typedef int32_t int_farptr_t; typedef uint32_t uint_farptr_t; # 127 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/sfr_defs.h" 2 3 # 95 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 127 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/iom128.h" 1 3 # 128 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 317 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/portpins.h" 1 3 # 318 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/common.h" 1 3 # 320 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/version.h" 1 3 # 322 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/fuse.h" 1 3 # 214 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/fuse.h" 3 typedef struct { unsigned char low; unsigned char high; unsigned char extended; } __fuse_t; # 325 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 1 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/lock.h" 1 3 # 328 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/io.h" 2 3 # 39 "c:/winavr-20080610/lib/gcc/../../avr/include/avr/interrupt.h" 2 3 # 6 "clock_o.h" 2 namespace Clock{ extern volatile uint32_t ticks; void Init(void); }; inline uint32_t getTicks(void){ uint32_t t; __asm__ __volatile__ ("cli" ::); t = Clock::ticks; __asm__ __volatile__ ("sei" ::); return t; } # 3 "task.cpp" 2 namespace TaskManager{ volatile Task tasks[12]; volatile uint8_t cur_priority[3] = {0,0,0}; volatile uint8_t cur_tasks; volatile uint8_t cpu_usage; volatile uint8_t cur_done; volatile uint8_t counter; void AddTask(void (*function)(void*,void*), void* arg0, void* arg1,TASK_TYPE type,uint16_t interval,PRIORITY pri){ uint8_t index = 0; for(index=0; index<12;index++) if(!tasks[index].active) break; tasks[index].function = function; tasks[index].arg0 = arg0; tasks[index].arg1 = arg1; tasks[index].type = type; if(pri==HIGH) tasks[index].pri_level = 0; else if(pri==MEDIUM) tasks[index].pri_level = 1; else tasks[index].pri_level = 2; tasks[index].priority = pri + cur_priority[tasks[index].pri_level]++; tasks[index].interval = interval; tasks[index].active = true; tasks[index].next_run = getTicks() + (uint32_t)interval; } uint8_t ExecuteNextTask(void){ int8_t index = -1; uint8_t i; uint8_t leastpri = 0xff; uint32_t curt = getTicks(); cur_tasks = 0; counter++; if(counter==200){ cpu_usage = cur_done / 2; cur_done = 0; counter = 0; } for(i=0; i<12;i++){ if(tasks[i].active){ cur_tasks++; if(tasks[i].next_run<=curt){ if(tasks[i].priority