标签: gnu-arm

不同的静态全局变量共享相同的内存地址

摘要

我有几个C源文件,它们都声明了个别名称相同的静态全局变量.我的理解是每个文件中的静态全局变量应该只在该文件中可见,并且不应该应用外部链接,但实际上我可以在调试时看到同名的变量共享相同的内存地址.

就像static关键字被忽略一样,全局变量被视为extern相反.为什么是这样?

示例代码

foo.c的:

/* Private variables -----------------------------------*/
static myEnumType myVar = VALUE_A;

/* Exported functions ----------------------------------*/
void someFooFunc(void) {
    myVar = VALUE_B;
}
Run Code Online (Sandbox Code Playgroud)

bar.c:

/* Private variables -----------------------------------*/
static myEnumType myVar = VALUE_A;

/* Exported functions ----------------------------------*/
void someBarFunc(void) {
    myVar = VALUE_C;
}
Run Code Online (Sandbox Code Playgroud)

baz.c:

/* Private variables -----------------------------------*/
static myEnumType myVar = VALUE_A;

/* Exported functions ----------------------------------*/
void someBazFunc(void) {
    myVar = VALUE_D;
}
Run Code Online (Sandbox Code Playgroud)

调试观察

  1. myVar = ...在每个函数内的行上设置断点.
  2. 从main 调用someFooFunc, …

c gcc arm gnu-arm

26
推荐指数
1
解决办法
1324
查看次数

声明抽象类(纯虚方法)会大幅增加二进制大小

以下是故事:我正在使用AC6 Toolpack为Linux中的ARM Cortex-M0处理器开发C++软件.在我使用Keil(在windows中)(拥有自己的工具链)之前,我已经迁移到GNU-toolchain((GNU Tools for ARM Embedded Processors)5.2.1).我意识到的第一件事是; 二进制文件大小大幅增加.我已经测试了每个编译器优化(链接时间优化除外,它在内联汇编时出错,不是问题的一部分,但可能与答案有关).然后开始使用任何可用工具检查可执行文件(elf文件不是bin,gnu生成两者):objdump,readelf,nm.我发现一些符号导致尺寸增加,重要的是:' d_print_comp_inner',' d_exprlist',' d_template_args'.但不知道是什么导致这些函数出现在二进制文件中.(我使用过最小的库:nano newlib).长话短说我开始逐一消除代码以找到罪魁祸首.最后是抽象方法声明!

将功能定义为

virtual Return_type function_name(...)=0;
Run Code Online (Sandbox Code Playgroud)

代替

 virtual Return_type function_name(...);
Run Code Online (Sandbox Code Playgroud)

添加45 KB和我提到的符号.这是源代码中唯一的变化.存在基类中的空定义.请注意:方法仍然是虚拟的,并在子类中被覆盖

没有抽象类的大小输出:

   text    data     bss     dec     hex filename
  15316      24    4764   20104    4e88 temc_discovery.elf
Run Code Online (Sandbox Code Playgroud)

抽象类的大小输出:

   text    data     bss     dec     hex filename
  61484     128    4796   66408   10368 temc_discovery.elf
Run Code Online (Sandbox Code Playgroud)

这里的方法是抽象的符号和他们的大小,消除了两个版本中出现的符号和他们的大小.(使用nm工具.不完整列表,大小> = 0x60的列表)

00002de4  t d_print_comp_inner
00001a34  t d_exprlist
00000ca4  t d_template_args
00000678  t d_type
00000574  t d_print_mod
000003f8  t d_encoding
000003e0  r …
Run Code Online (Sandbox Code Playgroud)

c++ arm gnu-toolchain gnu-arm cortex-m

6
推荐指数
1
解决办法
614
查看次数

GNU ARM - 未找到 nano.specs

最近几天,我一直在尝试使用Ubuntu 14.04LTS、Eclipse 和 Eclipse 的 GNU ARM 插件编译 STM32F4xx 项目。现在它说nano.specs缺少了。这是我的构建日志:

14:39:35 **** Incremental Build of configuration Release for project F4Test ****
make all 
Building target: F4Test.elf
Invoking: Cross ARM C++ Linker
arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=soft -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -Wall -Wextra  -g -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"../ldscripts" -Wl,-Map,"F4Test.map" --specs=nano.specs -o "F4Test.elf"  ./system/src/stm32f4-hal/stm32f4xx_hal.o ./system/src/stm32f4-hal/stm32f4xx_hal_cortex.o ./system/src/stm32f4-hal/stm32f4xx_hal_flash.o ./system/src/stm32f4-hal/stm32f4xx_hal_flash_ex.o ./system/src/stm32f4-hal/stm32f4xx_hal_flash_ramfunc.o ./system/src/stm32f4-hal/stm32f4xx_hal_gpio.o ./system/src/stm32f4-hal/stm32f4xx_hal_iwdg.o ./system/src/stm32f4-hal/stm32f4xx_hal_pcd_ex.o ./system/src/stm32f4-hal/stm32f4xx_hal_pwr.o ./system/src/stm32f4-hal/stm32f4xx_hal_pwr_ex.o ./system/src/stm32f4-hal/stm32f4xx_hal_rcc.o ./system/src/stm32f4-hal/stm32f4xx_hal_rcc_ex.o  ./system/src/newlib/_cxx.o ./system/src/newlib/_exit.o ./system/src/newlib/_sbrk.o ./system/src/newlib/_startup.o ./system/src/newlib/_syscalls.o ./system/src/newlib/_write.o ./system/src/newlib/assert.o …
Run Code Online (Sandbox Code Playgroud)

