将一个Keil uVision项目移植到GNU工具链

13个员额/ 0个新员额
最后发表
mohit3112
离线
最后看到:7个月2个星期前
专家
加入:2014-08-04一点
将一个Keil uVision项目移植到GNU工具链

我使用应用笔记B-24,经过一些编辑,我得到它工作到链接阶段,但之后我得到这个错误

CC ../../../ src /模块/ app / src / app_project / template_fh / app_template_proj.o
CC startup_ARMCM0.o
链接/ full_emb_sysram.axf
. . / . . / . . / patch_code / obj / ch_map。obj: file not recognized:文件格式无法识别
Collect2: error: ld returned 1 exit status
: * * * (/ full_emb_sysram。axf]错误1

所以基本上补丁代码是不能被gcc-arm- noneabi识别的

对我可能做错的地方有什么意见吗?

谢谢你!
Mohit Maheshwari

JE_Dialog
离线
最后看到:1天16小时前
工作人员
加入:2013-12-05 14:02
你好,Mohit,

你好,Mohit,

我们的GNU专家本周是OOO,我承认我自己没有太多的GNU经验。我在网上快速搜索了一下:。obj文件可以在GNU中链接吗?下面的这个线程暗示不是。

BR JE_Dialog

http://www.delorie.com/djgpp/v2faq/faq17_5.html

mohit3112
离线
最后看到:7个月2个星期前
专家
加入:2014-08-04一点
谢谢你的帮助,我有新的

感谢relpy,我有新的sdk 3.0.6,在这个精灵.obj文件格式和我能够编译项目并生成十六进制文件,但有一个优化选项-fplugin = tree_switch_shortcut_elf我arm-none-eabi编译器不支持,是为优化以R.W. FSM implemeted的代码。我编译移除该选项和十六进制文件生成,我使用JLinkGDBServer和gdb上传十六进制文件,但设备没有广告,我使用编译器二进制从launchpad项目'https://launchpad.net/gcc-arm-embedded/+download你能告诉我哪里可以得到兼容的编译器吗

cverdier
离线
最后看到:5年5个月前
加入:2014-09-25 14:54
你好,

你好,

我得到了相同的结果,当我用这个工具链gcc-arm-none-eabi-4_8-2014q3编译时,不能做广告。然而,我可以运行代码(即。Led闪烁)和它的工作。
我还可以确认uart驱动程序与那个工具链不工作。我使用转换脚本生成Makefile。我还对DA14580_BEACON_3.40-2.6示例代码进行了一些测试,但没有运气。

无论我使用什么样例代码,当我设置cmd->channel_map到任何东西,但0,我似乎崩溃模块…

任何想法?

cverdier
离线
最后看到:5年5个月前
加入:2014-09-25 14:54
我可以确认-fplugin

我可以确认-fplugin=tree_switch_shortcut_elf不兼容windows和mac版本的gcc-arm-non -eabi-4_8-2014q3,但只在linux上。我没有在带有with选项的linux机器上尝试(我在mac上编译)。

cverdier
离线
最后看到:5年5个月前
加入:2014-09-25 14:54
这是我的Makefile

这里是我的Makefile的进一步信息:

# Makefile必须定义以下变量,这些变量由common.mk使用:
# O:输出目录
STACK_SIZE:为堆栈预留的字节数
# HEAP_SIZE:为堆预留的字节数
# CORTEX_M:目标的Cortex-M模型
# STARTUP_DEFS:定义配置启动代码的值
# CFLAGS:用于编译和链接的标志
LDFLAGS:用于链接的标志
# ROM_MAP_FILE:ROM映射文件
要编译和链接的目标文件列表
# TARGET_ELF:目标的名称(在生成的图像中使用)

#输出目录
O ? =

#栈大小
STACK_SIZE = 0 x0600
#堆大小
HEAP_SIZE = 0 x0100

#启动代码
CORTEX_M: = 0
启动= startup_ARMCM $ (CORTEX_M)。年代

#启动配置
Startup_defs += -d__stack_size =$(stack_size) -d__heap_size =$(heap_size)
# STARTUP_DEFS + = -D__START =主要
# STARTUP_DEFS + = -D__STARTUP_COPY_MULTIPLE
STARTUP_DEFS + = -D__STARTUP_CLEAR_BSS_MULTIPLE

