刚换了工作,最近接触了一个项目,使用的是stm32低功耗系列,系统是华为的物联网 liteOS操作系统,框架为touchGFX ui框架;

由于之前接触底层较多因此就想自己移植一个liteos 以及touchgfx到自己的stm32开发板上,刚好自己也有个开发板,开发板是stm32f103zet6这款是大二买的买了就凉着了,是战舰的v1版本;

目的:想通过这个过程,让自己更深刻的理解项目的架构,底层与上层,以及底层代码的组织结构,操作系统的代码组织结构,底层代码如何和系统交互,底层如何跟框架衔接,如何跟liteos衔接等等;

从零开始首先建立裸机的工程,使用st公司的软件,不得不说这个软件太强大了,强大到你用了之后你感觉自己成了一个废人(自己做的事情太少),stm32CubeMX直接生成工程,这里不多做介绍,

一,stm32 基于hal库的裸机工程,移植liteos;

这里发现了华为liteos官网有很详细的介绍,觉得完全没必要重写,因此可以直接参考官网;

包括裸机工程的建立和liteos的移植;

https://support.huaweicloud.com/bestpractice-LiteOS/zh-cn_topic_0145350106.html

使用stm32CubeMX可以建立基于hal的裸机工程,这里常用的简单分为两种,keil和iar ,我这里使用iar工程;

遇到的问题:

1,串口通信出现乱码;

这个问题浪费了我三四天时间,串口在移植完,重定向之后,操作系统的打印信息会从这个串口输出,所以相当重要,由于我的开发板比较老,当串口出现乱码的时候总以为晶振配置的有问题,然后看原理图和开发板,发现外部晶振是12m,而stm32CubeMX上外部晶振为8M,再上百度修改库文件 里的晶振;总之试了好几天一直都是乱码,最后发现是吧串口搞错了,根本晶振什么的完全不用改,就按上面链接里的来设置串口和led都是ok的;一定要搞清楚哪个串口是你用的(是的,这是比较低级的错误),也就是你设置的串口到底对应物理串口是哪个,这里我一直以为是com3,其实是com4;

2 一个需要额外设置的是stjlink调试(这里的额外是相对于华为官网的指导来说),如果不设置这个,在使用stjlink调试的时候会遇到问题导致不能调试;

3.第二个需要额外设置的用来支持串口的接收数据(中断模式),需要打开串口中断使能;

搭建裸机工程之后,编写了led和串口的中断收发测试程序功能已验证,供大家参考;

led这里的led为PB5,也可以自己加PE5

      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5,GPIO_PIN_SET );HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);HAL_UART_Transmit(&huart1, tData, sizeof(tData), 1000);      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);HAL_Delay(500);

串口的中断收发例程,库函数太完备,我们能做的事情太少;

只需要在主函数中打开uart1的接收中断,并重写中断回调函数;

main函数中加入下面一行;

HAL_UART_Receive_IT(&huart1, rData, 1);

重写中断回调函数,这里不是c++中的重载,HAL_UART_RxCpltCallback 这个函数在库中已经存在,只是被定义为弱符号,__weak,我们在main中重写,编译器链接运行将使用我们写的函数;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* 接收一个字节数据直接发出去 */HAL_UART_Transmit(&huart1, rData, 1, 1000); /* 每次需要重新初始化接收结构体指针 */HAL_UART_Receive_IT(&huart1, rData, 1);
}

这样两个测试例程都已经正常运行了

这时候裸机工程验证完毕;

二 ,紧接着一步将printf重定向到串口1上,这一步很重要,因为当移植玩操作系统之后,操作系统的启动信息都是使用标准库中的printf打印到串口上,而printf是用putchar实现的;

由于我们只需要输出消息也就是将操作系统的信息使用printf打印出来而不需要使用scanf获取输入,基于上面串口的功能,只重定向fputc

添加uart.h ,uart.c文件如下:

#ifndef __UART_H__
#define __UART_H__
#include "stdio.h"
#include "stdint.h"int fputc(int ch, FILE *f);#endif
#include "uart.h"
#include "stdio.h"
#include "stm32f1xx_hal.h"
extern UART_HandleTypeDef huart1;///重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{uint8_t p = ((uint8_t)ch);/* 发送一个字节数据到USART1 */HAL_UART_Transmit(&huart1,&p,1, 1000);return (p);
}

此函数会覆盖标准库中的fputc;

验证遇到的问题;使用Hal_DELAY()函数后遇到死循环;

需要调用HAL_IncTick()函数,代码见附件

void SysTick_Handler(void)
{if (g_bSysTickStart){osTickHandler();}else{g_ullTickCount++;}HAL_IncTick();
}

三,最后是liteos的移植,移植过程见最上面的链接;

操作系统liteOS的主要模块包括:

任务

提供任务的创建、删除、延迟、挂起、恢复等功能,以及锁定和解锁任务调度。支持任务按优先级高低的抢占调度及同优先级时间片轮转调度。

任务同步

  • 信号量:支持信号量的创建、删除、申请和释放等功能。
  • 互斥锁:支持互斥锁的创建、删除、申请和释放等功能。

硬件相关

提供中断、定时器等功能。

  • 中断:提供中断的创建、删除、使能、禁止、请求位的清除等功能。
  • 定时器:提供定时器的创建、删除、启动、停止等功能。

IPC通信

提供事件、消息队列功能。

  • 事件:支持读事件和写事件功能。
  • 消息队列:支持消息队列的创建、删除、发送和接收功能。

时间管理

  • 系统时间:系统时间是由定时/计数器产生的输出脉冲触发中断而产生的。
  • Tick时间:Tick是操作系统调度的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。
  • 软件定时器:以Tick为单位的定时器功能,软件定时器的超时处理函数在系统创建的Tick软中断中被调用。

