遇见该问题后,在论坛上逛了许久,发现大多数都是下面前两种解决方法,
①右键单击项目,-options->General Options里的Target选项里,Data如果是small,你选成medium;
②Option--C/C++ compile--Optimizations中的Level选为High;
③改代码,以上两种方法都尝试后,问题依旧存在,因此,我将程序中的浮点型变量都缩小为 unsigned char 型,编译通过。
以下是整理的浮点型在MCU储存方式:
浮点数包括float和double两种类型,float占32位,double占64位。其二进制存储格式遵循IEEE754标准。以float为例:
符号位:正数为0,负数为1
以float型数据123.456为例,分析其二进制存储格式:
首先将十进制数123.456转换为二进制数为:1111011.01110100101111001
(其中0.456如何转换为二进制?不断乘2取整,顺序排列
如:0.734375转二进制,结果是101111。
0.734375 x 2 = 1.46875
0.46875 x 2 =0.9375
0.9375 x 2 = 1.875
0.875 x 2 = 1.75
0.75 x 2 = 1.5
0.5 x 2 = 1.0)
1111011.01110100101111001即1.11101101110100101111001乘以2的6次方
首先这是一个正数,则符号位为0,阶码为6,不过要转换成移码。(如何求6的移码?这里我也不太深究,我见大家都是直接6+127=133,换为2进制为10000101)
(移码与补码的关系:[X]移与[X]补的关系是符号位互为相反数(仅符号位不同))
尾数则为1. 11101101110100101111001的小数部分,即
11101101110100101111001
综上:123.456的二进制存储格式为:01000010111101101110100101111001
因此,浮点型在Flash中占得空间比较大,可以改良下。