嵌入式开发中监视程序运行情况的方法

前言

在程序运行中,为了了解程序的性能或者定位问题,我们需要了解程序的动态运行情况,也就是了解程序的一些关键变量的值是多少。但是程序运行起来,不方便去操作程序,那就要求我们在程序中添加好打印代码,程序运行中能不断的打印关键变量的值。但是要打印的关键变量可能不在一个源文件里,并且打印不能刷屏,导致打印太多,覆盖掉有用信息。

实现思路:

1.首先我们需要创建一个线程,该线程的作用就是定时调用注册的函数;
2.在每一个.c源文件里,写一个统计函数,该函数就是统计关键字的信息并打印;
3.编写函数注册的函数,需要打印的统计函数,就调用一下注册函数,将该统计函数注册一下;
4.将第二步的统计函数,注册到第一步创建的线程里,让线程每隔一段时间就去调用。

实现代码:logonPrintf.c

本源文件就是按照上面的思路实现,里面包括注册函数功能的函数和打印统计函数的线程。需要注册的打印函数就通过DebugLogon()函数注册,但是本源文件只是便于理解实现思路,并没有去实际编译运行过,如果有需要的小伙伴请自己调试,主体部分代码都编写完成,稍加调试就可以使用。

#include <stdio.h>

typedef struct LogPrintFun
{ 
	int enable;				//使能,1:允许;0:禁止
    void* args; 					//函数的传参
    int (*statFun)(void* args); //函数指针
} LogPrintFun;

typedef struct debugInfo
	
{ 
	int runStatus;	//线程的运行状态
	int cnt;	//注册函数的个数
    LogPrintFun logFun[10]; //保存注册函数的信息
} debugInfo;

//静态全局变量
static debugInfo gDebugLog;

//注册函数:调用此函数注册
int DebugLogon(int (*statFun)(void* args), void *arg, int enAble)
{
	debugInfo* pObj = &gDebugLog;
	LogPrintFun* pFunList = pObj->logFun;

	//注册函数个数已经达到上限
	if(pObj->cnt >= 10)
	{
		printf("[DebugLogon] The limit has been reached\n");
		return -1;
	}
	else
	{
		pFunList[pObj->cnt].enable 	= arg;
		pFunList[pObj->cnt].args 	= enAble;
		pFunList[pObj->cnt].statFun = statFun;
		pObj->cnt++;
	}
		
	return 0;
	
}

//打印统计函数的线程函数
static int logThread(void * arg)
{
	debugInfo* pObj = &gDebugLog;

	LogPrintFun* pFunList = pObj->logFun;
	int i = 0;
	
	while (1)
	{	
		//可以有一个变量来控制线程是否运行
		if(pObj->runStatus == -1)
		{
			sleep(1);
			continue;
		}
		else
		{
			//打印注册的函数
			for(i = 0; i < pObj->cnt; i++)
			{
				if(pFunList->enable)
				{
					pFunList->statFun(pFunList->args);
				}
				pFunList++;
			}

			sleep(1);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值