push_back()使程序在进入main()之前停止
push_back() causes program to stop before entering main()
我正在用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()
时崩溃做好准备
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 代码在main()中运行,但在函数中出现错误
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 函数是否可以访问传递给main()的参数
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 我的 int main() 中出现堆栈溢出错误
- 推导 std::vector::back() 的返回类型
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么类和 main() 函数中也有动态内存分配
- 在 main.cpp 的上下文中找不到目录(带有 CMake 的快板)
- 我想在 Main 中用 C++ 调用其他类中的一个类,但我做不到
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?