eclipse linux stm32 gnu-arm

6
推荐指数
2
解决办法
2万
查看次数

是否可以有多个到 gdbserver 的连接?

我正在使用 Eclipse CDT 和 GNU ARM QEMU 模拟器。Eclipse 在 QEMU 上运行时启动自己的gdb会话gdbserver。我还希望能够从 OSX 终端进行连接,以进行更精细的控制。我还希望能够使用 Node.js 脚本中的 GDB/MI 来获取注册状态等有用数据,并在网页中将其可视化。

当使用我自己的 gdb 会话独立运行 QEMU 模拟器时,我可以很好地连接,但我想知道是否可以搭载 Eclipse 的 gdb,或者再次连接到gdbserver.

谢谢!


来自https://sourceware.org/gdb/onlinedocs/gdb/Server.html (20.3.1.2):

当 gdbserver 保持运行时,gdb 可以稍后再次连接到它。这种重新连接对于断开连接的跟踪等功能很有用。为了完整起见,一次最多可以连接一个 gdb。


到目前为止我无法弄清楚,从文档看来这是不可能的。

我现在使用的解决方案是从终端手动运行 QEMU 模拟器。GNU ARM Eclipse 调试器允许指定gdbserver host:port,我可以将其指向运行良好的独立 QEMU。

为了允许模拟 gdb 会话,我可以创建一个自定义 TCP 服务器供 Eclipse 连接,而不是直接连接到gdbserver. 该 TCP 服务器会将所有流量从 Eclipse 转发到gdbserver,并且我还可以通过此通道监听消息并向 gdb 发送消息。

最终结果是您可以像往常一样在 Eclipse 中调试和设置断点,而且还可以以任何您想要的方式与 gdb 交互,例如通过 Web 界面、本机 OSX 终端等。

eclipse gdb gnu-arm

5
推荐指数
1
解决办法
1556
查看次数

理解程序中变量的多重声明和GCC编译器行为

我尝试了这三个版本的小程序,我得到了一些有趣的结果.任何人都可以帮助我了解每种情况下的编译器行为.

version 1.0

int A;
int A; 
int A;

int main ()
{
   return 0;
}

Result: Got compiled with one copy of A in BSS.


Version 2.0

int main ()
{
   int A;
   int A;
   int A;

   return 0;
}

Result: Failed to compile with complaining for re-declaration.


Version 3.0

int A;

int  main()
{
   static int A;
   return0;
}

result: Compiled with two copy of A in BSS. one is A and another a.<some numeric tag>. 
Run Code Online (Sandbox Code Playgroud)

c static gcc static-members gnu-arm

4
推荐指数
1
解决办法
686
查看次数

如何在 GNU ARM 汇编中保留未初始化的内存?

我在 Raspberry Pi 上使用 GCC 为我正在学习的课程编译一些汇编代码。根据我从GNU 汇编器参考中的信息了解到,我可以在 GNU ARM 汇编中重现以下 C 代码:

int num = 0;
Run Code Online (Sandbox Code Playgroud)

通过这样写:

        .data
num:    .word 0
Run Code Online (Sandbox Code Playgroud)

伟大的!现在我该怎么写呢?

int num;
Run Code Online (Sandbox Code Playgroud)

据我了解,像这样保留未初始化的变量意味着我应该将其视为包含之前内存位置中的任何垃圾值。因此,在以某种方式赋予它值之前,我不应该使用它。

但假设由于某种原因我打算在内存中存储大量数据,并且需要为其保留大量空间。在我看来,如果我无论如何都要用一些数据填充整个内存区域,那么将其初始化为某个值将是对资源的巨大浪费。然而,据我所知,如果不将其初始化为某个值,似乎无法在 GCC ARM Assembly 中创建标签。根据我的汇编教科书,.word指令后面可以有零个表达式,但如果以这种方式使用“那么地址计数器不会前进,并且不会保留任何字节”。我的第一个想法是使用“.space”或“.skip”指令,但对于该指令,甚至官方文档也说“如果省略逗号和填充,则假定填充为零”。

有没有办法让我保留一块内存而不在 GCC ARM Assembly 中初始化它?

assembly gcc arm gnu-arm

2
推荐指数
1
解决办法
2252
查看次数

arm-none-eabi全局初始化变量不正确的值

我试着为stm32f334做一些例子(只是led闪烁).当我想使用.data部分约束时(通过使用初始化的全局变量),我遇到了链接器的问题我遇到了问题.全局变量的值不正确!

这是我的代码:

startup.s:

    .global _start
    .thumb_func
    _start:
    .word 0x20003000
    .word reset
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang
    .word hang

    .thumb_func
    reset:
        bl main
        b hang
    .thumb_func
    hang:   b .
Run Code Online (Sandbox Code Playgroud)

blink.c:

    #define RCCBASE 0x40021000
    #define GPIOBBASE 0x48000400

    static int wymuszenie_bss;
    int wymuszenie_data = GPIOBBASE;

    int main ( void )
    {
        unsigned int* ptr;

        wymuszenie_bss = 0x40021000;

        ptr = (unsigned …
Run Code Online (Sandbox Code Playgroud)

arm bare-metal stm32 linker-scripts gnu-arm

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