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信息和进程运行信息

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

HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验的更多相关文章

  1. LoRa---官方例程移植

    SX1278芯片上移植Semtech官方PING-PONG例程 移植环境:keil5.20 硬件平台:stm32f051+sx1278 1.下载源码:Semtech官网下载最新例程链接:http:// ...

  2. Basic脚本解释器移植到STM32

    本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处! 上次讲了LUA移植到STM32.这次讲讲Basic脚本解释器移植到STM32. 在STM32上跑Basic脚本 ...

  3. FreeRTOS移植到STM32上的移植过程

    所有的单片机都是顺序执行的,而对于多任务而言就显得力不从心了,虽然在一些小项目中可以通过定时器来实现,但这种实现方式没有实时性,一旦任务需要在规定时间内做出响应,那只能通过实时操作系统来完成了.在很多 ...

  4. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...

  5. Dapp开发petshop——truffle官方例程

    truffle-pet-shop pet-shop是truffle的官方例程. 之前参考https://learnblockchain.cn/2018/01/12/first-dapp/的中文教程,但 ...

  6. Linux之初体验

    预备作业03--我的Linux初体验 学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 一开始以为这个项目很简单,以往也在自己的笔记本上看教程安装过软件, ...

  7. BSP中uboot初体验

    一. uboot源码获取 1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的) 1.2. 从SOC厂家获取相同SOC的BSP级uboot 1.3. 从uboot官方下载 1.4. ...

  8. Docker深入浅出系列 | 容器初体验

    目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...

  9. 痞子衡嵌入式:MCUXpresso Config Tools初体验(Pins, Clocks, Peripherals)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso Config Tools三大件(Pins, Clocks, Peripherals). 不知道大家有没有这样的感受 ...

随机推荐

  1. Python正则表达式re.match(r"(..)+", "a1b2c3")匹配结果为什么是”c3”?

    在才开始学习正则表达式处理时,老猿对正则表达式:re.match(r"(-)+", "a1b2c3") 返回的匹配结果为"c3"没有理解,学 ...

  2. 学习tcp和udp

    tcp和udp的差别 tcp和udp是不一样的 tcp是一个可靠的连接,如果发出一个tcp请求,那么就一定要回复一个请求 而udp是不需要回复的,就像QQ一样,只要发过来就可以了,不管别人在不在线,发 ...

  3. 冲刺Day3

    每天举行站立式会议照片: 昨天已完成的工作: 1.完成登录注册的后台代码. 2.确定商品查找的接口. 3.尝试与数据库连接. 今天计划完成的工作: 成员 任务 高嘉淳 完成用户信息管理的部分功能 覃泽 ...

  4. Android之window机制token验证

    前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...

  5. 热部署Devtools

    在子工程添加devtools的依赖 <dependency> <groupId>org.springframework.boot</groupId> <art ...

  6. JUC(三):JUC包下锁概念

    线程不安全集合类 ArrayList List是线程不安全的集合类,底层是Object数组实现,初始化容量是10(其实是一个空数组,第一次扩容时,将数组扩容为10),其后每次扩容大小为当前容量的一半( ...

  7. Jmeter连接redis

    介绍:现在有很多数据不是存储在数据库而是存储在Redis中 Redis数据库存储数据环境 不用每次都去数据库读取数据 可以有效的优化服务器性能. 下面介绍使用jmeter如何读取redis 一.首先创 ...

  8. IIS应用程序池配置详解及优化

    参数说明 1.常规 属性名称 属性详解 NET CLR 版本 配置应用程序池,以加载特定版本的 .NET CLR.选定的 CLR版本应与应用程序所使用的相应版本的 .NET Framework 对应. ...

  9. js下 Day17、综合案例

    一.面向对象轮播 效果图:

  10. js下 Day04、DOM操作--自定义属性

    语法: 元素.getAttribute('自定义属性名') 功能:获取自定义属性 语法: 元素.setAttribute('自定义属性名','值') 功能:设置自定义属性 语法: 元素.removeA ...