前段时间说到用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__凑合,也有类似的作用吧
再补充一点: __是俩下划线连接在一起,不是一个啊!