10 cmBackTrace组件参数确定

发布于 2020-06-02 09:21:31

使用cmBackTrace组件,但是组件中的 _sstack、_estack、_stext、_etext不知道在哪里,编译的时候报错,告诉这四个未定义,怎么破?

查看更多

关注者
0
被浏览
199
15 个回答
ZiBuYu
ZiBuYu 2020-06-02
jhonyi 发表于 2020-6-2 15:24
在链接脚本中


哪里面啊?是哪个值?
ZiBuYu
ZiBuYu 2020-06-02
jhonyi 发表于 2020-6-2 15:24
在链接脚本中


哪里面?是哪个值?
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM2 0x00000000 0x00080000 { ; load region size_region
ER_IROM2 0x00000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM2 0x20000000 0x00028000 { ; RW data
.ANY (+RW +ZI)
}
}

LR_IROM1 0x40108000 0x00004000 {
ER_IROM1 0x40108000 0x00004000 { ; load address = execution address
.ANY (+RO)
}
}
jhonyi
jhonyi 2020-06-02
要看你是用的什么编译器了。如果是gcc,那么lds文件中会有这些变量的定义,其中会有这么一行: _sstack = .;
jhonyi
jhonyi 2020-06-02
如果你的链接脚本中没有,那么你需要在其中定义一下。学习一下关于链接的知识
jhonyi
jhonyi 2020-06-02
ZiBuYu 发表于 2020-6-2 16:35
哪里面?是哪个值?
; *************************************************************
; *** Scatter-L ...


你需要查看一下mdk的scatter文件中如何定义变量。我不熟。
ZiBuYu
ZiBuYu 2020-06-02
jhonyi 发表于 2020-6-2 16:40
你需要查看一下mdk的scatter文件中如何定义变量。我不熟。


是 __GNUC__ 编译器
jhonyi
jhonyi 2020-06-02
你发的是uVision的链接脚本啊? gcc的话要找.lds或者.ld结尾的文件。其实你这几个变量很简单,不在链接脚本中定义也是可以的。 _sstack、_estack、是rtthread用户栈的起始和结束地址,你找找rtthread的代码初始化栈的地方就可以找到地址。_stext、_etext是文本段的起始和结束。你找到ld文件中的.text段,在开头和结尾处分别加上一个_stext=.; _etext=.;就可以了
jhonyi
jhonyi 2020-06-02
/* The program code and other data goes into FLASH */
.text :
{
. = ALIGN(8);
_stext = .;
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)

/* section for module structures */
. = ALIGN(8);
*(.gnu.linkonce.t*)

KEEP (*(.init))
KEEP (*(.fini))

/* section information for rt-thread finsh shell */
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;

. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;

/* section information for rt-thread initialize */
. = ALIGN(4);
__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;

. = ALIGN(8);
_etext = .; /* define a global symbols at end of code */
} >FLASH
jhonyi
jhonyi 2020-06-02
/* User_heap_stack section, used to check that there is enough RAM left */
._user_heap_stack (NOLOAD):
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
_sstack = .;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >RAM3
ZiBuYu
ZiBuYu 2020-06-02
jhonyi 发表于 2020-6-2 16:58
/* User_heap_stack section, used to check that there is enough RAM left */
._user_heap_stack (NO ...


keil的AC6编译器默认选的就是__GNUC_啊_
jhonyi
jhonyi 2020-06-02
ZiBuYu 发表于 2020-6-2 17:06
keil的AC6编译器默认选的就是__GNUC_啊_


keil的编译器链接脚本怎么定义你要查相关文档。gcc,跟一个__GNUC_宏定义是两码事。
ZiBuYu
ZiBuYu 2020-06-04
还是未解决,别沉啊
ZiBuYu
ZiBuYu 2020-06-17
各位小哥哥帮忙看看啊
aozima
aozima 2020-06-17
拒绝白嫖,拒绝键盘侠!
9楼讲得很清楚啊。

应该是你这个组合还没有人用过,要不你改成AC5实验通过了,再改AC6。
解决此问题需要理解 链接脚本,符号 相关术语。
ZiBuYu
ZiBuYu 2020-07-01
aozima 发表于 2020-6-17 09:40
9楼讲得很清楚啊。

应该是你这个组合还没有人用过,要不你改成AC5实验通过了,再改AC6。


是这样,使用AC5没有问题,但是芯片用的LPC54608,使用的是官方的模板,默认就是AC6,改不回来。9楼说的那些keil里面都木有啊

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友