我使用STM32CubeIDE与STM32G030F6Px控制器,具有64kB闪存。目前我正在使用36.5kB的闪存,但当在一个函数中添加几行代码时(注意CurrTemp是uint8_t的全局变量)例如
int16_t sensorValue, temperatureC, temperatureK;
int32_t voltageOut;
sensorValue = 0; voltageOut = 0; temperatureC = 0; temperatureK = 0;
sensorValue = (int16_t)ADCRead();
sensorValue = (int16_t)(4095.0 - sensorValue);
voltageOut = (int32_t)((sensorValue * 3250.0) / 4095.0);
temperatureK = (int16_t)(voltageOut / 10.0);
temperatureC = (int16_t)(temperatureK - 273);
CurrTemp = (uint8_t)temperatureC;
I get Errors
c:ststm32cubeide_1.7.0stm32cubeidepluginscom.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.0.202111181127toolsarm-none-eabibinld.exe: fan_retest.elf section `.text' will not fit in region `FLASH'
c:ststm32cubeide_1.7.0stm32cubeidepluginscom.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.0.202111181127toolsarm-none-eabibinld.exe: region `FLASH' overflowed by 2372 bytes
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:64: fan_retest.elf] Error 1
"make -j4 all" terminated with exit code 2. Build might be incomplete.
我不明白是什么问题
几乎可以肯定,这个问题是由使用浮点计算引起的,它从标准库中提取数学库和所有相关的异常处理代码。
你需要查看链接器输出的映射文件,看看是不是这样。
这是可能的存根错误处理代码,只是得到浮点库,也许这将适合于32kB或64kB的微控制器,但这真的不是正常的方式来做这样的事情。在一个小型微控制器上做这样的事情的正常方法是使用定点。
AsTom V已经指出,原因可能是构建中包含了浮点库。
但是有一种方法可以减少内存占用:使用float
代替double
。例如,3250.0
默认为double
。但是如果你写3250.0f
,你就写成float
,这样计算更快,占用更少的闪存空间。记住要加上f后缀toall
但是,最好避免在缺乏硬件浮点支持的目标上进行浮点计算。