This is the mail archive of the
ecos-discuss@sourceware.cygnus.com
mailing list for the eCos project.
Re: nc_test_slave.c fix
- To: Grant Edwards <grante at visi dot com>
- Subject: Re: [ECOS] nc_test_slave.c fix
- From: Gary Thomas <gthomas at redhat dot com>
- Date: Fri, 07 Apr 2000 11:20:04 -0600 (MDT)
- Cc: ecos-discuss at sourceware dot cygnus dot com
On 07-Apr-00 Grant Edwards wrote:
> What I would probably do is use a binary search that terminates
> when we've gotten as close as we can, independant of the amount
> of error in the result:
>
I like it! This is much closer to the original intent, but the details
somehow got in the way. I did leave in the +/- 2% check though.
Here's my final code:
#define MAX_LOAD_THREAD_LEVEL 20
#define MIN_LOAD_THREAD_LEVEL 0
//
// This function is called to calibrate the "background load" which can be
// applied during testing. It will be called before any commands from the
// host are managed.
//
static void
calibrate_load(int desired_load)
{
long long no_load_idle, load_idle;
int percent_load;
int high, low;
// Set limits
high = MAX_LOAD_THREAD_LEVEL;
low = MIN_LOAD_THREAD_LEVEL;
// Compute the "no load" idle value
idle_thread_count = 0;
cyg_semaphore_post(&idle_thread_sem); // Start idle thread
cyg_thread_delay(1*100); // Pause for one second
cyg_semaphore_wait(&idle_thread_sem); // Stop idle thread
no_load_idle = idle_thread_count;
test_printf("No load = %d\n", (int)idle_thread_count);
while (true) {
load_thread_level = (high + low) / 2;
start_load(desired_load); // Start up a given load
idle_thread_count = 0;
cyg_semaphore_post(&idle_thread_sem); // Start idle thread
cyg_thread_delay(1*100); // Pause for one second
cyg_semaphore_wait(&idle_thread_sem); // Stop idle thread
load_idle = idle_thread_count;
start_load(0); // Shut down background load
percent_load = 100 - ((load_idle * 100) / no_load_idle);
test_printf("Load[%d] = %d => %d%%\n", load_thread_level,
(int)idle_thread_count, percent_load);
if (((high-low) <= 1) || (abs(desired_load-percent_load) <= 2)) break;
if (percent_load < desired_load) {
low = load_thread_level;
} else {
high = load_thread_level;
}
}
}