我正在使用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?我没有想法。
答案 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()