⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 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 + -