我目前正在尝试用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)
我试图寻找有关展开的一些信息,并找到了1和2.但是我仍然不清楚以下内容:
如果有必要,我将包含一个完整的地图文件的链接
在此先感谢您的帮助
编辑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) 在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)
我的计算机表现得像我期望的那样,但嵌入式设备似乎在它到达单词结尾时回滚.为什么会这样?
当我使用我的工具链(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) 我正在研究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)