73 void integrity_check(
void) {
77 if(prio->
prev!=
NULL) { fatal(
"ERR10"); }
81 if(prio->
next->
prev!=prio) { fatal(
"ERR11"); }
86 if(td==
NULL) { fatal(
"ERR13"); }
87 if(td->
priority!=prio) { fatal(
"ERR14"); }
88 if(td->
next->
prev != td) { fatal(
"ERR15"); }
89 if(td->
prev->
next != td) { fatal(
"ERR16"); }
92 }
while(td!=prio->
ctid);
105 #ifndef DOXYGEN_SHOULD_SKIP_THIS
109 .globl _tm_switcher\n\
112 ; r0 saved by system timer handler\n\
114 mov.w r1,@-r7 ; save registers\n\
120 mov.w r7,r0 ; pass sp\n\
122 jsr _tm_scheduler ; call scheduler\n\
124 _tm_switcher_return: \n\
125 mov.w r0,r7 ; set new sp\n\
133 ; r0 will be restored by system timer handler\n\
134 ; r6 will be restored by ROM\n\
136 rts ; return to new task\n\
138 #endif // DOXYGEN_SHOULD_SKIP_THIS
155 if(ctid->
next!=ctid) {
171 priority_head = priority->
next;
195 #endif // CONF_TM_DEBUG
223 priority=priority_head;
242 if(next == priority->
ctid) {
247 priority = priority->
next;
256 priority = priority_head;
271 extern void yield(
void);
272 #ifndef DOXYGEN_SHOULD_SKIP_THIS
278 stc ccr,r0h ; to fake an IRQ, we have to\n\
279 push r0 ; store the registers\n\
280 orc #0x80,ccr ; disable interrupts\n\
282 push r6 ; store r6\n\
284 mov.w #0x04d4,r0 ; store rom return addr\n\
287 push r0 ; store r0 (destroyed by call.)\n\
289 mov.w #_systime_tm_return,r0 ; store systime return addr\n\
292 jmp @_tm_switcher ; call task switcher\n\
294 #endif // DOXYGEN_SHOULD_SKIP_THIS
299 extern int tm_idle_task(
int argc,
char **argv) __attribute__ ((noreturn));
300 #ifndef DOXYGEN_SHOULD_SKIP_THIS
308 #endif // DOXYGEN_SHOULD_SKIP_THIS
314 int tm_man_task(
int argc,
char **argv)
319 if(nb_tasks > nb_system_tasks) state ^= 1;
else state=0;
321 #ifndef CONF_LCD_REFRESH
323 #endif // CONF_LCD_REFRESH
329 #ifdef CONF_BATTERY_INDICATOR
333 int tm_battery_task(
int argc,
char **argv) {
348 #endif // CONF_BATTERY_INDICATOR
378 #ifdef CONF_BATTERY_INDICATOR
380 #endif // CONF_BATTERY_INDICATOR
410 tid_t execi(
int (*code_start)(
int,
char**),
int argc,
char **argv,
424 size_t *sp=
malloc(stack_size);
438 if ((
size_t)code_start < (
size_t)&mm_start)
454 *(--sp)=(
size_t) &
exit;
460 *(--sp)=(
size_t) code_start;
466 *(--sp)=(
size_t) argc;
470 *(--sp)=(
size_t) argv;
483 for( pchain = priority_head;
485 ppchain = pchain, pchain = pchain->
next
487 if(pchain==
NULL || pchain->priority!=priority) {
493 newpchain->
next=pchain;
495 pchain->
prev =newpchain;
496 newpchain->
prev=ppchain;
498 ppchain->
next=newpchain;
500 priority_head=newpchain;
511 td->
next=pchain->ctid;
531 void exit(
int code) {
578 unsigned int msleep(
unsigned int msec)
580 #if defined(CONF_TIME) && defined(CONF_TM)
593 unsigned int sleep(
unsigned int sec)
595 return msleep(1000*sec)/1000;
615 pchain = priority_head;
616 while (pchain !=
NULL) {
619 if ((td->
tflags & flags) != 0) {
625 }
while (td != pchain->
ctid);
626 pchain = pchain->
next;
667 pchain=priority_head;
668 while(pchain!=
NULL && prio<pchain->priority)
671 while(pchain!=
NULL) {
674 if((td!=ctid) && ((td->
tflags & flags) == 0)) {
681 }
while(td!=pchain->
ctid);