push_back()使程序在进入main()之前停止

push_back() causes program to stop before entering main()

本文关键字:main back 程序 push      更新时间:2023-10-16

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

我已经将这种行为追溯到使用push_back()(和push_front),因为从代码中注释它可以解决问题。通过反汇编,我发现使用它后,执行会在断点指令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还使代码大小从10kB增加到34kB。

这可能是由于配置不好造成的,还是我应该尝试另一个IDE?我没主意了。

我也遇到了同样的问题。我了解到这与所谓的"半托管"有关我应该使用包含像"_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库中的那些。新的"延迟.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"链接器就满足了,我的程序运行时没有问题。也许这对你也有帮助。

在调用.back().front()之前,请检查scale_buffer是否包含任何元素(scale_buffer.empty()):您可能正在读写一些垃圾,这会使deque无效,为调用push_back() 时崩溃做好准备