和这个贴的情况一模一样
大概是程序超过一个BANK?注释掉一点程序就可以,只要加一点程序都不行,看似乎是空间不够,但整个项目才100多K
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
和这个贴的情况一模一样
大概是程序超过一个BANK?注释掉一点程序就可以,只要加一点程序都不行,看似乎是空间不够,但整个项目才100多K
我用的是stack是1.4.2.2 , IAR 9.10.3, 例改自simpleBLEPeripheral例程, MAP文件内容是这样的:
Error[e18]: Range error,
Number out of range
File: C:\Texas Instruments\BLE-CC254x-1.4.2.2\Projects\ble\SolarStreetlight\Source\simpleBLEPeripheral.c, Line: 1857
Source: LJMP ??powerControlTask_2
Where $ = powerControlTask + 0x1B5CD [0x1B5CD]
in module "simpleBLEPeripheral" (C:\Texas Instruments\BLE-CC254x-1.4.2.2\Projects\ble\SolarStreetlight\CC2541DB\CC2541DK-MINI Keyfob\Obj\simpleBLEPeripheral.r51),
offset 0x50 in segment part 124, segment BANKED_CODE
What: (powerControlTask + 0xEF) [0x1B66C]
Allowed range: 0xFFFF8000 - 0xFFFF
Operand: powerControlTask [0x1b66c]
in module simpleBLEPeripheral (C:\Texas Instruments\BLE-CC254x-1.4.2.2\Projects\ble\SolarStreetlight\CC2541DB\CC2541DK-MINI Keyfob\Obj\simpleBLEPeripheral.r51),
Offset 0xef in segment part 124, segment BANKED_CODE
真的好奇怪,已经排除了空间不足问题,出现得比较随机,偶尔出现,举个例子,只是一种情况,如下
if(condition)
{
//do something
}
else
{
// do something
}
这时编译不通过!
当我改成
if(condition)
{
//do something
}
//else //注释了else
{
// do something
}
就通过了
还有一种解决办法,当出现不通过时,只要我在程序中特定位置加入nop就能能解决,如改成如下
if(condition)
{
//do something
asm("nop");
}
else
{
// do something
}
它又能链接成功了!
这是我之前贴,找了很久没找到原因,麻烦帮忙看看,e2echina.ti.com/.../165033
这次我精简了代码,定位到一个函数里,这个函数精简过没有什么意义,但能重现问题。源代码见附件。
感觉各IAR的高优化有关。。
Building configuration: SimpleBLEPeripheral - CC2541DK-MINI Keyfob
Updating build tree...
Linking
Error[e18]: Range error,
Number out of range
File: C:\Texas Instruments\BLE-CC254x-1.4.2.2\Projects\ble\SolarStreetlight\Source\simpleBLEPeripheral.c, Line: 1014
Source: LJMP ??powerControlTask_2
Where $ = powerControlTask + 0x2F5AE [0x2F5AE]
in module "simpleBLEPeripheral" (C:\Texas Instruments\BLE-CC254x-1.4.2.2\Projects\ble\SolarStreetlight\CC2541DB\CC2541DK-MINI Keyfob\Obj\
simpleBLEPeripheral.r51),
offset 0x30 in segment part 40, segment BANKED_CODE
What: (powerControlTask + 0xB2) [0x2F630]
Allowed range: 0xFFFF8000 - 0xFFFF
Operand: powerControlTask [0x2f630]
in module simpleBLEPeripheral (C:\Texas Instruments\BLE-CC254x-1.4.2.2\Projects\ble\SolarStreetlight\CC2541DB\CC2541DK-MINI Keyfob\Obj\
simpleBLEPeripheral.r51),
Offset 0xb2 in segment part 40, segment BANKED_CODE
Error while running Linker
Total number of errors: 1
Total number of warnings: 0
e2echina.ti.com/.../SolarStreetlight.rar
请看代码
//#pragma optimize = none 单独不开优化也可以 static void powerControlTask(void) { uint16 adcBat, adcSolar; uint8 i; if (filterInitCnt > 0) { filterInitCnt--; //adcBatFilter.cnt = 0; //adcSolarFilter.cnt = 0; //adcBatSmoothRaw = 0; for (i = 0; i < 8; i++) { adcBat = HalAdcRead(HAL_ADC_CHANNEL_7, HAL_ADC_RESOLUTION_12); //adcSolar = HalAdcRead(HAL_ADC_CHANNEL_6, HAL_ADC_RESOLUTION_12); adcBatSmoothRaw += adcBat >> SMOOTH_FILTER_GAIN; } // asm("nop"); //在这加nop 可以链接成功 } else { adcBat = HalAdcRead(HAL_ADC_CHANNEL_7, HAL_ADC_RESOLUTION_12); adcSolar = HalAdcRead(HAL_ADC_CHANNEL_6, HAL_ADC_RESOLUTION_12); if (adcBatFilter.cnt >= FILTER_BUFF_SIZE_BAT) { adcBatFilter.cnt = 0; adcBatFilterRaw = adcBatFilter.buff[2]; adcBatSmoothRaw -= adcBatSmoothRaw >> SMOOTH_FILTER_GAIN; adcBatSmoothRaw += adcBatFilter.buff[2] >> SMOOTH_FILTER_GAIN; } if (adcSolarFilter.cnt >= FILTER_BUFF_SIZE_SOLAR) { adcSolarFilter.cnt = 0; adcSolarFilterRaw = adcSolarFilter.buff[1]; } } }