gpt4 book ai didi

c++ - push_back() 导致程序在进入 main() 之前停止

转载 作者:行者123 更新时间:2023-11-30 02:53:56 24 4
gpt4 key购买 nike

我正在为我的 STM32F3 探索板使用 C++ 开发并使用 std::deque 作为队列。在尝试调试我的代码后(直接在带有 ST-link 的设备上或在模拟器中),代码最终在断点处停止,甚至在 main() 中输入我的代码之前。但是,SystemInit() 可以很好地配置板......

我已将此行为追溯到使用 push_back()(和 push_front),因为从代码中注释掉它可以解决问题。通过disassmebly发现,使用后会在断点指令BKPT处停止执行,恢复执行后不会再继续执行。该指令是 _sysopen() 调用的一部分,调用路径:

__main -> __scatterload -> __scatterload_null -> __rt_entry -> __rt_lib_init -> __rt_lib_init_atexit_1 -> _initio -> freopen -> _sysopen

令我感兴趣的是对 _initio 的调用,如果不使用 push_back,它就会丢失,因为没有 __rt_lib_init_atexit_1。引入 push_back 还使代码大小从 10 kB 减少到 34 kB。

这可能是某些错误配置的结果,还是我应该尝试另一个 IDE?我没主意了。

最佳答案

我遇到了同样的问题。我了解到它与所谓的“半主机”有关我应该用我的项目文件“retarget.c”构建,其中包含像“_sys_xxxx()”这样的函数是针对特定驱动程序级别的函数(许多版本的“retarget.c”是 Keil-MDK 的一部分,也可以在网上找到)。所以我做了,但随后链接器抛出了类似于此的错误:

Error: L6200E: Symbol _sys_open multiply defined (by arm_xxx_lib.o and retarget.o)
Error: L6200E: Symbol _sys_close multiply defined (by arm_xxx_lib.o and retarget.o)
...

我通过编辑原始的“retarget.c”解决了这个问题,这样其中定义的函数将覆盖 Keil-MDK 库中的那些。新的“retarged.c”在这里:

#include <stdio.h>
#include <rt_misc.h>

#pragma import(__use_no_semihosting_swi)

#include <rt_sys.h>

extern void $Super$$_sys_open(void);

FILEHANDLE $Sub$$_sys_open(const char *name, int openmode)
{
return 1; /* everything goes to the same output */
}

extern void $Super$$_sys_close(void);
int $Sub$$_sys_close(FILEHANDLE fh)
{
return 0;
}

extern void $Super$$_sys_write(void);
int $Sub$$_sys_write(FILEHANDLE fh, const unsigned char *buf,
unsigned len, int mode)
{
//your_device_write(buf, len);
return 0;
}

extern void $Super$$_sys_read(void);
int $Sub$$_sys_read(FILEHANDLE fh, unsigned char *buf,
unsigned len, int mode)
{
return -1; /* not supported */
}

extern void $Super$$_ttywrch(void);
void $Sub$$_ttywrch(int ch)
{
char c = ch;
//your_device_write(&c, 1);
}

extern void $Super$$_sys_istty(void);
int $Sub$$_sys_istty(FILEHANDLE fh)
{
return 0; /* buffered output */
}

extern void $Super$$_sys_seek(void);
int $Sub$$_sys_seek(FILEHANDLE fh, long pos)
{
return -1; /* not supported */
}

extern void $Super$$_sys_flen(void);
long $Sub$$_sys_flen(FILEHANDLE fh)
{
return -1; /* not supported */
}

extern void $Super$$_sys_exit(void);
long $Sub$$_sys_exit(FILEHANDLE fh)
{
return -1; /* not supported */
}

这个版本的“retarget.c”链接器很满意,我的程序运行没有问题。也许这也会对您有所帮助。

关于c++ - push_back() 导致程序在进入 main() 之前停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17548453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com