BeRTOS
|
00001 00039 #include "context_switch.h" 00040 00041 #include "hw/hw_led.h" 00042 00043 #include "cfg/cfg_context_switch.h" 00044 #include <cfg/debug.h> 00045 00046 #include <cpu/irq.h> 00047 #include <cpu/power.h> 00048 00049 #include <drv/timer.h> 00050 #if CONFIG_USE_HP_TIMER 00051 #include <drv/ser.h> 00052 static Serial out; 00053 #endif 00054 00055 #include <kern/proc.h> 00056 00057 #define PROC_STACK_SIZE KERN_MINSTACKSIZE 00058 00059 static PROC_DEFINE_STACK(hp_stack, PROC_STACK_SIZE); 00060 static PROC_DEFINE_STACK(lp_stack, PROC_STACK_SIZE); 00061 00062 static Process *hp_proc, *lp_proc, *main_proc; 00063 #if CONFIG_USE_HP_TIMER 00064 static hptime_t start, end; 00065 #endif 00066 00067 static void NORETURN hp_process(void) 00068 { 00069 while (1) 00070 { 00071 sig_wait(SIG_USER0); 00072 #if CONFIG_USE_LED 00073 LED_ON(); 00074 #endif 00075 #if CONFIG_USE_HP_TIMER 00076 end = timer_hw_hpread(); 00077 #endif 00078 sig_send(main_proc, SIG_USER0); 00079 } 00080 } 00081 00082 static void NORETURN lp_process(void) 00083 { 00084 while (1) 00085 { 00086 sig_wait(SIG_USER0); 00087 #if CONFIG_USE_LED 00088 LED_ON(); 00089 LED_OFF(); 00090 #endif 00091 #if CONFIG_USE_HP_TIMER 00092 start = timer_hw_hpread(); 00093 #endif 00094 sig_send(hp_proc, SIG_USER0); 00095 } 00096 } 00097 00098 00099 void NORETURN context_switch(void) 00100 { 00101 IRQ_ENABLE; 00102 timer_init(); 00103 proc_init(); 00104 00105 #if CONFIG_USE_HP_TIMER 00106 ser_init(&out, CONFIG_CTX_DEBUG_PORT); 00107 ser_setbaudrate(&out, CONFIG_CTX_DEBUG_BAUDRATE); 00108 #endif 00109 00110 #if CONFIG_USE_LED 00111 LED_INIT(); 00112 #endif 00113 00114 proc_forbid(); 00115 hp_proc = proc_new(hp_process, NULL, PROC_STACK_SIZE, hp_stack); 00116 lp_proc = proc_new(lp_process, NULL, PROC_STACK_SIZE, lp_stack); 00117 main_proc = proc_current(); 00118 proc_setPri(hp_proc, 2); 00119 proc_setPri(lp_proc, 1); 00120 proc_permit(); 00121 00122 while (1) 00123 { 00124 timer_delay(100); 00125 00126 sig_send(lp_proc, SIG_USER0); 00127 sig_wait(SIG_USER0); 00128 00129 #if CONFIG_USE_HP_TIMER 00130 kfile_printf(&out.fd, 00131 "Switch: %lu.%lu usec\n\r", 00132 hptime_to_us((end - start)), 00133 hptime_to_us((end - start) * 1000) % 1000); 00134 #endif 00135 } 00136 }