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

时间:2013-07-09 12:43:25

标签: c++ microcontroller stm32 keil

我正在使用c ++开发我的STM32F3 Discovery板并使用std :: deque作为队列。在尝试调试我的代码(直接在带有ST-link或模拟器的设备上)之后,代码最终在断点处停止,甚至在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也使代码大小从10 kB到34 kB。

这可能是一些错误配置的结果,还是我应该尝试另一个IDE?我没有想法。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我了解到它与所谓的“半主机”有关 我应该用我的项目文件'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'链接器很满意,我的程序运行没有问题。 也许这对你也有帮助。

答案 1 :(得分:0)

在调用scale_buffer.empty().back()之前,请检查scale_buffer是否包含任何元素(.front()):您可能正在读取和写入一些垃圾,这会使deque无效,准备当你拨打push_back()

时发生崩溃