文章目录
移植准备
APM32F072VB开发板(M0),https://www.geehy.com/ 在官网下载对应的pack包,需要将pack包里的inc、src文件添加到tagets/bsp目录下。这两个目录是芯片依赖的lib库。文件如下图:
移植的文件放在tagets下,目录结构如下图:
编译环境,这里就不多阐述了,按照官网配置即可。
烧录工具:jflash,需要V7以后的版本
编译pack包:keil(为了可以调试pack里的样例程序)
移植
参照Liteos已经移植好的STM32F072、APM32F103的文件。
文件结构
将/tagets/STM32F072的文件拷贝一份至新建的APM32F072目录下。如下图:
文件目录结构如图:
芯片烧写
用的是jlink-flash lite烧写,由于jflash没有APM32F072VB的芯片选型,所以可以选择STM32F072VB的芯片,都是M0的芯片,jflash的配置应该是想通的,所以可以通过这种方式烧写。其实,也找了其它的资料,官网上也没有对应的jflash烧写的配置,jflash只有APM32F103的配置。因此,后面就选了同M0的选型,经过验证可以烧写成功。(补充说明,APM32F072的烧写地址是0x08000000,但是具体的得看datasheet的空间map图)
移植过程
文件结构
在targets文件夹下新增APM32F072_Geehy文件夹,其目录结构参考STM32F072_Nucleo文件夹结构进行创建。
- 拷贝APM32官方SDK中的驱动库到targets\bsp\drivers下。
- 拷贝文件夹Inc、include、os_adapt、Src和文件liteos.ld、los_startup_gcc.S、Makefile到APM32F103_Geehy目录中。
- 替换Inc和Src中文件,将Inc目录下stm32f1xx_hal_conf.h、stm32f1xx.h、stm32f103xe.h、system_stm32f1xx.h文件替换为apm32f10x.h、system_apm32f10x.h;将Src目录下system_stm32f1xx.c文件替换为system_apm32f10x.c。
- 适配编译配置,参考其他同架构的开发板在targets\bsp.mk、targets\bsp\Makefile、tools\build\config、targets\Kconfig.apm32中添加APM32F103相关内容(参照其它文件的格式修改即可)。
- 其中,menuconfig是根据根目录下的.config来进行配置的,.config文件在tools/build目录下
代码移植
系统时钟
系统时钟是通过los_startup_gcc.S文件调用system_apm32f10x.c中的SystemInit来初始化,无需主动实现。
串口
参考APM32官方SDK中的Examples\USART\Printf文件夹下示例,实现串口初始化和UartControllerOps结构体。
GPIO
参考APM32官方SDK中的Examples\GPIO文件夹下示例,实现GPIO口的控制即可。
定时器(用于cpup,计算cpu使用率)
参考APM32官方SDK中的Examples\TMR\TimeBase文件夹下示例,实现定时器初始化和TimControllerOps结构体。
移植遇到的问题
在移植中,可将.config中的无关开关关闭再调试。
任务无法调度
移植中串口与GPIO都ok了,但是任务无法调度。后面查资料发现:M0的启动流程如下,在程序在0x08000000启动后,会从0x00000000处取异常向量表。而M0的异常向量表是在RAM的空间的开头,因此需要将RAM的地址空间映射到0x00000000处。也就是图中的红框的操作,remap SRAM to 0x00000000。这里说明一下,由于__HAL_SYSCFG_REMAPMEMORY_SRAM();的接口只适用于STM系列的芯片,因此需要查datasheet,写一下对应的寄存器,如下图所示:
Stack、Heap不够(堆空间、栈空间不够)
Stack溢出与Heap不够,一般都是由于.config的任务栈空间设置不当导致的,如果Stack分配的太多,可能会导致Heap空间不够,反之,同理。同时还需要修改litos.ld链接文件的相关配置。
移植liteos总结
- arm_nvic.c的 IrqEntryV7M()是中断的总入口,g_curIrqNum是中断号。
- arch\arm\cortex_m\src的task.c中的 OsTaskStackInit() 是初始化栈前面的空间的,主要是R0-R12寄存器以及pc、lr、上下文切换结构体等。
dispath.s文件中的OsStartToRun函数如何跳转到c的?OsStartToRun这个函数是任务调度开始时调用的。