# -Os -flto - function-sections -fdata-sections用于编译代码大小
# CFLAGS + = -flto
CFLAGS += -function- sections -fdata-sections -Wno-implicit-function-declaration
# Link显示代码大小
GC: = - wl - gc-sections

SRC = SRC /
构建:构建/

TOP ?= $(shell pwd)

APP_SRC:= ./app/B4S.c \
/应用程序/系统/ periph_setup.c \
/应用程序/系统/ b4s_uart.c \
美元(SRC)模块/ app / SRC / app.c \
美元(SRC)模块/ app / SRC / app_sec.c \
美元(SRC)模块/ app / SRC / app_sec_task.c \
美元(SRC)模块/ app / SRC / app_task.c

BOOT_SRC:= plf/refip/src/arch/boot/rvds/system_ARMCM0.c \
plf / refip / src / arch /主/祝福/ hardfault_handler.c

# BOOT_SRC_S: = plf / refip / src / arch / boot /测量/ boot_vectors.s
BOOT_SRC_S: =

= plf/refip/src/arch/main/ble/arch_main.c \
plf / refip / src / arch /主/祝福/ jump_table.c \
plf / refip / src / arch /主/祝福/ arch_sleep.c \
plf / refip / src / arch /主/祝福/ nmi_handler.c \
plf / refip / src / arch /主/祝福/ arch_system.c

NVDS_SRC: =模块/ nvd / src / nvds.c

RWBLE_SRC:= modules/rwip/src/rwip.c \
ip /祝福/会/ src / rwble / rwble.c

HOST_SRC: = ip /幸福/霍奇金淋巴瘤/ src /主机/ / gapm / gapm.c缺口

DRIVER_SRC:= modules/rf/src/rf_580.c \
plf / / gpio / gpio.c refip / src /驱动程序

PROFILE_SRC: =

SRCS_C: = (APP_SRC)美元(addprefix (SRC),美元(BOOT_SRC)) \
$(addprefix $(SRC), $(ARCH_SRC)) \
$(addprefix $(SRC), $(NVDS_SRC)) \
$(addprefix $(SRC), $(RWBLE_SRC)) \
$(addprefix $(SRC), $(DRIVER_SRC)) \
(addprefix (SRC)美元,美元(PROFILE_SRC))

SRC:= $(addprefix $(SRC), $(BOOT_SRC_S))

