你好,我遇到这种SDK错误该怎样解决呢?

grantgao
Posts: 36
Joined: Tue Apr 14, 2015 5:20 pm

你好,我遇到这种SDK错误该怎样解决呢?

Postby grantgao » Thu May 28, 2015 1:45 pm

你好,我遇到这种编译错误该怎样解决呢?
/opt/xtensa-lx106-elf/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: .output/eagle/debug/image/eagle.app.v6.out section `.text' will not fit in region `iram1_0_seg'
collect2: error: ld returned 1 exit status
../Makefile:363: recipe for target '.output/eagle/debug/image/eagle.app.v6.out' failed
make[1]: *** [.output/eagle/debug/image/eagle.app.v6.out] Error 1
make: *** [.subdirs] Error 2
make[1]: Leaving directory '/cygdrive/d/esp8266ide/AITHINKER-ESP8266-SDK/project/esp_iot_sdk_v1.0.1_b1/app'
Makefile:308: recipe for target '.subdirs' failed

-------------------------------------------以下是我对问题的各种尝试----------------------------------------------
//我把 uart_init(BIT_RATE_115200, BIT_RATE_115200);从代码中注释掉,编译就能通过
//我是1024的flash,SDK版本是1.1.0
//修改irom0_0_seg : org = 0x40240000, len = 0x70000,无论如何修改len的值也不行
//但如果修改iram1_0_seg : org = 0x40100000, len = 0x8000,将len修改成0x8100,编译就能通过,在不注释代码的情况下,但这种修改已经超出了ram范围,不可取
void user_init(void)
{
bool bRet = true;

//设置uart并将调试打印转移到uart0
uart_init(BIT_RATE_115200, BIT_RATE_115200);


system_set_os_print(1);
os_printf("++++enter[%s,%d]\r\n",__FUNCTION__,__LINE__);
....
....
}

jackon
Posts: 28
Joined: Thu Oct 23, 2014 9:05 am

Re: 你好,我遇到这种SDK错误该怎样解决呢?

Postby jackon » Thu May 28, 2015 1:54 pm

.text段大小为0x8000。
一个函数默认情况下是放在.text段,加上ICACHE_FLASH_ATTR,就可以放到.irom0.text段。
请给和中断处理函数无关的函数加上ICACHE_FLASH_ATTR。

grantgao
Posts: 36
Joined: Tue Apr 14, 2015 5:20 pm

Re: 你好,我遇到这种SDK错误该怎样解决呢?

Postby grantgao » Thu May 28, 2015 2:05 pm

jackon wrote:.text段大小为0x8000。
一个函数默认情况下是放在.text段,加上ICACHE_FLASH_ATTR,就可以放到.irom0.text段。
请给和中断处理函数无关的函数加上ICACHE_FLASH_ATTR。



你好,我仔细检查过,我的函数除了uart中断收发外,都加了ICACHE_FLASH_ATTR属性,而且uart用的是SDK中自带的代码,怎么办啊?

grantgao
Posts: 36
Joined: Tue Apr 14, 2015 5:20 pm

Re: 你好,我遇到这种SDK错误该怎样解决呢?

Postby grantgao » Thu May 28, 2015 2:09 pm

grantgao wrote:
jackon wrote:.text段大小为0x8000。
一个函数默认情况下是放在.text段,加上ICACHE_FLASH_ATTR,就可以放到.irom0.text段。
请给和中断处理函数无关的函数加上ICACHE_FLASH_ATTR。



你好,我仔细检查过,我的函数除了uart中断收发外,都加了ICACHE_FLASH_ATTR属性,而且uart用的是SDK中自带的代码,怎么办啊?





找到问题了,你们的SDK自带的uart中的uart_tx_one_char这个函数没有加ICACHE_FLASH_ATTR属性,加上就好了。

YimingLi

Re: 你好,我遇到这种SDK错误该怎样解决呢?

Postby YimingLi » Thu Jul 20, 2017 5:47 pm

SDK库里的函数源码,前面没有加 ICACHE_FLASH_ATTR的函数,最好不要随便加。因为,是否在函数前加 ICACHE_FLASH_ATTR, 并非仅仅取决于该函数是否为中断处理函数,而在于每次调用这个函数执行的时候,是否可以从从外部flash里载入。

因为这个标志,代表的就是这个意思。

例如,如果某个函数虽然不是中断处理函数,但是它被中断处理函数给调用了;或者,如果某个函数会被频繁调用了,即使它不是中断处理函数...... 做好也别随意添加ICACHE_FLASH_ATTR,否则,如果每次执行该函数都需要去读取一次SPI FLASH,这可能会影响到处理速度和系统性能的。例如,这里的uart_tx_one_char()函数,就被库里许多其他的频繁使用的函数所调用了。

所以,乐鑫SDK库里的函数,前面有没有加 ICACHE_FLASH_ATTR,都是有讲究的,建议最好不要随便添加,以免造成性能降低或冲突。即使加了,也应该多多深度测试,评估是否有负面影响。

供参考。

Who is online

Users browsing this forum: No registered users and 296 guests