在调试FAT32的程序代码时发现一个很奇怪的问题,有个函数的形参是函数指针,每次用这个函数都会出错。查看汇编发现了问题所在,下面用一段简单的代码测试自己的发现。望请高手指正!
#include<STC12C5A.h>
#include<stdio.h>
/**************************************************************************
- 功能描述:51单片机的串口初始化
- 参数说明:无
- 返回说明:无
- 注:2400bps@24.000MHz
**************************************************************************/
void UartInit(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xFB; //独立波特率发生器时钟为Fosc/12,即12T
BRT = 0xF3; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
TI = 1; //使用Printf函数时要有这一句
}
void TEST(unsigned long tmp)
{
if(tmp<10)
tmp++;
printf("tmp=%ld\n",tmp);
}
void fun(unsigned long len,void (*pfun)(unsigned long))
{
unsigned long t;
if(len>20)
t = 10;
else
t = 5;
while((--len)>10)
pfun(t);
}
void main()
{
UartInit();
TEST(5000);
fun(0xFEFE,TEST);
while(1);
}
按照常理这个程序烧写到单片机中应该是不断发送出“tmp=10”,但是结果不是这样,看下汇编才能明白
变量len的寄存器被变量tmp用了,优化级数为1时才能避免这个结果。
这是优化级数大于1的输出
这是优化级数为1的输出
|