生成IAR/KEIL工程常见问题
更新时间:2019-02-01 17:41:18
确认要开发的board是否支持生成keil/IAR工程
首先可以在board目录或者platform/mcu/目录下,在要开发的board目录下打开.mk文件,如果有如下内容,且有相关的文件,则已经支持生成keil/IAR工程,如果没有相关的代码和文件就需要按照生成keil/IAR工程的说明自己添加keil/IAR工程的支持:
ifeq ($(COMPILER), armcc)
$(NAME)_SOURCES += startup_stm32l496xx_keil.s
else ifeq ($(COMPILER), iar)
$(NAME)_SOURCES += startup_stm32l496xx_iar.s
else
$(NAME)_SOURCES += startup_stm32l496xx.s
endif
ifeq ($(COMPILER),armcc)
GLOBAL_LDFLAGS += -L --scatter=board/developerkit/STM32L496.sct
else ifeq ($(COMPILER),iar)
GLOBAL_LDFLAGS += --config board/developerkit/STM32L496.icf
else
Error:L6218E: Undefined symbol __Heap2Base (referred from soc_impl.o).
这个问题可以在AliOS Things
的移植文档里找到解决方法。AliOS Things 移植文档
文档里有如下说明,可以按照说明来配置内核的堆:
2.2.6.3 内核使用堆的配置
如果要使用内存申请功能,则需要打开RHINO_CONFIG_MM_TLF宏,来使能k_mm模块,并且配置对应的堆空间。
堆空间定义有三种方式:链接脚本定义、汇编定义、数组定义。推荐方式:链接脚本定义。
其基本原则是要预留一个内存空间作为堆使用,并将其交给g_mm_region管理。
这个问题是下边soc_impl.c
文件里的代码造成的,可以根据移植文档,修改soc_impl.c
文件和.sct文件来解决这个问题、
也可以使用数组定义和汇编定义的方法修改,可以在参考platform/mcu/stm32l4xx_cube/aos/soc_impl.c
的方法:
extern void *__HeapBase;
extern void *__HeapLimit;
extern void *__Heap2Base;
k_mm_region_t g_mm_region[] = {
{(uint8_t *)&__HeapBase, (uint32_t)0x8000},
{(uint8_t *)&__Heap2Base, (uint32_t)0x8000}
};
int g_region_num = sizeof(g_mm_region)/sizeof(k_mm_region_t);
其它的芯片也许会碰到相同的问题,可以使用前述的方法解决。
armcc: not found
需要添加keil的bin目录到环境变量里,具体请参考第一个 Keil MDK 工程 > 准备工作。
Fatal error: C3903U: Argument '/hardfp' not permitted for option 'apcs'.
keil没有注册,所以默认不支持浮点型编译,请注册keil。