请教:在中断里可以调用 原先定义的函数吗?为什么我 调用,就出现警告呢?
//功能: SD2,SD3,SD4 显示
//参数: LedNumber表示是数码管的个数
//参数: LedCoin 是显示的数码管内容
void SD234Display(int LedNumber ,uchar8 *LedCoin) //SD2,SD3,SD4 显示
{
int i; //数码管的个数
int j; //送出数据时的 8 次循环
int LedB; //真正的下标,是通过 Led 转换过来的
uchar8 *Led595s; //定义数码管内容指针
uchar8 Led; //要显示的数字,也是 数组 Led595NoDot 或 Led595Dot 中被
//选取元素的下标,不过这里得到的是字符
uchar8 LedN; //数组 Led595NoDot 或 Led595Do 中真正被选中的元素
i = 0; //初始化 i 为 LedNumber 表示从字符串的最后一个开始处理,
//也就是从最后一个开始输出
Led595s = LedCoin ; //使 Led595 和 LedCoin 指向同一个地址
while(i <LedNumber) //当 i 小于 数码管个数
{
Led = *(Led595s+i); //取出数据
LedB = Led - '0 ' ; //得到数组真正的下标 ,因为 Led 是 char 类型的
i=i++;
//*****************************处理 Led ****************
LedN = Led595Dot[LedB];
for (j=0; j <8; j++)
{
if (LedN & 0x01) //发送 1
{
CK1 = 0 ;
DIN2 = 1;
_nop_();
_nop_();
CK1 = 1;
}
else //发送 0
{
CK1 = 0 ;
DIN2 = 0;
_nop_();
_nop_();
CK1 = 1;
}
LedN = LedN > > 1; //LedN 右移
}
//****************************处理 Led ****************
}//whie(i <LedNumber)
//***************一次送出**********
_nop_();
_nop_();
LATCH2 = 0; //在时钟下降沿把数据送出
_nop_();
_nop_();
LATCH2 = 1;
//***************一次送出**********
}
void Jtimer1(void) interrupt 3 //喂狗中断程序
{
TH1 = 60536/256; //重载计数初值 每 10 ms 中断一次
TL1 = 60536%256;
if (IsOrNoJs== 'Y ')//表示时间开始减
{
WDogZdJs ++;
if ( WDogZdJs > = 4610 ) //4600-4610 之间
{
WDogZdJs = 0; //赋初值
TimeJNumber++;
Sd4Numner = SD234Number[0] - '0 '; //SD4 此时的值
Sd3Numner = SD234Number[1] - '0 '; //SD3 此时的值
Sd2Numner = SD234Number[2] - '0 '; //SD2 此时的值
if ((Sd4Numner!=0) || (Sd3Numner!=0) || (Sd2Numner!=0)) //时分不都为 0 ,也就是还最少有 1 分钟
{
if (Sd4Numner==0) //
{
Sd4Numner = 9;
Sd3Numner = Sd3Numner - 1; //减位
}
else
{
Sd4Numner = Sd4Numner -1;
}
if (Sd3Numner <0)
{//2
Sd3Numner = 9;
Sd2Numner = Sd2Numner -1;
if (Sd2Numner <0)
{
Sd2Numner = 9;
}
}//2
SD234Number[0]=Sd4Numner + '0 '; //化为 char 类型
SD234Number[1]=Sd3Numner + '0 '; //化为 char 类型
SD234Number[2]=Sd2Numner + '0 '; //化为 char 类型
SD234Display(3,SD234Number); //使数码管显示 这里有个警告
}//if ((Sd4Numner==0) || (Sd3Numner==0) || (Sd3Numner==0))
}//WDogZdJs > = 60
}//IsOrNoJs== 'Y '
}
我在 void Jtimer1(void) interrupt 3 调用了
SD234Display(3,SD234Number); //使数码管显示
Build target 'Target 1 '
assembling STARTUP.A51...
compiling MAIN.C...
linking...
*** WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_SD234DISPLAY?MAIN
CALLER1: ?C_C51STARTUP
CALLER2: ?PR?JTIMER1?MAIN
Program Size: data=66.0 xdata=0 code=952
creating hex file from "PRO "...
"PRO " - 0 Error(s), 1 Warning(s).
各位大哥,我是错在哪里?
谢谢!
[解决办法]
你在有可能同一时间调用了一个不可重入函数!!