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.
工具/软件:TI C/C++编译器
我正在尝试使用 MSP430fr5989来减少项目上的一些内存使用量。 该项目目前是 c 和 c++的组合。 通过查看.map 文件、可以看到 rts430x_lc_ld_eabi_se.lib 库的 memory.c 文件中使用的许多函数。 有几个人抓住了我的眼睛、我根本不知道为什么他们被包括在内(见下文)。 特别是、包含了 malloc、它会引入 aligned_alloc。 alloced_alloc 是.text 段中最大的函数之一。 我希望能够摆脱这种情况、因为我不是有意进行任何动态内存分配。
有人能帮我弄清楚如何删除这些函数中的某些函数、或者至少知道为什么调用这些函数?
.text 0 00004400 000056d6
(笑声)
00005030 00000198 rts430x_lc_ld_eabi_se.lib:memory.c.obj (.text:aligned_alloc)
(笑声)
000054a2 0000013c rts430x_lc_ld_eabi_se.lib:memory.c.obj (.text:free)
(笑声)
00006516 000000ba rts430x_lc_ld_eabi_se.lib:memory.c.obj (.text:splits)
000065d0 000000b8:fs_mpy.asm.obj (.text)
(笑声)
00008182 00000046 rts430x_lc_ld_eabi_se.lib:memory.c.obj (.text:free_list_insert)
000081c8 00000046:fs_tou.asm.obj (.text)
(笑声)
00008d30 0000002a rts430x_lc_ld_eabi_se.lib:memory.c.obj (.text:free_list_remove)
(笑声)
00009922 0000000c rts430x_lc_ld_eabi_se.lib:memory.c.obj (.text:malloc)
[引用 USER="Dustin Lane">有人能不能帮助我弄清楚如何删除这些函数中的某些函数、或者至少知道调用它们的原因吗? CCS "Stack Usage"视图和 call_graph 实用程序会显示程序的调用图、作为确定程序栈使用情况的一部分。
一个副作用是调用图应该显示调用 malloc 和相关函数的内容。
[引用 user="Dustin Lane">此外、我找不到 MSP430的 call_graph 实用程序、至少不在编译器的 bin 目录中、这是我唯一知道要查看的位置。 您是否知道它是否存在、如果存在、我可能会在哪里找到它?[/quotate]call_graph 是 CG_xml 脚本的一部分- http://software-dl.ti.com/ccs/non-esd/releases/other/applications_packages/cg_xml/index.htm
[引用 user="Dustin Lane"]我最终发现 RTS 库中的"dtor_list.c"文件正在使用 malloc 和 free。我尚未进行调查,但您的 C++对象是否包含静态(全局)析构函数?
从快速看、dtor _list.c 使用 malloc 创建析构函数列表来调用 atexit。 从 MSP430上的 RT-library 中删除 atexit 代码 是一个旧线程、其中指出、如果无法阻止对 每个具有析构函 数的全局对象的 atexit 相关析构函数注册例程的调用、则可以通过向项目中添加一个不执行任何操作的替换函数来最大限度地减少添加的代码。
[引用 user="Dustin Lane">我假设这意味着这些对象随后具有静态/全局析构函数、您是否同意?是的、我同意。
[引用 user="Dustin Lane">您是否能更好地了解此增强请求的状态:SDSCM00049923?否
考虑到嵌入式程序通常不会退出、因此 不需要运行静态/全局析构函 数、如前一个线程中建议的变通方法是向项目中添加一个 stub __cxa_atexit 函数。
使用 TI MSP430编译器 v18.12.1.LTS 将以下内容添加到主 CPP 源文件中、消除了对具有静态/全局析构函数但未使用动态存储器的测试程序中 malloc 的调用:
typedef void * a_DSO_handle; typedef void (* a_cxa_dtor_ptr)(void *); extern "C" int _ cxa_atexit (a_cxa_dtor_ptr dify_routine、 无效 *对象, A_DSO_Handle DSO_Handle) { 返回0; }
由于它替换了运行时库中的一个私有函数、因此它可能会在编译器更新之后中断。
[引用 USER="Dustin Lane)]我不确定如何解决这一重新定义问题,但不幸的是,不管怎样,这似乎不是一个可靠的解决方案。由于 dtor_list.c 具有多个 atexit 函数,可以定义以下代码的桩模块,这可能有助于消除代码的错误:
typedef void * a_DSO_handle; typedef void (* a_cxa_dtor_ptr)(void *); extern "C" int _ cxa_atexit (a_cxa_dtor_ptr dify_routine、 无效 *对象, A_DSO_Handle DSO_Handle) { 返回0; } extern "C" int __cxa_ia64_exit (a_cxa_dtor_ptr s销毁 例程、 无效 *对象, A_DSO_Handle DSO_Handle) { 返回0; } extern "C" int atexit (void (* function)(void) ){ 返回0; }
我同意、必须存根运行时库函数并不是一个可靠的解决方案。
遗憾 的是,在这件事中提出的第一个改进请求,ID 为 SDSCM00049923,从未得到执行。 因此、我提交了类似的条目 CodeGen-6090。 欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。
关于变通办法,我同意切斯特·吉隆的这一发言。
[引用 user="Chester Gillon"]我同意必须将运行时库函数存根不是一个可靠的解决方案。
不幸的是、这是我找到的最佳解决方法。
谢谢、此致、
乔治