HEADERS_DIR:= dialog/include \
ip /祝福/霍奇金淋巴瘤/ src / hcih \
ip /祝福/霍奇金淋巴瘤/ src /主机/丙氨酸\
ip /祝福/霍奇金淋巴瘤/ src /主机/丙氨酸/ attc \
ip /祝福/霍奇金淋巴瘤/ src /主机/丙氨酸/ attm \
ip /祝福/霍奇金淋巴瘤/ src /主机/丙氨酸/丙氨酸\
ip /祝福/ hl \ / src /主机/差距
ip /祝福/霍奇金淋巴瘤/ src /主机/差距/ gapc \
ip /祝福/霍奇金淋巴瘤/ src /主机/差距/ gapm \
ip /祝福/霍奇金淋巴瘤/ src /主机/关贸总协定\
ip /祝福/霍奇金淋巴瘤/ src /主机/关贸总协定/ gattc \
ip /祝福/霍奇金淋巴瘤/ src /主机/关贸总协定/ gattm \
ip /祝福/霍奇金淋巴瘤/ src /主机/ i2c \
ip /祝福/霍奇金淋巴瘤/ src /主机/ i2c / i2cc \
ip /祝福/霍奇金淋巴瘤/ src /主机/ i2c / i2cm \
ip /祝福/霍奇金淋巴瘤/ src /主机/ l2c / l2cc \
ip /祝福/霍奇金淋巴瘤/ src /主机/ smp \
ip /祝福/霍奇金淋巴瘤/ src /主机/ smp / smpc \
ip /祝福/霍奇金淋巴瘤/ src /主机/ smp / smpm \
ip /祝福/霍奇金淋巴瘤/ src / rwble_hl \
ip /幸福/ / src /控制器/ em \
ip /幸福/ / src /控制器/ llc \
ip /祝福/会/ src /控制器/ lld \
ip /幸福/ / src /控制器/ llm \
ip /幸福/ / src / hcic \
ip /幸福/ / src / rwble \
模块/ app / api \
模块/ app / src \
模块/ app / src / app_utils / app_console \
模块/ app / src / app_utils / app_multi_bond \
模块/ app / src / app_utils / app_stream_queue \
模块/ app / src / app_profiles /﹐\
模块/ app / src / app_profiles /过时\
模块/ app / src / app_profiles /低音\
模块/ app / src / app_profiles /阀瓣\
模块/ app / src / app_profiles /贬低\
模块/ app / src / app_profiles /蹄\
模块/ app / src / app_profiles / ht \
模块/ app / src / app_profiles /内外加厚\
模块/ app / src / app_profiles /微处理器\
模块/ app / src / app_profiles /内\
模块/ app / src / app_profiles / prox_reporter \
模块/ app / src / app_profiles /保诚\
模块/ app / src / app_profiles / scppc \
模块/ app / src / app_profiles / spotar \
模块/ app / src / app_profiles \ /流
模块/ app / src / app_profiles / streamdatad \
模块/ app / src / app_profiles / streamdatah \
模块/共同/ api \
模块/ dbg / api \
模块/ gtl / api \
模块/ gtl / src \
模块/克/ api \
模块/克/ src \
模块/ nvd / api \
模块/射频/ api \
模块/ rwip / api \
plf / refip / src /拱\
plf refip / src / arch / boot /测量\
plf / refip / src / arch /编译器/测量\
plf / refip / src / arch /会/测量\
plf / refip / src / arch /主/祝福\
plf / accel \ / refip / src /驱动程序
plf / adc \ / refip / src /驱动程序
plf /电池\ / refip / src /驱动程序
plf / bme280 \ / refip / src /驱动程序
plf / coex \ / refip / src /驱动程序
plf / emi \ / refip / src /驱动程序
plf / gpio \ / refip / src /驱动程序
plf / i2c_core \ / refip / src /驱动程序
plf / i2c_eeprom \ / refip / src /驱动程序
plf / intel \ / refip / src /驱动程序
plf /发票\ / refip / src /驱动程序
plf /领导\ / refip / src /驱动程序
plf / pwm \ / refip / src /驱动程序
plf / rc5 \ / refip / src /驱动程序
plf /注册\ / refip / src /驱动程序
plf / spi \ / refip / src /驱动程序
plf / spi_flash \ / refip / src /驱动程序
plf / spi_hci \ / refip / src /驱动程序
plf / syscntl \ / refip / src /驱动程序
plf /计时器\ / refip / src /驱动程序
/ wkupct_quadec plf / refip / src /驱动程序

BUILD_DIR:= $(addprefix $(BUILD),$(MODULES))
OBJ: = $ (patsubst src / % . c,构建/ % . o,美元(SRCS_C)) $ (patsubst src / % s,构建/ % . o,美元(SRCS_S))
包括:= $ (addprefix - $ ((SRC),美元addprefix (HEADERS_DIR)))我。应用程序i /应用程序/系统

#优化旗帜
#CFLAGS += -Os -fplugin=tree_switch_shortcut_elf
CFLAGS + =操作系统
CFLAGS + = $(包括)
CFLAGS += -include da14580_config.h

打印- %:;@echo $* = $($*)

#全局配置

/ misc / rom_symdef.txt ROM_MAP_FILE: =

LDFLAGS + = $ (USE_NANO) (USE_NOHOST) (LDSCRIPTS)美元(GC) (MAP)美元

#不要抱怨未知属性(例如zero_init)
CFLAGS += -Wno-attributes -Wno-unused

# CHECK:此标志阻止警告
# "使用2字节的wchar_t输出是使用4字节的wchar_t;
#跨对象使用wchar_t值可能会失败"
#如果wchar_t字符串不能正常工作,请重新访问。
LDFLAGS + = - wl - no-wchar-size-warning

src_cfiles: = $ (SRCS_C)

src_Sfiles: = $ (SRCS_S)

obj_cfiles: = $ (src_cfiles: c = . o)
obj_Sfiles: = $ (src_Sfiles: s = . o)

