harmonyos能否移植到MCU,HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

硬件平台

基于正点原子战舰V3开发板

MCU:STM32F103ZET6

片上SRAM大小:64KBytes

片上FLASH大小:512KBytes

移植准备

IDE软件:Keil MDK5

串口调试助手

源码下载

HarmonyOS源码开源在gitee上

LiteOS_m的源码仓库

源码结构

根文件夹下的arch_spec.md文件内容即源码结构树,但该结构树不是最新,可以看到当前targers文件夹下已经添加了对STM32F1单片机的例程,但该结构树中并未列出.

├── components --- 可选组件,可裁剪,依赖kernel

│   ├── cppsupport --- C++支持

│   └── cpup --- CPUP功能

├── kal --- 内核抽象层

│   ├── cmsis --- cmsis标准支持

│   └── posix --- posix标准支持

├── kernel --- 内核最小功能集支持

│   ├── arch --- 硬件架构相关

│   │   ├── arm --- arm32架构

│   │   │   └── cortex-m4 --- cortex-m4架构

│   │   │   └── iar ---

│   │   │   ├── los_atomic.h

│   │   │   ├── los_context.h

│   │   │   ├── los_interrupt.h

│   │   │   └── los_mpu.h

│   │   └── include

│   │   ├── los_arch_atomic.h --- 定义通用arch的原子操作

│   │   ├── los_arch_context.h --- 定义通用arch的上下文切换

│   │   ├── los_arch.h --- 定义通用arch初始化

│   │   └── los_arch_interrupt.h --- 定义通用arch中断

│   ├── include

│   │   ├── los_config.h --- 功能开关和配置参数

│   │   ├── los_event.h --- 事件

│   │   ├── los_liteos.h --- liteos最小功能集对外提供的头文件

│   │   ├── los_memory.h --- 堆内存管理

│   │   ├── los_mutex.h --- 互斥锁

│   │   ├── los_queue.h --- 队列

│   │   ├── los_scheduler.h --- 调度算法

│   │   ├── los_sem.h --- 信号量

│   │   ├── los_task.h --- 任务

│   │   └── los_timer.h --- 定时器

│   └── src

├── targets

│   └── targets

│   └── cortex-m4_stm32f429ig_fire-challenger_iar

│   ├── board

│   ├── dprintf.c

│   ├── Libraries

│   ├── main.c

│   ├── project

│   ├── target_config.h --- 板级配置功能开关和配置参数

│   └── Utilities

└── utils

├── include

│   ├── los_compiler.h --- 编译工具配置,类型定义

│   ├── los_debug.h --- debug,printf相关

│   ├── los_error.h --- 错误定义

│   └── los_list.h

└── src

启动流程

在\targets\cortex-m3_stm32f103_simulator_keil\project文件夹下打开工程文件(los_demo.uvproj)

工程下有三个文件夹:liteos-m、main、component

程序加载时,首先进入liteos-m下的los_startup.s文件,内容如下PRESERVE8

AREA RESET, CODE, READONLY

THUMB

IMPORT ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||

IMPORT HalHwiDefaultHandler

EXPORT _BootVectors

EXPORT Reset_Handler

_BootVectors

DCD ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||

DCD Reset_Handler

DCD HalHwiDefaultHandler

DCD HalHwiDefaultHandler

Reset_Handler

CPSID I

IMPORT LOS_HardBootInit

BL LOS_HardBootInit

IMPORT __main

LDR R0, =__main

BX R0

ALIGN

END

可以看出,启动文件只定义了启动向量和reset向量,其他的向量在los_interrupt.c中动态加载

通过LOS_HardBootInit跳转到系统硬件初始化代码,对Uart进行初始化(该例程只用到了串口)void LOS_HardBootInit()

{

UINT32 uwRet = LOS_OK;

uwRet = LOS_UartBaseInit();

if (uwRet != LOS_OK)

{

return ;

}

return ;

}

初始化后回到启动文件并跳转到main函数:LITE_OS_SEC_TEXT_INIT int main(void)

{

unsigned int ret;

//USART_Config();

printf("\n\rhello world!!\n\r");

ret = LOS_KernelInit();

taskSample();

if (ret == LOS_OK) {

LOS_Start();

}

while (1) {

__asm volatile("wfi");

}

}

main函数开始进行了hello world打印,并进行了内核的初始化,最后进行进程测试,创建并运行两个进程

移植需要的修改

工程中使用自定义.sct文件对各个区进行分散加载,详细加载文件见\targets\cortex-m3_stm32f103_simulator_keil\project\los_demo.sct(注意路径,不是output文件夹下的.sct文件,keil在编译过程中也会产生一个.sct文件),详细内容如下:LR_IROM1 0x08000000 0x00200000 { ; load region size_region

ER_IROM1 0x08000000 0x00200000 { ; load address = execution address

los_startup.o (RESET, +First)

*(InRoot$$Sections)

* (+RO)

}

RW_IRAM1 0x20000000 0x00200000 { ; RW data

* (.data, .bss, .data.init)

}

VECTOR 0x20200000 0x400 ; Vector

{

* (.vector)

}

ARM_LIB_STACKHEAP 0x08100000 EMPTY 0x1000

{

}

}

由于片内SRAM和FLASH大小等因素,各段映射地址需要进行相应调整,我修改的映射地址如下(个人习惯):LR_IROM1 0x08000000 0x00080000 { ; 加载域FLASH起始地址0x08000000 大小0x00080000(512KBytes)

ER_IROM1 0x08000000 0x00080000 { ; 从FLASH中加载程序,所以将程序启动文件定向到FLASH首地址,其它只读字段也定位到这里

los_startup.o (RESET, +First)

*(InRoot$$Sections)

* (+RO)

}

RW_IRAM1 0x20000000 0x00010000 { ; SRAM起始地址0x20000000 大小0x00010000(64KBytes),其它读写段和未初始化变量均定位到SRAM中

* (.data, .bss, .data.init)

}

VECTOR 0x2000E000 0x1000 ; 向量表地址

{

* (.vector)

}

ARM_LIB_STACKHEAP 0x20010000 EMPTY -0x1000 ;堆栈空间,存放在内存的高地址向下的一段空间,大小0x1000(4KBytes)

{

}

}

由于SRAM内存限制,需要修改OS内存池大小

修改位置为\targets\cortex-m3_stm32f103_simulator_keil\target_config.h文件中的OS_SYS_MEM_SIZE宏定义,将内存池大小减小,我将其修改为了0x00000D000(52KBytes)

编译运行

将输出文件下载进MCU,连接串口波特率设置115200即可输出helloworld信息和进程运行信息

原创内容,转载请注明来源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值