小编Jar*_*der的帖子

嵌入式:大多数CRT启动代码都没有使用memcpy/memset - 为什么?

背景:
我正在研究ARM目标,更具体地说是ST的Cortex-M4F微控制器.在这样的平台(一般的微控制器)上工作时,显然没有操作系统; 为了获得一个有效的C/C++"环境"(此外,在变量初始化方面符合标准),必须在重置时运行某种启动代码,在显式调用之前执行所需的最小设置main.正如我所暗示的,这样的启动代码必须初始化初始化的全局和静态变量(例如int foo = 42;在全局范围内)并将其他全局变量(例如全局范围)清零int bar;.然后,如果需要,调用全局"ctors".

在微控制器上,这只是意味着启动代码必须为每个初始化的全局(全部在".data"部分中)将数据从闪存复制到ram,并清除其他部分(全部在'.bss'中).因为我使用GCC,我必须提供这样的启动代码,我很高兴地分析了几个启动代码(及其相关的链接器脚本!),这些代码与我在互联网上找到的大量示例捆绑在一起,所有这些都使用我正在开发的相同演示板.

问:
正如所述,我已经看到了许多启动代码,它们以不同的方式初始化全局变量,在空间和时间方面比其他方式更有效.但他们都有一个共同点奇怪:他们没有使用memset也没有memcpy,而不是诉诸于手写的循环来完成这项工作.由于我觉得在可能的情况下使用标准函数(简单的"DRY原理")似乎很自然,我尝试了以下代替最初的手写循环:

/* Initialize .data section */
ldr r0, DATA_LOAD
ldr r1, DATA_START
ldr r2, DATA_SIZE
bl  memcpy       /* memcpy(DATA_LOAD, DATA_START, DATA_SIZE); */

/* Initialize .bss section */
ldr r0, BSS_START
mov r1, #0
ldr r2, BSS_SIZE
bl  memset       /* memset(BSS_START, 0, BSS_SIZE); */
Run Code Online (Sandbox Code Playgroud)

......它完美无缺.节省空间可以忽略不计,但现在显然已经很简单了.

所以,我想到了,在这种情况下,我认为没有理由做手写循环:

  • memcpy并且memset很可能无论如何都要链接在可执行文件中,因为程序员会直接使用它,或间接地通过另一个库使用它;
  • 它更小;
  • 速度对于启动代码来说不是一个非常重要的因素,但它可能更快;
  • 几乎不可能弄错.

知道为什么一个人不会依赖memcpymemset启动代码?

c embedded assembly

16
推荐指数
2
解决办法
1736
查看次数

使用Qt将应用程序拆分为插件的功能

就像标题所说的那样,我想将Qt应用程序的某些部分拆分成插件,因此我可以在运行时添加新的功能.理想情况下,插件将单独编译并放入插件的专用路径中; 当应用程序启动时,安装的扩展会自动加载,或者可以随时根据用户请求重新加载.

我应该提一下,我想要插入插件的对象不是QObjects,但是如果它可以使解决方案更简单,那么它们可以继承QObject.

我怎样才能做到这一点?我想要最简单的解决方案,它是可移植的,除了Qt之外不需要任何其他东西(没有外部依赖).

c++ plugins qt shared-libraries

10
推荐指数
1
解决办法
315
查看次数

标签 统计

assembly ×1

c ×1

c++ ×1

embedded ×1

plugins ×1

qt ×1

shared-libraries ×1