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

标签 c++ microcontroller stm32 keil

我正在为我的 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/

相关文章:

c++ - 如何从运行时参数初始化常量全局变量?

eclipse-plugin - STM32 Atollic TrueSTUDIO - 内存的图形 View

debugging - 使用 SysTick_Config 后无法调试

python - 如何使用 mraa 将 lsm9ds1 连接到 respeaker?

C - 如何从位字段接收位作为函数中的参数?

c - STM32VLDiscovery定时器中断HardFault c

c++ - 指针内存错误

c++ - 关于多态性,引用和指针是否相等?

c++ - boost 几何 : legacy objects adaptation

javascript - Arduino yun vs tessel vs espruino