内存管理

  • 提供静态内存和动态内存两种算法,支持内存申请、释放。目前支持的内存管理算法有固定大小的BOX算法、动态申请SLAB、DLINK算法。
  • 提供内存统计、内存越界检测功能。

以上是liteos系统的主要职能,可以发现不像linux操作系统,linux内核中包含的全量的驱动程序,这也是liteos能这么小的原因,因此串口重定向的任务才需要在裸机的时候完成,使用的就是hal的抽象层接口;

操作系统移植完成之后烧录,启动串口打印如下:

到此,liteos就在开发板中正常运行了...

工程代码见附件!

stm32F103zexx(战舰v1) 移植liteOS相关推荐

  1. STM32F103移植LiteOS保姆级教程(基于Huawei-LiteOS-studio)

    前言 开始按照官方教程进行安装和配置发现会有一些问题,经过不断尝试终于可以在huawei-liteos-studio下编译移植成功.以下为STM32F103ZE移植LiteOS详细的完整教程. 步骤 ...

  2. 【liteOS】小白进阶之移植 LiteOS 到 STM32

    原文地址::[liteOS]小白进阶之移植 LiteOS 到 STM32_产品人卫朋的博客-CSDN博客 相关文章 1.STM32F103移植LiteOS保姆级教程(基于Huawei-LiteOS-s ...

  3. STM32F103移植LiteOS之跑马灯实验

    相关文章: STM32F103移植LiteOS保姆级教程(基于Huawei-LiteOS-studio) STM32F103移植LiteOS保姆级教程(基于Ubuntu平台) 在编译通过且能成功烧录的 ...

  4. STM32 移植 LiteOS 过程

    HUAWEI LiteOS 移植过程 移植说明 本文讲述的是将 LiteOS 系统移植到 STM32F407ZGT6 单片机的开发板上 开发环境 主要的开发工具有以下几种: STM32CubeMX L ...

  5. STM32F103移植LiteOS保姆级教程(基于Ubuntu平台)

    前言 嵌入式软件常用linux系统进行开发,LiteOS于linux平台上的移植相比win的移植会简单许多,本文基于Ubuntu平台对STM32F103的LiteOS移植教程进行详细讲解. 步骤 1. ...

  6. 华为LiteOS操作系统基础知识入门与内核移植

    LiteOS操作系统是华为在2015年发布的一个轻量级的面向物联网的操作系统,同时也是华为物联网1+2+1物联网解决方案的组成部分,此操作系统具备零配置,自发现,自组网的特点,让LiteOS的终端物联 ...

  7. 将目录专为源码html,LiteOS移植笔记

    操作系统是用来管理系统硬件.软件及数据资源,控制程序运行,并为其它应用软件提供支持的一种系统软件.根据不同的种类,又可分为实时操作系统.桌面操作系统.服务器操作系统等.对于一些小型的应用,对系统实时性 ...

  8. 小熊派移植华为 LiteOS-M(基于MDK)

    文章目录 小熊派移植华为 LiteOS-M(基于MDK) 前言 一.软硬件介绍 1.1 小熊派开发板 1.2 LiteOS介绍 1.3 移植前言 二.CubeMX 配置 三.获取源码 四.源码移植 4 ...

  9. 手把手教你丨小熊派移植华为 LiteOS-M

    摘要:本文详细讲解如何移植 LiteOS 到小熊派. 本文分享自华为云社区<小熊派移植华为 LiteOS-M(基于MDK)>,作者: JeckXu666. 前言 之前使用小熊派实现了鸿蒙动 ...

最新文章

  1. 11467人力资源统计学在计算机,2013年至2017年自考11467《人力资源统计学》真题及答案.pdf...
  2. 自动注册 IIS6 的 MIME 类型
  3. Spring@Cacheable注解在类内部调用失效的问题
  4. CSDN怎么转载别人的博客
  5. qt中xml文件的更新
  6. 360浏览器怎么查看保存的密码
  7. yii2 的 restful 接口书写自定义方法
  8. 捕获asp.net下的未处理异常
  9. FRED应用:锥透镜的设计
  10. Educoder 二维码名片制作
  11. 虚拟机自省XenAccess和vmitools
  12. 小度加速破圈,智能音箱告别肉搏战
  13. 怎么用计算机算lnx,lnx等于多少怎么算
  14. 计算机在水产养殖学中的应用,计算机技术在生物学中的应用
  15. latex公式斜体_LaTeX技巧902:使斜体中的括号保持直立
  16. mysql 单表多次查询和多表联合查询,哪个效率高
  17. 一个几乎免费的云服务器和虚拟主机平台
  18. NTC热敏电阻与浪涌电流,热启动不会失效?
  19. 使用你们的AirDisk产品会不会泄露文件给你们,会不会将文件数据传送到你们服务器?
  20. 下载Poco库并在VS2013中使用

热门文章

  1. win7 找不到 计算机策略组,win7系统打开组策略提示gpedit.msc找不到的解决方法
  2. vs code连接服务器卡在Downloading with wget
  3. 自媒体如何利用文章和搬运视频伪原创来赚钱
  4. 搭建个人网站,用虚拟主机和云服务器哪个好呢?
  5. 君润人力,用技术提升整体人资效益
  6. z-index设置说明
  7. 黑莓 priv android 8,黑莓官方确认:黑莓Priv不会升级安卓7.0
  8. 无代码开发平台之仪表盘 _ 三叠云
  9. 利用phantomjs模拟QQ自动登录
  10. 面试官:你期望薪资是多少?能多让你拿几千工资的回答你一定要看