#补丁对象
patch_objs: =。/ patch_code / obj / gapm_util。obj \
。/ patch_code / obj / smpc_task。obj \
。/ patch_code / obj / smpc。obj \
。/ patch_code / obj / atts_task。obj \
。/ patch_code / obj / ch_map。obj \
。/ patch_code / obj / ke_task.obj

startup_obj: = $(启动:s = . o)

OBJ:= $(obj_cfiles) $(obj_Sfiles) $(startup_obj)

#目标
TARGET_ELF: = full_emb_sysram

包括common.mk

-----------------------

和我common.mk


# makefile使用的常见变量和配方。
#定义了以下变量:
c#交叉编译器
# CPP: cross-preprocessor
# OBJCOPY: cross-objcopy
# USE_NANO: link flags to select newlib-nano
# USE_SEMIHOST:启用半主机的链接标志
# USE_NOHOST:禁用半主机的链接标志
# MAP:链接标记来创建映射文件
# LDSCRIPTS:使用自定义链接脚本的链接标志,从$(LINK_SCRIPT)生成。年代

CROSS_COMPILE = . . / toolschain / gcc -手臂没有eabi - 4 - _8 - 2014第三季度/ bin / arm-none-eabi -
CC = $ (CROSS_COMPILE) gcc
CPP = $ (CROSS_COMPILE) CPP
OBJCOPY = $ (CROSS_COMPILE) OBJCOPY

#冗长开关
V ? = 0
ifeq ($ (V), 0)
V_CC = @echo " CC " $@;
V_CPP = @echo " CPP " $@;
V_LINK = @echo " LINK " $@;
V_OBJCOPY = @echo " OBJCPY" $@;
V_CLEAN = @echo " clear ";
V_SED = @echo " SED " $@;
V_GAWK = @echo " GAWK " $@;
其他的
V_OPT = ' v '
endif

# newlib-nano使用。要禁用它,请指定USE_NANO=
USE_NANO: = = nano.specs——规格

#是否使用半主机
USE_SEMIHOST: = = rdimon.specs——规格
USE_NOHOST: = = nosys.specs——规格

#创建映射文件
= - wl地图,地图= (O) / lst /美元(TARGET_ELF) . MAP

ARCH_FLAGS = -mthumb -mcpu=cortex-m$(CORTEX_M)

