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信息和进程运行信息
原创内容,转载请注明来源
HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验的更多相关文章
- LoRa---官方例程移植
SX1278芯片上移植Semtech官方PING-PONG例程 移植环境:keil5.20 硬件平台:stm32f051+sx1278 1.下载源码:Semtech官网下载最新例程链接:http:// ...
- Basic脚本解释器移植到STM32
本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处! 上次讲了LUA移植到STM32.这次讲讲Basic脚本解释器移植到STM32. 在STM32上跑Basic脚本 ...
- FreeRTOS移植到STM32上的移植过程
所有的单片机都是顺序执行的,而对于多任务而言就显得力不从心了,虽然在一些小项目中可以通过定时器来实现,但这种实现方式没有实时性,一旦任务需要在规定时间内做出响应,那只能通过实时操作系统来完成了.在很多 ...
- 基于Linux的kfifo移植到STM32(支持os的互斥访问)
基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...
- Dapp开发petshop——truffle官方例程
truffle-pet-shop pet-shop是truffle的官方例程. 之前参考https://learnblockchain.cn/2018/01/12/first-dapp/的中文教程,但 ...
- Linux之初体验
预备作业03--我的Linux初体验 学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 一开始以为这个项目很简单,以往也在自己的笔记本上看教程安装过软件, ...
- BSP中uboot初体验
一. uboot源码获取 1.1. 从板级厂家获取开发板BSP级uboot(就是由开发板厂家提供的) 1.2. 从SOC厂家获取相同SOC的BSP级uboot 1.3. 从uboot官方下载 1.4. ...
- Docker深入浅出系列 | 容器初体验
目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...
- 痞子衡嵌入式:MCUXpresso Config Tools初体验(Pins, Clocks, Peripherals)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso Config Tools三大件(Pins, Clocks, Peripherals). 不知道大家有没有这样的感受 ...
随机推荐
- 第三十三章、PyQt+moviepy实现的MP4视频转gif工具
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在写<第三十二章.使用splitDockWidget和 ...
- Python+Qt学习随笔:PyQt图形界面应用的事件处理流程
图形界面的事件处理是界面操作的核心,经过编写测试程序验证,基本确认PyQt图形界面应用程序的事件处理流程如下: 1.操作系统或其他应用发送消息给应用主程序: 2.应用主程序调用notify将消息队列中 ...
- 一文搞懂RESTful API
RESTful接口实战 原创公众号:bigsai 转载请联系bigsai 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用 ...
- crawlergo动态爬虫去除Spidername使用
本来是想用AWVS的爬虫来联动Xray的,但是需要主机安装AWVS,再进行规则联动,只是使用其中的目标爬虫功能感觉就太重了,在github上面找到了由360 0Kee-Team团队从360天相中分离出 ...
- SA-IS学习笔记
Q:SA-IS 是什么玩意? A:一种 \(O(n)\) 求后缀数组的高科技. Q:为什么会有 SA-IS 这种算法? A:因为它是 \(O(n)\) 的,比倍增 \(O(n\log n)\) 快. ...
- 差分约束系统——POJ1275
之前做过差分,但是没做过差分约束系统. 正好在学军机房听课讲到这道题,就顺带学了一下. 其实...就是列不等式组然后建图 作为蒟蒻,当然是不会加二分优化的啦...但是poj上还是94ms跑过了qwq ...
- 深入理解Java虚拟机(四)——HotSpot垃圾收集器详解
垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有 ...
- SpringBoot快速入门(理论篇)
说在最前 此篇文章,为Spring Boot理论骗,所谓的理论篇就是几乎不会出现代码,只介绍一些理论知识,这些理论知识对你你以后快速上手Spring Boot有非常大的用处! 什么是Spring Bo ...
- STL—— 容器(vector)的各种功能方法
1. 获取容器的元素个数 size() 使用 vectorName.size() 可以输出这个容器中类型的个数,如下代码: 1 #include <iostream> 2 #include ...
- 安全声明标记语言SAML2.0初探
目录 简介 SAML的构成 SAML的优势 SAML是怎么工作的 SP redirect request; IdP POST response SP POST Request; IdP POST Re ...