工具/软件:Code Composer Studio
我正在使用CCS MSP430G2955 1.0.0022万 开发运行在6.1 上的代码,我在将int转换为float时遇到问题,请参阅下面列出的相关代码:
Int CurrentOfBottomDevice;
浮点包装当前;
......
......
......
CurrentOfBottomDevice =-100;
PackCurrent =(FLOF)CurrentOfBottomDevice;
taskENTER_critical();
Sprintf (sCurrent,"i =%f",PackCurrent);
taskEXIT_critical();
相应的反汇编代码如下所示:
1120 CurrentOfBottomDevice =-100;
3AB2: 40B2 FF9C 13BE MOV.W #0xx9c,&CurrentOfBottomDevice
1122 PackCurrent =(FLOW)CurrentOfBottomDevice;
3ab8: 421C 13BE MOV.W &CurrentOfBottomDevice,R12
3abc: 12B0 6B90 呼叫 ##_FS_utof
3AC0: 4C810008 MOV.W R12,0x0008 (SP)
3AC4: 4D8.1万a MOV.W R13,0x000a (SP)
1124 taskENTER_critical();
3AC8: C232 DINT
3aca: 4303 NOP
3acc: 4303 NOP
3ace: 5392 16F8 不包括&usCriticalNesting
1125 sprintf (sCurrent,"I =%f",PackCurrent);
3ad2: 40B17536 0000 MOV.W #0x7536 0x0000 (SP)
3ad8: 4191 0008 0002 MOV.W 0x0008 (SP),0x0002 (SP)
3ade: 419.1万a 0004 MOV.W 0x000a (SP),0x0004 (SP)
3ae4: 410C MOV.W SP,R12
3ae6: 503C 000c Add.W #0x000c,R12
3aea: 12B0 6CB2 致电 #sprintf
1126 taskEXIT_critical();
3aee: 9382 16F8 TST.W &usCriticalNesting
3af2: 2405 JEQ (C$L142)
3af4: 8392 16F8 DEC.W &usCriticalNesting
3af8: 2002 JNE (C$L142)
3afa: D232 EINT
3afc: 4303 NOP
可以看到调用函数__FS_utof将int转换为float, 但是int变量是-100,所以结果是错误的,PackCurrent的值是6.5436万.0 ,内存中相应的4字节十六进制数据是0x477F9C00,而 根据IEEE标准,-100的4字节十六进制数据应该是0xC2C8万。 这里的问题是,为什么编译器不使用__FS_itof函数,该函数也可以找到。
另一个问题是有关sprintf函数的,下面列出了sprintf的分解函数:
int sprintf (char *out,const char *format,...)
{
VA_列表参数;
VA_START( args, format );
返回打印(输出,格式,参数)(&O);
}
打印功能的代码如下所示:
静态int print( char **out,const char *format,va_list args )
{
寄存器int宽度, pad;
寄存器int PC =0;
CHAR SCR[2];
用于(;*format !=0;++格式){
如果(*format =='%'){
++格式;
宽度=垫= 0;
如果(*format =='\0') Break;
如果(*format =='%')转到输出;
如果(*format =='-'){
++格式;
PAD = PAD_RIGHT;
}
同时(*format =='0'){
++格式;
PAD || PAD_ZERO;
}
用于(;*format >='0'&&*format <='9';++格式){
宽度*= 10;
宽度+=*format -'0';
}
如果(*format ==’s){
register char *s =(car *)va_arg( args, int );
PC +=打印(输出,s:"(空)",宽度,垫);
继续;
}
如果(*format =='d'){
pc += printi (out,va_arg( args,int ),10,1, 宽度,垫片,'A');
继续;
}
如果(*format =='x'){
pc += printi (out,va_arg( args,int ),16,0, 宽度,垫片,'A');
继续;
}
如果(*format =='X'){
pc += printi (out,va_arg( args,int ),16,0, 宽度,垫片,'A');
继续;
}
如果(*format =='u'){
pc += printi (out,va_arg( args,int ),10,0, 宽度,垫片,'A');
继续;
}
如果(*format =='c'){
/* char被转换为int,然后被推送到堆栈*/
scr[0]=(car)va_arg( args, int );
SCR[1]='\0';
PC +=打印件(输出,SCR,宽度,PAD);
继续;
}
}
否则{
输出:
printchar (输出,*format);
+PC;
}
}
如果(输出)**输出='\0';
VA_END_( args );
返回PC;
格式字符串%f在该代码中似乎根本没有处理,这是否表示sprintf不处理浮点数据显示?