#通用编译标志
CFLAGS += $(ARCH_FLAGS) $(STARTUP_DEFS) -std=gnu99 . CFLAGS += $(ARCH_FLAGS) $(STARTUP_DEFS) -std=gnu99 . CFLAGS += $(ARCH_FLAGS

ifeq ($ (V), 2)
CFLAGS + =——冗长
LDFLAGS + = - wl,冗长
endif

ROM_SYMDEF: = rom.symdef
ROM_SYMBOLS: = rom.symbols
LINK_SCRIPT: = 580.摩门教
LDSCRIPTS: = - l。- t $ (LINK_SCRIPT)

: $ (O) / $ (TARGET_ELF)。十六进制(O) / (TARGET_ELF)美元。斌

清洁:
$(V_CLEAN)for file in $(OBJ);do rm -f $(V_OPT)“$ $文件”;完成
@rm -rf $(V_OPT) $(O)
@rm - f (V_OPT) (ROM_SYMDEF)美元(ROM_SYMBOLS) (LINK_SCRIPT)美元
@rm -f $(V_OPT) $(OBJ:.o=.d)

运行:$ (O) /美元(TARGET_ELF)。斌
@(cd $(O) && JLinkExe ./loadbin.txt)

(O) /美元:
@mkdir -p $(V_OPT) $(O)/lst

#如何创建主ELF目标
(O) /美元(TARGET_ELF)。axf: $(O)/ $(ROM_SYMBOLS) $(LINK_SCRIPT) $(OBJ)
(V_LINK) (CC)美元(CFLAGS) (LDFLAGS)美元(OBJ)美元(patch_objs) - o $ @

如何创建最终的十六进制文件
(O) /美元(TARGET_ELF)。十六进制:$ (O) / (TARGET_ELF) .axf美元
$(V_OBJCOPY)$(OBJCOPY) -O ihex $< $@

#如何创建最终的二进制文件
(O) /美元(TARGET_ELF)。斌:(O) / (TARGET_ELF) .axf美元
$(V_OBJCOPY)$(OBJCOPY) -O二进制

如何创建链接器脚本
(LINK_SCRIPT):美元(LINK_SCRIPT)。年代
(V_CPP) (CPP)美元美元(CFLAGS)我。/app -P $< -o $@

#如何创建一个干净的,有序的已知符号列表,由ROM代码使用
(ROM_SYMDEF):美元(ROM_MAP_FILE)
$ (V_SED) sed - n - e ' s / * / / g p <美元| sed - e ' / ^ [,] / d ' | \
排序| dos2unix > $@

#如何创建一个文件与已知的符号,以用于链接器脚本
(ROM_SYMBOLS):美元(ROM_SYMDEF)
$ (V_GAWK)呆呆的{printf“% s = % s; \ n”,$ $ 3 $ $ 1 }' $< > $@

包括美元(OBJ . o = .d):

如何编译C文件
%.o: % . c
$(V_CC)$(CC) $(CFLAGS) -c $< -o $@
@rm - f * .d美元。*
@$(CC) -MM $(CFLAGS) $*.c > $*.d
@mv - f $ *。d $ * .d.tmp
@sed - e ' s * |: | $ *。O:|' < $*. d.p tmp > $*.d
@sed - e ' s /。*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \
Sed -e 's/^ *//' -e 's/$$/:/' >> $*.d
@rm - f * .d.tmp美元

如何编译程序集文件
%.o: %。年代
$(V_CC)$(CC) $(CFLAGS) -c $< -o $@

mohit3112
离线
最后看到:7个月2个星期前
专家
加入:2014-08-04一点
嗨cverdier,

嗨cverdier,

我也在我的mac上编译了文件,我认为即使ubuntu版本的工具链也没有这个-fplugin=tree_switch_shortcut_elf选项(至少在我的版本中是这样)。我确信编译没有tree_switch_elf选项的代码不会工作,因为这个选项是用来优化由riviera waves实现的FSM。一个疯狂的选择是在启用了tree_switch_elf插件的arm-non -gcc版本上构建我们的版本(在以前的arm-linux-gnueabi中尝试过,但调试和编译gcc至少需要一周的时间)。会很快更新吗

Mohit Maheshwari

cverdier
离线
最后看到:5年5个月前
加入:2014-09-25 14:54
我设法用

我用GCC 4.9 for mac编译了'tree_switch_elf'选项,https://launchpad.net/gcc-arm-embedded/4.9.我在Makefile中做了如下更改:

#优化旗帜
CFLAGS += -Os -ftree-switch-shortcut

没有运气,相同的崩溃在模块上,只要我使用cmd->channel_map选择一个频道广播。

ankitdaf
离线
最后看到:2年7个月前
加入:2015-09-03 20:14
tree-switch-shortcut没有

如果我理解正确的话,树开关快捷键不再是一个插件,它是默认发生的,现在是gcc的一个特性。该文件是gcc源代码的一部分,也在gcc/gcc文件夹中,您可以看一看

cverdier
离线
最后看到:5年5个月前
加入:2014-09-25 14:54
还有机会吗

有没有机会在这个项目上有一个更新,就像有一个完整配置的工作项目使用无线电(包括Makefile和更新的链接器脚本)使用GNU GCC请?

在这个问题上任何帮助将非常感谢!

谢谢:)

CoreyWilliamson
离线
最后看到:4年9个月前
加入:2014-10-10 06:29
你好,

你好,

有什么最新消息吗?

阅读应用程序说明B-024似乎暗示项目构建和工作,有人得到无线电与gcc工具链工作吗?

谢谢

paul.deboer
离线
最后看到:1年1个月前
加入:2014-06-03 10:57
解决办法就是使用这个

解决方案是使用以下工具链:
https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update
并将-fplugin=tree_switch_shortcut_elf修改为-ftree-switch-shortcut

你可能会得到下一个关于__weak的错误,通过在common.mk的CFLAGS中添加-D__weak="__attribute__((weak))"来解决这个问题
和一个关于__nop()的错误,通过添加-D"__nop()"="asm(\"NOP\")"解决

mohit3112
离线
最后看到:7个月2个星期前
专家
加入:2014-08-04一点
你能确认这个hexfile吗

你能确认你生成的hexfile有效吗?