dbg_proc

本文档介绍了用于嵌入式系统的调试工具宏定义和配置文件,包括PRT/PRN/PFL/PFR宏,用于打印和内存检查,以及dbg_stat和dbg_para结构及其操作。展示了如何创建和管理调试统计和参数结构,适合深入理解嵌入式系统调试和配置。
摘要由CSDN通过智能技术生成

#ifndef __DBG__
#define __DBG__

#define PRT(fmt, args...)   do { if(g_dbg_para.printken & 1) printk(fmt, ## args); } while(0)
#define PRN(fmt, args...)   do { PRT(fmt"\r\n", ## args); } while(0)
#define PFL(fmt, args...)   do { PRT("[DBG:%s(%d)] "fmt, __func__, __LINE__, ## args); } while(0)
#define PFR(fmt, args...)   do { PFL(fmt"\r\n", ## args); } while(0)
#define PRT_MEM(type, mem, fmt...)      do { if (type).mem) PFR("\t"#mem"\t:\t"fmt, (type).mem); } while(0)

#define PFRERR(fmt, args...)            do { fprintf(stderr, "[DBG:%s(%d)] "fmt"\r\n", __func__, __LINE__, ## args); } while(0)

#define SEQ_PFR(fmt, args...)           do { seq_printf(seq, fmt"\r\n", ## args); } while(0)
#define SEQ_PRT_MEM(type, mem, fmt...)  do { if (type).mem) seq_printf(seq, "\t"#mem"\t:\t"fmt"\r\n", (type).mem); } while(0)

struct dbg_stat {
    u32 stat0;
    u32 stat1;
    u32 stat2;
    u32 stat3;
    u32 stat4;    
    u32 stat5;
    u32 stat6;
    u32 stat7;
    u32 stat8;
    u32 stat9;
};
    
struct dbg_para {
    u32 printken;
    u32 para1;
    u32 para2;
    u32 para3;
    u32 para4;
    u32 para5;
    u32 para6;
    u32 para7;
    u32 para8;
    u32 para9;
};

extern struct dbg_stat g_dbg_stat;
extern struct dbg_para g_dbg_para;

#endif
 

#ifndef __DBG_PROC__

#ifndef __DBG_STAT__

struct dbg_stat g_dbg_stat = {0};
static int dbg_stat_show(struct seq_file* seq, void* v)
{
    SEQ_PFR("%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s\r\n"
            "%10u%10u%10u%10u%10u%10u%10u%10u%10u%10u\r\n",
        "stat0", "stat1", "stat2", "stat3", "stat4", "stat5", "stat6", "stat7", "stat8", "stat9",
        dbg_stat.stat0, dbg_stat.stat1, dbg_stat.stat2, dbg_stat.stat3, dbg_stat.stat4,
        dbg_stat.stat5, dbg_stat.stat6, dbg_stat.stat7, dbg_stat.stat8, dbg_stat.stat9);
    return 0;
}

static int dbg_stat_write(struct file * filp, const char __user * *ubuf, 
                               size_t count, loff_t *f_ops)
{
    memset(&g_dbg_stat, 0, sizeof(g_dbg_stat));
    return count;
}
                               
static int dbg_stat_open(struct inode *inode, struct file *file)
{
    return single_open(file, dbg_stat_show, NULL);
}

struct file_operations dbg_stat_fops = {
    .owner        = THIS_MODULE,
    .open       = dbg_stat_open,
    .write      = dbg_stat_write,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = seq_release,
};

#endif

#ifndef __DBG_PARA__

struct dbg_para g_dbg_para = {.printken = 1};

static int dbg_para_show(struct seq_file* seq, void* v)
{
    SEQ_PRT_MEM(g_dbg_para, printken);
    SEQ_PFR("%10s%10s%10s%10s%10s%10s%10s%10s%10s\r\n"
            "%10u%10u%10u%10u%10u%10u%10u%10u%10u\r\n",
        "para1", "para2", "para3", "para4", "para5", "para6", "para7", "para8", "para9",
        dbg_para.para1, dbg_para.para2, dbg_para.para3, dbg_para.para4, dbg_para.para5, 
        dbg_para.para6, dbg_para.para7, dbg_para.para8, dbg_para.para9);

    return 0;
}

static int dbg_para_write(struct file * filp, const char __user * *ubuf, 
                               size_t count, loff_t *f_ops)
{
    char buf[32]  = {0};
    if(copy_from_user(buf, ubuf, (31 > count)?count:31)) {
        return -1;
    }

    // g_dbg_para.printken = simple_strtol(buf, NULL, 0);
    if (sscanf(buf, "%u %u %u %u %u %u %u %u %u %u", 
            &g_dbg_para.printken, &g_dbg_para.para1, 
            &g_dbg_para.para2   , &g_dbg_para.para3, 
            &g_dbg_para.para4   , &g_dbg_para.para5, 
            &g_dbg_para.para6   , &g_dbg_para.para7, 
            &g_dbg_para.para8   , &g_dbg_para.para9) < 0) {
        return -1;
    }

    return count;
}
                               
static int dbg_para_open(struct inode *inode, struct file *file)
{
    return single_open(file, dbg_para_show, NULL);
}

struct file_operations dbg_para_fops = {
    .owner        = THIS_MODULE,
    .open       = dbg_para_open,
    .write      = dbg_para_write,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = seq_release,
};

#endif

static int __init proc_dbg_init(void)
{
    proc_create("dbg_stat", 0, NULL, &dbg_stat_fops);
    proc_create("dbg_para", 0, NULL, &dbg_para_fops);
    return 0;
}

fs_initcall(proc_dbg_init);

#endif
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值