Chinaunix首页 | 论坛 | 博客

分类: LINUX

2012-10-23 20:27:49

<转载>推荐C的预定义符号: __func__, __FUNCTION__
前段时间说到用C的预定义符号__DATE__和__TIME__,可以做版本表示,今天再给大家推荐预定义符号__func__.

同志们都遇到过这样的事吧? 好不容易板子做好了,代码写完了,软硬件结合系统跑起来了,信心满满的弄到现场测试,有干扰,飞了!

一定都有看门狗的, 呵呵, 看门狗一般就是习惯性的弄个复位! 干扰在哪个地方出现的呢? 出现干扰的时候咱的代码正在哪儿溜着呢? 不知道(如果知道正在哪儿溜着就好,在这儿来了干扰导致飞了,那就在这个地方想办法抗干扰啊)! 这个复位简直就只能算是抚慰啊!

好在,很多MCU内部集成了看门狗,而且这个内部看门狗还可以触发中断(而不仅仅是抚慰了)!

好了,现在借助C的预定义符号__func__, 就可以知道出现干扰的时候, 代码运行到哪个函数里面了!

定义一个全局的字符数组,就叫做Func_Name吧, 长度足以放下你的代码里最长的函数名就可以了. 在你认为可能被干扰整死的函数里, 用__func__就可以把函数的名称取到了,再放到Func_Name里,在看门狗中断函数里把这个Func_Name显示出来,你就知道干扰发生的时候,代码运行到哪里了.

... ...
char Func_Name[128];
void Watcgdog_ISR()       //看门狗中断服务函数
{
     ... ...
     Display(Func_Name);
     ... ...
}
... ...

//以下是你觉得有可能但不能确定因干扰导致程序跑飞的一些函数,当然也可以所有函数都这么弄
void Func1()      
{
     ... ...
     mencpy(Func_Name, __func__, sizeof(__func__));
     ... ...
}
void Func2()      
{
     ... ...
     mencpy(Func_Name, __func__, sizeof(__func__));
     ... ...
}

... ...

void FuncN()      
{
     ... ...
     mencpy(Func_Name, __func__, sizeof(__func__));
     ... ...
}

由此,就基本上可以知道程序在哪儿飞了.

如果干扰导致的"飞"只发生在某个或某几个函数里,解决起来就容易多了.函数要是写的太长,需要进一步判断干扰引起的飞在这个长函数里的哪个部位,可以把这个长函数拆分成几个小函数,进一步判定.

预定义符号 __func__ 在有些编译系统里用 __FUNCTION__ 表示.

补充一点:这个是在IAR里整ARM的时候用的.注意文件最前面要加上一行
#pragma language=extended

呵呵,在KEIL里整51不行的,不过可以用__LINE__和__FILE__凑合,也有类似的作用吧

再补充一点: __是俩下划线连接在一起,不是一个啊!
阅读(7500) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~