📄 buffer.cxx
字号:
externC void
cyg_tracenomsg( const char *psz_func, const char *psz_file, cyg_uint32 linenum )
{
cyg_uint32 old_ints;
if( !cyg_infra_trace_buffer_enable ) return;
HAL_DISABLE_INTERRUPTS(old_ints);
Cyg_TraceRecord *rec = &cyg_infra_trace_buffer[cyg_infra_trace_buffer_pos];
rec->what = 0;
rec->tid = get_tid();
rec->function = psz_func;
rec->file = psz_file;
rec->line = linenum;
rec->message = 0;
rec->narg = 0;
increment_buffer_pos();
HAL_RESTORE_INTERRUPTS(old_ints);
};
// provide every other one of these as a space/caller bloat compromise.
externC void
cyg_tracemsg( cyg_uint32 what,
const char *psz_func, const char *psz_file, cyg_uint32 linenum,
const char *psz_msg )
{
cyg_uint32 old_ints;
if( !cyg_infra_trace_buffer_enable ) return;
HAL_DISABLE_INTERRUPTS(old_ints);
Cyg_TraceRecord *rec = &cyg_infra_trace_buffer[cyg_infra_trace_buffer_pos];
rec->what = what;
rec->tid = get_tid();
rec->function = psz_func;
rec->file = psz_file;
rec->line = linenum;
rec->message = psz_msg;
rec->narg = 0;
increment_buffer_pos();
HAL_RESTORE_INTERRUPTS(old_ints);
};
externC void
cyg_tracemsg2( cyg_uint32 what,
const char *psz_func, const char *psz_file, cyg_uint32 linenum,
const char *psz_msg,
CYG_ADDRWORD arg0, CYG_ADDRWORD arg1 )
{
cyg_uint32 old_ints;
if( !cyg_infra_trace_buffer_enable ) return;
HAL_DISABLE_INTERRUPTS(old_ints);
Cyg_TraceRecord *rec = &cyg_infra_trace_buffer[cyg_infra_trace_buffer_pos];
rec->what = what;
rec->tid = get_tid();
rec->function = psz_func;
rec->file = psz_file;
rec->line = linenum;
rec->message = psz_msg;
rec->narg = 2;
rec->arg[0] = arg0;
rec->arg[1] = arg1;
increment_buffer_pos();
HAL_RESTORE_INTERRUPTS(old_ints);
};
externC void
cyg_tracemsg4( cyg_uint32 what,
const char *psz_func, const char *psz_file, cyg_uint32 linenum,
const char *psz_msg,
CYG_ADDRWORD arg0, CYG_ADDRWORD arg1,
CYG_ADDRWORD arg2, CYG_ADDRWORD arg3 )
{
cyg_uint32 old_ints;
if( !cyg_infra_trace_buffer_enable ) return;
HAL_DISABLE_INTERRUPTS(old_ints);
Cyg_TraceRecord *rec = &cyg_infra_trace_buffer[cyg_infra_trace_buffer_pos];
rec->what = what;
rec->tid = get_tid();
rec->function = psz_func;
rec->file = psz_file;
rec->line = linenum;
rec->message = psz_msg;
rec->narg = 4;
rec->arg[0] = arg0;
rec->arg[1] = arg1;
rec->arg[2] = arg2;
rec->arg[3] = arg3;
increment_buffer_pos();
HAL_RESTORE_INTERRUPTS(old_ints);
};
externC void
cyg_tracemsg6( cyg_uint32 what,
const char *psz_func, const char *psz_file, cyg_uint32 linenum,
const char *psz_msg,
CYG_ADDRWORD arg0, CYG_ADDRWORD arg1,
CYG_ADDRWORD arg2, CYG_ADDRWORD arg3,
CYG_ADDRWORD arg4, CYG_ADDRWORD arg5 )
{
cyg_uint32 old_ints;
if( !cyg_infra_trace_buffer_enable ) return;
HAL_DISABLE_INTERRUPTS(old_ints);
Cyg_TraceRecord *rec = &cyg_infra_trace_buffer[cyg_infra_trace_buffer_pos];
rec->what = what;
rec->tid = get_tid();
rec->function = psz_func;
rec->file = psz_file;
rec->line = linenum;
rec->message = psz_msg;
rec->narg = 6;
rec->arg[0] = arg0;
rec->arg[1] = arg1;
rec->arg[2] = arg2;
rec->arg[3] = arg3;
rec->arg[4] = arg4;
rec->arg[5] = arg5;
increment_buffer_pos();
HAL_RESTORE_INTERRUPTS(old_ints);
};
externC void
cyg_tracemsg8( cyg_uint32 what,
const char *psz_func, const char *psz_file, cyg_uint32 linenum,
const char *psz_msg,
CYG_ADDRWORD arg0, CYG_ADDRWORD arg1,
CYG_ADDRWORD arg2, CYG_ADDRWORD arg3,
CYG_ADDRWORD arg4, CYG_ADDRWORD arg5,
CYG_ADDRWORD arg6, CYG_ADDRWORD arg7 )
{
cyg_uint32 old_ints;
if( !cyg_infra_trace_buffer_enable ) return;
HAL_DISABLE_INTERRUPTS(old_ints);
Cyg_TraceRecord *rec = &cyg_infra_trace_buffer[cyg_infra_trace_buffer_pos];
rec->what = what;
rec->tid = get_tid();
rec->function = psz_func;
rec->file = psz_file;
rec->line = linenum;
rec->message = psz_msg;
rec->narg = 6;
rec->arg[0] = arg0;
rec->arg[1] = arg1;
rec->arg[2] = arg2;
rec->arg[3] = arg3;
rec->arg[4] = arg4;
rec->arg[5] = arg5;
rec->arg[6] = arg6;
rec->arg[7] = arg7;
increment_buffer_pos();
HAL_RESTORE_INTERRUPTS(old_ints);
};
// -------------------------------------------------------------------------
externC void
cyg_trace_print(void)
{
cyg_bool old_enable = cyg_infra_trace_buffer_enable;
cyg_infra_trace_buffer_enable = false;
print_trace_buffer();
cyg_infra_trace_buffer_pos = 0;
cyg_infra_trace_buffer_wrap = false;
cyg_infra_trace_buffer_enable = old_enable;
}
// -------------------------------------------------------------------------
externC void
cyg_trace_dump(void)
{
#if defined(CYGPKG_KERNEL) && defined(CYG_DIAG_PRINTF)
{
diag_printf("\nScheduler:\n\n");
Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
diag_printf("Lock: %d\n",sched->get_sched_lock() );
# ifdef CYGVAR_KERNEL_THREADS_NAME
diag_printf("Current Thread: %s\n",sched->get_current_thread()->get_name());
# else
diag_printf("Current Thread: %d\n",sched->get_current_thread()->get_unique_id());
# endif
}
# ifdef CYGVAR_KERNEL_THREADS_LIST
{
Cyg_Thread *t = Cyg_Thread::get_list_head();
diag_printf("\nThreads:\n\n");
while( NULL != t )
{
cyg_uint32 state = t->get_state();
char tstate[7];
char *tstate1 = "SCUKX";
static char *(reasons[8]) =
{
"NONE", // No recorded reason
"WAIT", // Wait with no timeout
"DELAY", // Simple time delay
"TIMEOUT", // Wait with timeout/timeout expired
"BREAK", // forced break out of sleep
"DESTRUCT", // wait object destroyed[note]
"EXIT", // forced termination
"DONE" // Wait/delay complete
};
if( 0 != state )
{
// Knock out chars that do not correspond to set bits.
for( int i = 0; i < 6 ; i++ )
if( 0 == (state & (1<<i)) )
tstate[i] = ' ';
else tstate[i] = tstate1[i];
tstate[6] = 0;
}
else tstate[0] = 'R', tstate[1] = 0;
# ifdef CYGVAR_KERNEL_THREADS_NAME
diag_printf( "%20s pri = %3d state = %6s id = %3d\n",
t->get_name(),
t->get_priority(),
tstate,
t->get_unique_id()
);
# else
diag_printf( "Thread %3d pri = %3d state = %6s\n",
t->get_unique_id(),
t->get_priority(),
tstate
);
# endif
diag_printf( "%20s stack base = %08x ptr = %08x size = %08x\n",
"",
t->get_stack_base(),
#ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT
t->get_saved_context(),
#else
0,
#endif
t->get_stack_size()
);
diag_printf( "%20s sleep reason %8s wake reason %8s\n",
"",
reasons[t->get_sleep_reason()],
reasons[t->get_wake_reason()]
);
diag_printf( "%20s queue = %08x wait info = %08x\n",
"",
t->get_current_queue(),
t->get_wait_info()
);
diag_printf("\n");
t = t->get_list_next();
}
}
# endif // CYGVAR_KERNEL_THREADS_LIST
#endif // CYG_DIAG_PRINTF
}
#endif // CYGDBG_USE_TRACING
// -------------------------------------------------------------------------
// Assert functions:
#ifdef CYGDBG_USE_ASSERTS
externC void
cyg_assert_fail( const char *psz_func, const char *psz_file,
cyg_uint32 linenum, const char *psz_msg ) __THROW
{
cyg_uint32 old_ints;
HAL_DISABLE_INTERRUPTS(old_ints);
DIAG_DEVICE_START_SYNC();
diag_write_string("ASSERT FAIL: ");
write_thread_id();
diag_write_string(trim_file(psz_file));
write_lnum(linenum);
diag_write_string(trim_func(psz_func));
diag_write_char(' ');
diag_write_string(psz_msg);
diag_write_char('\n');
#ifdef CYGDBG_INFRA_DEBUG_TRACE_BUFFER_PRINT_ON_ASSERT
cyg_trace_print();
cyg_trace_dump();
#endif
#ifdef CYGHWR_TEST_PROGRAM_EXIT
CYGHWR_TEST_PROGRAM_EXIT();
#endif
for(;;);
// DIAG_DEVICE_END_SYNC();
// HAL_RESTORE_INTERRUPTS(old_ints);
};
extern "C"
{
extern unsigned long _stext;
extern unsigned long _etext;
unsigned long stext_addr = (unsigned long)&_stext;
unsigned long etext_addr = (unsigned long)&_etext;
};
externC cyg_bool cyg_check_data_ptr(const void *ptr)
{
unsigned long p = (unsigned long)ptr;
if( p == 0 ) return false;
if( p > stext_addr && p < etext_addr ) return false;
return true;
}
externC cyg_bool cyg_check_func_ptr(const void (*ptr)(void))
{
unsigned long p = (unsigned long)ptr;
if( p == 0 ) return false;
if( p < stext_addr && p > etext_addr ) return false;
return true;
}
#endif // CYGDBG_USE_ASSERTS
#endif // CYGDBG_INFRA_DEBUG_TRACE_ASSERT_BUFFER
// -------------------------------------------------------------------------
// EOF buffer.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -