This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Re: Type of event in eCos instrumentation record
> http://ecos.sourceware.org/cgi-bin/cvsweb.cgi/ecos/packages/kernel/current/host/instr/readme.txt?rev=1.1&content-type=text/x-cvsweb-markup&cvsroot=ecos
>
> ? ? ? ?Andrew
>
Thank you Mr. Andrew! I did all steps listed at readme file. But, I
couldn't solve my problem.
Let me give you more information what/how I am doing.
I am using Single Producer and Single Consumer application as a test.
Here is the code, where I enabled only CYG_INSTRUMENT_CLASS_THREAD
macro. Currently, I need number of thread exchanges only.
[...]
cyg_instrument_enable(CYG_INSTRUMENT_CLASS_THREAD, 0);
diag_printf("Consumer started\n");
int k = 0;
while (k<10)
{
cyg_semaphore_wait(&sem_wrote);
diag_printf("consumed = %d\n", data);
cyg_semaphore_post(&sem_read);
cyg_thread_delay(100);
k++;
}
cyg_instrument_disable(CYG_INSTRUMENT_CLASS_THREAD, 0);
[...]
I have a similar code for producer thread as well.
Based on your link, I have built my instrument_desc.h file and I could
see event types and number are made as dictionary (key and value).
Here is the excerpt.
struct instrument_desc_s {
char * msg;
CYG_WORD num;
};
struct instrument_desc_s instrument_desc[] = {
{"ALARM", 0x0900},
{"ALARM_ADD", 1},
{"ALARM_CALL", 3},
{"ALARM_INIT", 4},
{"ALARM_INTERVAL", 6},
{"ALARM_REM", 2},
{"ALARM_TRIGGER", 5},
[...]
If I am not wrong, *CYG_WORD num* of *instrument_desc_s* should be
equal to instrument_buffer[INDEX].type of Instrument_Record:
struct Instrument_Record
{
CYG_WORD16 type; // record type
CYG_WORD16 thread; // current thread id
CYG_WORD timestamp; // 32 bit timestamp
CYG_WORD arg1; // first arg
CYG_WORD arg2; // second arg
};
struct Instrument_Record instrument_buffer[100];
So, I made a simple function, where I got name of the instrumentation
event based on its number. Here is function code:
void print_instr(){
int i =0, j=0;
bool found = false;
char *message;
intr_count = 0;
while (instrument_desc[j].num != 0)
{
intr_count++; j++;
}
for (i = 0; i <instrument_buffer_size; i++) {
j = 0; found = false;
while ((!found) && (j<intr_count))
{
if (instrument_buffer[i].type == instrument_desc[j].num)
{
message = instrument_desc[j].msg;
found = true;
} else
message = "unknown event";
j++;
diag_printf("j=%d\n",j);
}
printf("Record %02d: type %s, thread %d, ",
i, message, instrument_buffer[i].thread);
printf("time %5d, arg1 0x%08x, arg2 0x%08x\n",
instrument_buffer[i].timestamp, instrument_buffer[i].arg1,
instrument_buffer[i].arg2);
}
}
Now I have two problems.
1) All of the events are "unknown event". instrument_buffer[i].type
and instrument_desc[j].num does not match.
2) If you look to struct instrument_desc_s instrument_desc[] there are
125 instrumentation event types and for several event types, it has
the same number. So, my print_instr() I am taking the first occurred
one, while it is not always correct.
How can have "instrumentation event names" as it is given at
http://sourceware.org/ml/ecos-discuss/2005-07/msg00036.html ?
Thanks,
Nodir.
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss