乐鑫技术交流
直播中

vinww特烦恼

9年用户 1220经验值
擅长:存储技术
私信 关注
[问答]

gcc生成的代码会导致致命崩溃要怎么解决?

gcc 生成的代码会导致致命崩溃:
// app.c
#include "user_interface.h"
#include "osapi.h"
void user_init(void)
{
    uint32 ip = 17082560;
    os_printf("%d.%d.%d.%d\n", IP2STR(ip));
}
SDK ver: 1.5.3(aec24ac9) compiled @ Apr 18 2016 13:20:18
phy ver: 9281, pp ver: 9.9
Fatal exception 28(LoadProhibitedCause):
epc1=0x4020103c, epc2=0x00000000, epc3=0x00000000, excvaddr = 0x0104a8c0,depc=0x00000000
(user_init 位于 0x40201020)
gcc 标志:
xtensa-lx106-elf-gcc flags=-c -Wall -Wextra -Os -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -fno-exceptions -nostdlib -mlongcalls -mtext-section-literals -falign-functions=4 -MMD -std=gnu99 -ffunction-sections -fdata-sections
重新定义 IP2STR 时,问题消失:
void user_init(void)
{
    uint32 ip = 17082560;
#define IP2STR(addr) (uint8_t)(addr & 0xFF), (uint8_t)((addr >> 8) & 0xFF), (uint8_t)((addr >> 16) & 0xFF), (uint8_t)((addr > > 24) & 0xFF)
    os_printf("%d.%d.%d.%d\n", IP2STR(ip));

IP2STR 从 .text.user_init 部分的 ip_addr.h(

反汇编中引用时:
00000000 :
   0: 000000 生病
   3: a8c000 excw
   6: c10104 excw
   9: 04a8 l32i.n a10, a4, 0
   b: a8c201 l32r a0, fffea314  
   e: c30104 excw
  11: 04a8 l32i.n a10, a 4, 0
  13: 000001 l32r a0, fffc0014  
...
00000018 :
  18: f0c112 addi a1, a1, -16
  1b: fffa31 l32r a3, 4  
  1e: fffa41 l32r a4 , 8 < user_init-0x10>
  21: fffa51 l32r a5, c  
  24: fffb61 l32r a6, 10  
  27: 3109 s32i.n a0, a1, 12
  29: fff521 l32r a2, 0
  2c: 000332 l8ui a3, a3, 0
  2f: 000442 l8ui a4, a4, 0
  32: 000552 l8ui a5, a5, 0
  35: 000662 l8ui a6, a6, 0
  38: fff701 l32r a0, 1​​4  
  3b: 0000c0 callx0 a0
  3e: 3108 l32i.n a0, a1, 12
  40: 10c112 addi a1, a1, 16
  43: f00d ret.n
当 IP2STR 被重新定义时(

.text.user_init 部分的反汇编:
00000000 :
...
00000008 :
   8: fffe21 l32r a2, 0  
   b: f0c112 addi a1, a1, -16
   e: c0a032 movi a3, 192
  11: a8a042 movi a4, 168
  14: 450c movi.n a5, 4
  16: 160c movi.n a6, 1
  18: 3109 s32i.n a0, a1, 12
  1a: fffa01 l32r a0, 4  
  1d: 0000c0 callx0 a0
  20: 3108 l32i .n a0, a1, 12
  22: 10c112 addi a1, a1, 16
  25: f00d ret.n
关于这里可能发生的事情的任何见解?


更多回帖

发帖
×
20
完善资料,
赚取积分