keil uv4 一共有0~3四级优化
除0级外其余的1,2,3任何一级,程序在编译过程中只要选择了任何一级优化,下载进去之后就不运行了,仿真后发现是出不了其中的一个子函数,函数是这样的:
void JM_CS(uint32 relative_address)
{
uint32 address,temp;
uint8 i;
uint8 jm_data[22];
uint16 L ;
uint16 start_y ;
uint8 start_m ;
uint8 start_d ;
uint8 start_h ;
uint8 start_mi ;
uint16 end_y ;
uint8 end_m ;
uint8 end_d ;
uint8 end_h ;
uint8 end_mi ;
uint8 disenab_w ;
address=Save_Start+relative_address;
SSTF016B_RD(address,22,jm_data);
if((jm_data[0]==0xbb)&&(jm_data[1]==0xcc)&&(jm_data[2]==0xdd)&&(jm_data[3]==0x00))
{
jm_play_m = jm_data[4];
jm_play_c = jm_data[5];
jm_end = jm_data[6];
JM_start_time[0]= jm_data[7];
JM_start_time[1]= jm_data[8];
JM_start_time[2]= jm_data[9];
JM_start_time[3]= jm_data[10];
JM_start_time[4]= jm_data[11];
JM_start_time[5]= jm_data[12];
JM_end_time[0] = jm_data[13];
JM_end_time[1] = jm_data[14];
JM_end_time[2] = jm_data[15];
JM_end_time[3] = jm_data[16];
JM_end_time[4] = jm_data[17];
JM_end_time[5] = jm_data[18];
disenab_w = jm_data[19];
temp = jm_data[20];
L = temp;
temp = jm_data[21];
L |= temp<<8;
//---------------------------------------------------------------
if(L>0)
{
Flash_Ram(address+22);
}
temp=address+22+L;
SSTF016B_RD(temp,40,jm_data);
S_COUNT= jm_data[0];
for(i=0;i<S_COUNT;i++)
{
temp=jm_data[1+3*i];
S_ADDR=temp;
temp=jm_data[1+3*i+1];
S_ADDR|=temp<<8;
temp=jm_data[1+3*i+2];
S_ADDR|=temp<<16;
}
}
}
仿真发现程序没有死循环,数据也都是对的,不管如何执行只要一出这个函数就死了,我之前没遇到过这种问题,感觉应该不是keil的问题,但C程序本身我看不出哪里不严谨,汇编看不太懂,也不好妄加评论
把这高函数注释后程序可以运行,但这段程序是不能省掉的....
具体问题出在哪里还请大家讨论...
也给小弟指点一二