小编mag*_*rre的帖子

展开支持的内存利用率(在ARM体系结构上)

我目前正在尝试用C语言开发SAM7X256微控制器的软件.该设备运行contiki OS,我正在使用yagarto工具链.

在研究地图文件时(试图弄清楚为什么.text区域增长了这么多)我发现了几个kb的.text区域被分配到展开支持(见下文)

.text           0x00116824      0xee4 c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2\libgcc.a(unwind-arm.o)
                0x00116c4c                _Unwind_VRS_Get
                ......   
                0x0011763c                __gnu_Unwind_Backtrace

.text           0x00117708      0x1b0 c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2\libgcc.a(libunwind.o)
                0x00117708                __restore_core_regs
                0x00117708                restore_core_regs
                ....
                0x00117894                _Unwind_Backtrace

.text           0x001178b8      0x558 c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2\libgcc.a(pr-support.o)
                0x00117958                __gnu_unwind_execute
                ...
                0x00117e08                _Unwind_GetTextRelBase
Run Code Online (Sandbox Code Playgroud)

我试图寻找有关展开的一些信息,并找到了12.但是我仍然不清楚以下内容:

  1. 何时/为什么需要放松支持?
  2. 我的代码的哪一部分导致pr-support.o,unwind-arm.o和libunwind.o被链接?
  3. 如果适用,我如何避免链接以下项目.

如果有必要,我将包含一个完整的地图文件的链接

在此先感谢您的帮助

编辑1:添加链接器命令

CC       = arm-none-eabi-gcc
CFLAGSNO = -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) -I$(CONTIKI_CPU)/loader \
       -I$(CONTIKI_CPU)/dbg-io \
           -I$(CONTIKI)/platform/$(TARGET) \
           ${addprefix -I,$(APPDIRS)} \
           -DWITH_UIP -DWITH_ASCII -DMCK=$(MCK) \
           -Wall $(ARCH_FLAGS) -g -D SUBTARGET=$(SUBTARGET)

CFLAGS  += $(CFLAGSNO) -O -DRUN_AS_SYSTEM -DROM_RUN  -ffunction-sections

LDFLAGS += …
Run Code Online (Sandbox Code Playgroud)

c embedded gcc arm ld

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

在嵌入式设备上投射指针

在32位嵌入式系统上投射和修改指针时遇到了一个奇怪的问题(运行contiki OS的redbee econotag是特定的).

uint32_t array[2];
array[0] = 0x76543210;
array[1] = 0xfedcba98;

uint8_t* point = ((uint8_t*)array)+1;

printf("%08x \n", *(uint32_t*)point );
Run Code Online (Sandbox Code Playgroud)

在我的电脑上输出:

98765432
Run Code Online (Sandbox Code Playgroud)

嵌入式设备上的输出:

10765432
Run Code Online (Sandbox Code Playgroud)

我的计算机表现得像我期望的那样,但嵌入式设备似乎在它到达单词结尾时回滚.为什么会这样?

c embedded x86 arm contiki

7
推荐指数
4
解决办法
1465
查看次数

为什么arm-none-eabi-size报告.data部分为0,即使我使用初始化的RAM?

当我使用我的工具链(Yagarto和codesourcery)大小实用程序时,我对结果感到有些困惑.它报告我在数据部分使用0字节.见下文

$ arm-none-eabi-size.exe rest-server-example.crazy-horse.elf
   text    data     bss     dec     hex filename
  79364       0   34288  113652   1bbf4 rest-server-example.crazy-horse.elf
Run Code Online (Sandbox Code Playgroud)

我知道我的代码正在使用静态RAM变量并将其初始化为0以外的值.

有趣的是,当我直接传递大小工具的一些目标文件时,我看到.data部分被报告

例:

   text    data     bss     dec     hex filename
   1648       0      20    1668     684 obj_crazy-horse/uip-nd6.o
    200      12    2652    2864     b30 obj_crazy-horse/uip-packetqueue.o
     12       0       0      12       c obj_crazy-horse/uip-split.o
   1816      24      48    1888     760 obj_crazy-horse/usb-core.o
    284       0       0     284     11c obj_crazy-horse/usb-interrupt.o
   2064      20     188    2272     8e0 obj_crazy-horse/xmac.o
Run Code Online (Sandbox Code Playgroud)

当构成它的目标文件报告非零值时,为什么elf文件会为.data部分报告0?

仅供参考我正在研究AT91SAM7x256 Micro的嵌入式软件

编辑:

添加CFLAGS和LDFLAGS

CFLAGS  += -O -DRUN_AS_SYSTEM -DROM_RUN  -ffunction-sections

LDFLAGS += -L $(CPU_DIRECTORY) -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map …
Run Code Online (Sandbox Code Playgroud)

c embedded linker arm binutils

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

如何强制gcc使用newlibc实现的函数的自定义实现?

我正在研究ARM微控制器(SAM7)的嵌入式软件并使用Yagarto工具链.

我的代码目前链接libc.a. 但是,我想使用我的代码已经具有的内置函数memcpy的自定义实现.

我已尝试使用GCC手册中指定的-fno-builtin和/或-fno-builtin-memcpy,但链接器仍会抱怨以下警告:

contiki-crazy-horse.a(flashd_efc.o): In function `memcpy':
C:\Users\Melvin\GitRepo\projects\Amatis_Project\SAM7_Contiki\examples\er-rest-example/../../cpu/arm//at91sam7s-x/./flashd_efc.c:669: multiple definition of `memcpy'
c:/toolchains/yagarto/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-memcpy.o):C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\newlib\libc\string/../../../../../newlib-1.19.0/newlib/libc/string/memcpy.c:78: first defined here
collect2: ld returned 1 exit status
make: *** [rest-server-example-nosyms.crazy-horse] Error 1
../../cpu/arm/at91sam7s-x/Makefile.at91sam7s-x:181: recipe for target `rest-server-example-nosyms.crazy-horse' failed
Run Code Online (Sandbox Code Playgroud)

使用某些gcc内置函数的自定义实现的正确方法是什么?

编辑1:添加我正在使用的链接命令.在下面的代码中,Porject.a是一个使用所有项目的目标文件创建的存档文件.

CC       = arm-none-eabi-gcc
CFLAGSNO = -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) -I$(CONTIKI_CPU)/loader \
       -I$(CONTIKI_CPU)/dbg-io \
           -I$(CONTIKI)/platform/$(TARGET) \
           ${addprefix -I,$(APPDIRS)} \
           -DWITH_UIP -DWITH_ASCII -DMCK=$(MCK) \
           -Wall $(ARCH_FLAGS) -g -D SUBTARGET=$(SUBTARGET)

CFLAGS  += $(CFLAGSNO) -O -DRUN_AS_SYSTEM -DROM_RUN  -ffunction-sections

LDFLAGS += -L $(CONTIKI_CPU) --verbose …
Run Code Online (Sandbox Code Playgroud)

embedded linker arm

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

标签 统计

arm ×4

embedded ×4

c ×3

linker ×2

binutils ×1

contiki ×1

gcc ×1

ld ×1

x86 ×1