📄 debug.c
字号:
//*************************************************************************
//
// Copyright (C) SEIKO EPSON CORP. 1997
// All Rights Reserved
//
// Filename : debug.c
// Function : debug routine for ros33
// Revision :
// 1997/08/01 H.Matsuoka start
// 1999/11/26 H.Matsuoka hex[] change to const
// 2001/04/05 Y.Taka Add debug trace
//
//*************************************************************************
#include <stdio.h>
#include "ros33.h"
#include "internal.h"
void puthex(int , int);
//***********************************************************************
// This function is called from dispatch portion that next task is
// fixed. This sample prints task ID to stdout.
//***********************************************************************
void ros_dbg_tskcng(ID tskid)
{
puthex(tskid, 4);
}
//***********************************************************************
// This function is called from dispatch portion that task stack has
// broken. Note, you use mailbox message on task stack area, system
// change other task stack, then stack error be occur.
// This sample prints error to stdout and loops forever.
//***********************************************************************
void ros_dbg_stackerr()
{
puts("Task stack error");
while(1);
}
//***********************************************************************
// write hex data string to stdout
// [Parameters]
// data hex data
// size print byte size (1 - 4)
// [Return Parameters]
// none
//***********************************************************************
void puthex
(
int data,
int size
)
{
const static char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
static char tmp[9];
char* str = &tmp[9];
int i;
unsigned int mask = 0xf;
unsigned int value;
*str = 0;
size *= 2;
for(i=0; i<size; i++) {
value = data & mask;
value >>= i*4;
mask <<= 4;
str--;
*str = hex[value];
}
puts(str);
}
/*
void putstr(char *s)
{
while(*s)
putc(*s++, stdout);
}
*/
static unsigned long* func[] = {
/* Task Management Functions */
(unsigned long*)dis_dsp, /* syscal_num=0x01 (tskmng.c) */
(unsigned long*)ena_dsp, /* syscal_num=0x02 (tskmng.c) */
(unsigned long*)sta_tsk, /* syscal_num=0x03 (tskmng.c) */
(unsigned long*)ext_tsk, /* syscal_num=0x04 (tskmng.c) */
(unsigned long*)ter_tsk, /* syscal_num=0x05 (tskmng.c) */
(unsigned long*)chg_pri, /* syscal_num=0x06 (tskmng.c) */
(unsigned long*)rot_rdq, /* syscal_num=0x07 (tskmng.c) */
(unsigned long*)rel_wai, /* syscal_num=0x08 (tskmng.c) */
(unsigned long*)get_tid, /* syscal_num=0x09 (tskmng.c) */
(unsigned long*)0x00000000, /* syscal_num=0x0a not used */
(unsigned long*)0x00000000, /* syscal_num=0x0b not used */
(unsigned long*)0x00000000, /* syscal_num=0x0c not used */
(unsigned long*)0x00000000, /* syscal_num=0x0d not used */
(unsigned long*)0x00000000, /* syscal_num=0x0e not used */
(unsigned long*)0x00000000, /* syscal_num=0x0f not used */
/* Task-Dependent Synchronization Functions */
(unsigned long*)tslp_tsk, /* syscal_num=0x10 (tsksyn.c) */
(unsigned long*)wup_tsk, /* syscal_num=0x11 (tsksyn.c) */
(unsigned long*)sus_tsk, /* syscal_num=0x12 (tsksyn.c) */
(unsigned long*)rsm_tsk, /* syscal_num=0x13 (tsksyn.c) */
(unsigned long*)can_wup, /* syscal_num=0x14 (tsksyn.c) */
(unsigned long*)0x00000000, /* syscal_num=0x15 not used */
(unsigned long*)0x00000000, /* syscal_num=0x16 not used */
(unsigned long*)0x00000000, /* syscal_num=0x17 not used */
(unsigned long*)0x00000000, /* syscal_num=0x18 not used */
(unsigned long*)0x00000000, /* syscal_num=0x19 not used */
(unsigned long*)0x00000000, /* syscal_num=0x1a not used */
(unsigned long*)0x00000000, /* syscal_num=0x1b not used */
(unsigned long*)0x00000000, /* syscal_num=0x1c not used */
(unsigned long*)0x00000000, /* syscal_num=0x1d not used */
(unsigned long*)0x00000000, /* syscal_num=0x1e not used */
(unsigned long*)0x00000000, /* syscal_num=0x1f not used */
/* Synchronization and Communication Functions */
(unsigned long*)twai_sem, /* syscal_num=0x20 (semapho.c) */
(unsigned long*)sig_sem, /* syscal_num=0x21 (semapho.c) */
(unsigned long*)trcv_msg, /* syscal_num=0x22 (mailbox.c) */
(unsigned long*)snd_msg, /* syscal_num=0x23 (mailbox.c) */
(unsigned long*)twai_flg, /* syscal_num=0x24 (flag.c) */
(unsigned long*)set_flg, /* syscal_num=0x25 (flag.c) */
(unsigned long*)clr_flg, /* syscal_num=0x26 (flag.c) */
(unsigned long*)tsnd_mbf, /* syscal_num=0x27 (msgbuf.c) */
(unsigned long*)trcv_mbf, /* syscal_num=0x28 (msgbuf.c) */
(unsigned long*)0x00000000, /* syscal_num=0x29 not used */
(unsigned long*)0x00000000, /* syscal_num=0x2a not used */
(unsigned long*)0x00000000, /* syscal_num=0x2b not used */
(unsigned long*)0x00000000, /* syscal_num=0x2c not used */
(unsigned long*)0x00000000, /* syscal_num=0x2d not used */
(unsigned long*)0x00000000, /* syscal_num=0x2e not used */
(unsigned long*)0x00000000, /* syscal_num=0x2f not used */
/* Time Management and Memorypool Management Functions */
(unsigned long*)set_tim, /* syscal_num=0x30 (timemng.c) */
(unsigned long*)get_tim, /* syscal_num=0x31 (timemng.c) */
(unsigned long*)dly_tsk, /* syscal_num=0x32 (timemng.c) */
(unsigned long*)def_cyc, /* syscal_num=0x33 (timemng.c) */
(unsigned long*)act_cyc, /* syscal_num=0x34 (timemng.c) */
(unsigned long*)def_alm, /* syscal_num=0x35 (timemng.c) */
(unsigned long*)sys_clk, /* syscal_num=0x36 (ros33asm.s) not used */
(unsigned long*)ret_tmr, /* syscal_num=0x37 (ros33asm.s) not used */
(unsigned long*)tget_blk, /* syscal_num=0x38 (mempol.c) */
(unsigned long*)rel_blk, /* syscal_num=0x39 (mempol.c) */
(unsigned long*)tget_blf, /* syscal_num=0x3a (mempol.c) */
(unsigned long*)rel_blf, /* syscal_num=0x3b (mempol.c) */
(unsigned long*)0x00000000, /* syscal_num=0x3c not used */
(unsigned long*)0x00000000, /* syscal_num=0x3d not used */
(unsigned long*)0x00000000, /* syscal_num=0x3e not used */
(unsigned long*)0x00000000, /* syscal_num=0x3f not used */
/* System Management,Interrupt Management and
Implementation-Dependent Functions */
(unsigned long*)get_ver, /* syscal_num=0x40 (ros33.c) */
(unsigned long*)loc_cpu, /* syscal_num=0x41 (intmng.c) */
(unsigned long*)unl_cpu, /* syscal_num=0x42 (intmng.c) */
(unsigned long*)ent_int, /* syscal_num=0x43 (ros33.c) not used */
(unsigned long*)ret_int, /* syscal_num=0x44 (ros33asm.s) not used */
(unsigned long*)vcre_tsk, /* syscal_num=0x45 (ros33.c) */
(unsigned long*)vcre_mbf, /* syscal_num=0x46 (ros33.c) */
(unsigned long*)vcre_mpl, /* syscal_num=0x47 (ros33.c) */
(unsigned long*)vcre_mpf, /* syscal_num=0x48 (ros33.c) */
(unsigned long*)vchg_semcnt, /* syscal_num=0x49 (ros33.c) */
(unsigned long*)vchk_timer, /* syscal_num=0x4a (ros33.c) */
(unsigned long*)0x00000000, /* syscal_num=0x4cbnot used */
(unsigned long*)0x00000000, /* syscal_num=0x4c not used */
(unsigned long*)0x00000000, /* syscal_num=0x4d not used */
(unsigned long*)0x00000000, /* syscal_num=0x4e not used */
(unsigned long*)0x00000000 /* syscal_num=0x4f not used */
};
#define MAX_BUF_CNT 0xa0
#define LOG_FULL 0x00000001 /* full_flg */
#define LOG_STAT 0x00000002 /* start_flg */
static unsigned int head_cnt; /* Don't replace head_cnt, */
static unsigned int tail_cnt; /* tail_cnt, log_flg, */
static unsigned int log_flg; /* log_max, and */
static unsigned int log_max; /* ros_dbg_trace_buf */
unsigned int ros_dbg_trace_buf[MAX_BUF_CNT]; /* */
/*
log_flg
31 24 16 8 0
+---------------+---------------+---------------+-----------+-+-+
| |S|F|
+---------------+---------------+---------------+-----------+-+-+
F: full_flg
S: start_flg
ros_dbg_trace_buf[i]
31 24 16 8 0
+---------------+---------------+---------------+---------------+
| systime_16bit | tid/func_num | eventtype |
+---------------+---------------+---------------+---------------+
*/
init_ros_dbg_logging()
{
head_cnt = 0; /* init head counter */
tail_cnt = 0; /* init tail counter */
log_flg = LOG_STAT; /* init full_flag and set start_flg */
log_max = MAX_BUF_CNT; /* set log_max counter */
}
end_ros_dbg_logging()
{
log_flg &= ~LOG_STAT; /* logging end */
}
ros_dbg_logging(char eventtype)
{
unsigned int temp;
int i;
if(log_flg & LOG_STAT){ /* if start flg > 0 */
/* get systime(16bit) */
temp = (unsigned int)(g_sSysTime.ltime);
temp = temp << 16;
temp |= eventtype; /* set eventtype */
if(eventtype == 1){ /* dispatch routine */
i = 1; /* search task number */
while(&g_sTskcb[i-1] != g_pCurTsk){
i++;
if(i > TSK_NUM){
break;
}
}
i = i << 8;
temp |= i; /* set task id */
}
if(eventtype == 5){ /* cychandler routine */
i = 1; /* search task number */
while(&g_sCycHndrcb[i-1] != g_pCurHndr){
i++;
if(i > CYCHNDR_NUM){
break;
}
}
i = i << 8;
temp |= i; /* set cycno */
}
if(eventtype == 6){ /* almhandler routine */
i = 1; /* search task number */
while(&g_sAlmHndrcb[i-1] != g_pCurHndr){
i++;
if(i > ALMHNDR_NUM){
break;
}
}
i = i << 8;
temp |= i; /* set almno */
}
ros_dbg_trace_buf[tail_cnt] = temp; /* set logging data to trace_buf */
tail_cnt++;
if(tail_cnt >= MAX_BUF_CNT){
tail_cnt = 0;
log_flg |= LOG_FULL; /* set full flag */
}
if(log_flg & LOG_FULL){
head_cnt = tail_cnt;
}
}
}
static unsigned long* syscall_adr;
ros_dbg_syscall_trace()
{
UINT temp, func_num;
#if 0 //gfdmodified
asm("ld.w %r4, [%sp+0]");
asm("sub %r4, 6"); /* get system call address */
asm("xld.w [syscall_adr], %r4");
asm("pushn %r15");
#endif
if(log_flg & LOG_STAT){ /* if start flag > 0 */
for(func_num = 1; func_num < 0x50; func_num++){
if(syscall_adr == func[func_num-1]){
break;
}
}
/* get systime(16bit) */
temp = (unsigned int)(g_sSysTime.ltime);
temp = temp << 8;
temp |= func_num; /* set func number */
temp = temp << 8;
temp |= 0x02; /* set eventtype(syscal=2) */
ros_dbg_trace_buf[tail_cnt] = temp; /* set logging data to trace_buf */
tail_cnt++;
if(tail_cnt >= MAX_BUF_CNT){
tail_cnt = 0;
log_flg |= LOG_FULL; /* set full flag */
}
if(log_flg & LOG_FULL){
head_cnt = tail_cnt;
}
}
#if 0 //gfd modified
asm("popn %r15");
#endif
}
ros_dbg_bufinfo(VP* start_adr, VP* end_adr)
{
*start_adr = (UINT*)&head_cnt; /* set start address */
*end_adr = (UINT*)&ros_dbg_trace_buf[MAX_BUF_CNT]; /* set head counter */
}
ros_dbg_loginfo(UINT* max_size, UINT* p_head, UINT* p_tail, UINT* p_full)
{
*max_size = MAX_BUF_CNT; /* set max buffer size */
*p_head = head_cnt; /* set head counter */
*p_tail = tail_cnt; /* set tail counter */
*p_full = log_flg & LOG_FULL; /* set full flag */
}
ros_dbg_logdata(UINT* p_data, UINT blknum)
{
*p_data = ros_dbg_trace_buf[blknum-1]; /* get logging data from trace_buf */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -