41,6 → 41,7 |
#include "ll/i386/advtimer.h" |
|
#include "drivers/shark_keyb26.h" |
#include "drivers/shark_cpu26.h" |
|
#define UPDATE_PERIOD 10000 |
#define UPDATE_WCET 1000 |
48,6 → 49,11 |
extern unsigned int clk_per_msec; |
extern unsigned int apic_clk_per_msec; |
|
int freq_number = 0; |
int cur_frequency = 0; |
int cur_freq_number = 0; |
int dvs_status = 0; |
|
TASK Update(void *arg) |
{ |
struct timespec actual_timer; |
58,6 → 64,33 |
signed long long start,end,res; |
struct timespec s_test,startts,endts; |
|
/* Get the DVS status */ |
int i; |
char dvs_frequencies[1000]; |
|
dvs_status = CPU26_DVS_status(); |
|
if (dvs_status > 0) { |
|
printf_xy(0,11,WHITE,"Dynamic Frequency Scaling Supported"); |
printf_xy(0,12,WHITE,"Press \"q\" to raise or \"a\" to lower CPU freq"); |
|
CPU26_show_frequencies(dvs_frequencies); |
freq_number = CPU26_get_frequencies(cpu26_freqs); |
printf_xy(0,13,WHITE,"Supported Frequencies [ %s: %d ]",dvs_frequencies,freq_number); |
cur_frequency = CPU26_get_cur_frequency(); |
printf_xy(0,14,WHITE,"Current Frequency [ %10d ]",cur_frequency); |
|
for (i=0;i<freq_number;i++) |
if (cpu26_freqs[i] == cur_frequency) break; |
cur_freq_number = i; |
|
} else { |
|
printf_xy(0,11,WHITE,"Dynamic Frequency Scaling NOT Supported"); |
|
} |
|
task_nopreempt(); |
|
num_delay = tot_delay = mean_delay = 0; |
109,6 → 142,9 |
printf_xy(0,7,WHITE,"Actual Timer: %2ld d %2ld h %2ld m %2ld s %12ld ns",day,hrs,min,sec,(long)nsec); |
|
printf_xy(0,9,WHITE,"Timer Access Delay: %12ld ns",mean_delay); |
|
if (dvs_status > 0) |
printf_xy(0,14,WHITE,"Current Frequency [ %10d ]",CPU26_get_cur_frequency()); |
|
task_endcycle(); |
|
130,7 → 166,26 |
void program_key_end(KEY_EVT* e) |
{ |
sys_end(); |
} |
} |
|
void up_freq(KEY_EVT* e) |
{ |
|
if (dvs_status > 0) { |
cur_freq_number++; |
if (cur_freq_number >= freq_number) cur_freq_number--; |
CPU26_set_frequency(cpu26_freqs[cur_freq_number],DVS_RELATION_H); |
} |
} |
|
void down_freq(KEY_EVT* e) |
{ |
if (dvs_status > 0) { |
cur_freq_number--; |
if (cur_freq_number < 0) cur_freq_number++; |
CPU26_set_frequency(cpu26_freqs[cur_freq_number],DVS_RELATION_L); |
} |
} |
|
int main(int argc, char **argv) |
{ |
145,6 → 200,18 |
k.status = KEY_PRESSED; |
keyb_hook(k,program_key_end,FALSE); |
|
k.flag = 0; |
k.scan = KEY_Q; |
k.ascii = 'q'; |
k.status = KEY_PRESSED; |
keyb_hook(k,up_freq,FALSE); |
|
k.flag = 0; |
k.scan = KEY_A; |
k.ascii = 'a'; |
k.status = KEY_PRESSED; |
keyb_hook(k,down_freq,FALSE); |
|
set_screen(); |
|
hard_task_default_model(mp); |