技术标签: # STM32 # LiteOS stm32 rtos 鸿蒙 liteos 单片机
之前使用小熊派实现了鸿蒙动画的开机界面,具体使用的技术栈为 STM32 + LiteOS + LVGL + FATFS +DMA 方式实现,刷新效率非常高,预览视频如下:
关于这个的实现过程我会写一系列的教程分享出来,主要分为下面几个部分,本节为第一部分,移植 LiteOS 到小熊派上
开发板外貌:
小熊派参数如下:
LiteOS 是华为面向物联网领域开发的一个基于实时内核的轻量级操作系统。属于华为物联网操作系统 Huawei LiteOS 源码,鸿蒙体系的内核之一,本质上就是一个 RTOS,现有基础内核支持任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,更好地支持低功耗场景,支持tickless机制,支持定时器对齐
同时 LiteOS 提供端云协同能力,集成了 LwM2M、CoAP、mbedtls、LwIP 全套 IoT 互联协议栈,且在 LwM2M 的基础上,提供了 AgentTiny 模块,用户只需关注自身的应用,而不必关注 LwM2M 实现细节,直接使用 AgentTiny 封装的接口即可简单快速实现与云平台安全可靠的连接
LiteOS 软件开发框架按照下面的框架来进行,其中 LiteOS调度内核我们移植官方提供的代码即可,而 BSP 外设软件库我们则通过 STM32CubeMX 来配置生成 HAL 库,当这两方面准备好之后,我们只需要在任务层进行开发即可,开发效率极高
LiteOS 的移植一般也分为两种移植方法,一种移植的时候将芯片的中断也关联到 LiteOS 方便调用,另外一种则不关联中断,使用单片机自己的中断管理,这里 STM32 的 NVIC 中断管理很棒,我们不需要接管中断
我们通过 STM32CubeMX 来配置小熊派的一些基本接口,比如配置时钟树,开启 SystemTick定时器,方便移植 LiteOS
配置时钟树:
设置 HAL库定时器为TIM1,防止和 LiteOS 使用的 Systemtick 冲突
配置 LED 的 GPIO 口,方便我们点灯操作
配置工程名称,选择生成 MDK
配置代码生成选项
生成代码
代码生成后打开工程,下一步进入移植操作
LiteOS 的老版本有对 MDK 的支持,新版本暂时还没有更新,所以这里我使用老版本的代码,仓库地址如下:
我们把老版本的仓库 Down 到本地,Git 指令如下:
git clone -b develop https://github.com/LiteOS/LiteOS.git
代码拉取后如下:
没有 Git 工具的话可以上 GitHub 网页把 ZIP Downloade 下来再解压也可以
下面就是代码移植阶段
在 MDK 工程目录下新建 LiteOS 移植目录,按如下新建文件夹
这几个文件夹的作用如下:
下面我们从源码文件夹拷贝代码到移植目录下面
移植 文件路径\LiteOS\arch\arm
架构文件夹到 ARCH
下,arm 下文件包含了各个 arm 架构的支持文件
M 架构下面的文件主要有三个 GCC、IAR、KEIL 三个,适配不同集成开发环境的编译器,因为小熊派是 M4 内核,所以我们主要关注的就是 cortex-m4 下面的 keil 文件夹下的启动文件,这里我把所有的都复制进去了
至于 include 和 src 文件夹,则是存放了 LiteOS 的一些内核接口代码,比如中断接口、Systemtick 定时器接口函数等等
移植 文件路径\LiteOS\LiteOS-M-Develop\LiteOS\osdepends\liteos\cmsis
CMSIS 系统接口文件夹到 CMSIS
下,CMSIS 文件夹下存放的是 CMSIS-RTOS 接口文件夹,RTOS内核支持的操作就那么些,CMSIS-RTOS 对这些操作提供了统一的 RTOS 接口,连接系统底层与 RTOS层,方便我们移植不同的 RTOS:
Config 文件夹下存放系统的配置文件,这个配置文件我们从示例工程下面拷过来,示例工程目录位置 目录\LiteOS\targets\STM32F103VET6_NB_GCC\OS_CONFIG
,目录下文件如下:
其中 los_builddef.h 用于设置构建的定义,los_printf.h 用于设置串口打印配置,target_config.h 可以用于裁剪系统内核,设置系统运行参数等等
kernel 文件夹用于存放内核源码,源码位置在 目录\LiteOS\kernel
下面
base 是系统的基础内核源码
extended 是系统扩展内核的代码,目前里面有个支持低功耗的内核,我们顺便也复制进去
include 存放内核的调用头文件,我们全部复制进去
kernel 下面还有一个 los_init.c 文件,存放初始化代码,也复制进去
复制完成的文件夹如下:
代码移植完成了,下面就是配置一下 MDK
进入 MDK 进行文件管理,配置文件夹,导入文件:
文件导入后下一步就是路径导入,在 C/C++ 配置中依次添加头文件路径
添加的路径如下,这里我的工程目录是 BearPi_LiteOS:
BearPi_LiteOS\Middlewares\LiteOS\Config
BearPi_LiteOS\Middlewares\LiteOS\Kernel\base\include
BearPi_LiteOS\Middlewares\LiteOS\Kernel\extended\include
BearPi_LiteOS\Middlewares\LiteOS\Kernel\include
BearPi_LiteOS\Middlewares\LiteOS\ARCH\arm\arm-m\include
BearPi_LiteOS\Middlewares\LiteOS\CMSIS\cmsis
到这基本差不多了,下面就是编译工程
先编译一下工程,发现报错,缺少 #include “stm32f1xx.h” 文件,是因为我的小熊派开发板是 stm32l431 的芯片,修改这个工程头文件为 #include "stm32l4xx.h"
修改完再编译,当然还会有报错,因为 STM32CubeMX 生成的代码里面有
void PendSV_Handler(void)
void SysTick_Handler(void)
两个中断,这两个中断在 LiteOS 的内核源码里面有定义,一个用作系统时钟,一个用作上下文切换,所以我们要把 STM32CubeMX 生成的这部分中断处理代码注释掉
注释完后编译,编译通过:
到此系统移植基本完成了,下一步写个代码测试系统有没有移植成功
头文件包含 cmsis 接口
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cmsis_os.h"
/* USER CODE END Includes */
创建一个任务句柄,以及任务实体和初始化函数
osThreadId_t led_taskHandle;
const osThreadAttr_t led_task_attributes = {
.name = "led_task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
void Led_Task(void *argument);
void Led_Task(void *argument)
{
while(1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
osDelay(1000);
}
}
在系统初始化的代码添加系统初始化代码,同时创建任务,创建完成后启动系统
/* USER CODE BEGIN 2 */
osKernelInitialize();
/* creation of uart_task */
led_taskHandle = osThreadNew(Led_Task, NULL, &led_task_attributes);
osKernelStart();
/* USER CODE END 2 */
编译下载程序,观察现象:
文章浏览阅读244次。Windows 终端是一个面向命令行工具和 shell(如命令提示符、PowerShell 和适用于 Linux 的 Windows 子系统 (WSL))用户的新式终端应用程序。 它的主要功能包括多个选项卡、窗格、Unicode 和 UTF-8 字符支持、GPU 加速文本呈现引擎,还可以用于创建你自己的主题并自定义文本、颜色、背景和快捷键绑定。安装 从 windows store中安装,搜索terminal 有两个,一个microsoft terminal一个windows terminal prev_在 windows terminal 中设置 powershell 的 startingdirectory 值为 null
文章浏览阅读1.6k次。今天在工作中遇到了一个需求,需要用Java处理post请求中的csv文件,由于之前没处理过,遇到了很多问题,特此记录。由于具体的业务会有区别,本文主要介绍了处理逻辑的代码,如需要请结合具体业务与注释做出修改即可。pom坐标<!--GetByteEncode,用来判断二进制字节流的编码--> <dependency> <groupId>com.googlecode.juniversalchardet</groupId>_java如何判断上传csv文件内部编码格式
文章浏览阅读1.1k次。最近用phpstorm编辑器的远程内置功能连接远程服务器时,一直报连接失败。 查看系统日志也只是说,连接被拒绝。 在网上找问题时,看到这种情况: 本机网络dns变化也会导致xshell自动断开连接,这种情况通过修改ssh配置文件将其中“UseDNS yes”去掉注释并改成no即可,过程如下vim /etc/ssh/sshd_config ... #ClientAliveInter..._命令行sftp 可以连,但程序sftp连不行
文章浏览阅读747次。Electron把Chromium和HTMLWeb页面整合到了一起,最终成为一个GUI桌面应用,还有其他很强大的功能,如访问硬件、通信等。_electron配置
文章浏览阅读162次。简介:是一款可以帮你快速删除模块本身删除后中数据库残留的模块信息,能够让你快速重新安装相关模块。用途:1.把自己觉得实在用不到的模块从网站目录及数据库中删除2.有的朋友站内装了很多模块,过了段时间发现很多又用不上,浪费了网站空间资源,影响运行速度,想想删除,可除了模块文件夹外,又不知道哪里应该删除。使用方法:模块会列出站内所有除了系统功能之外的模块,删除时将删除模块对应的数据库及模块目录。注意事项:1.模块只能是站长身份才可以使用,其它人没办法使用。2.删除模块后,想在恢复只需要重新_模块碎片清理模块
文章浏览阅读1.4k次。http是客户端与服务端传输文本的一种协议标准http协议是无状态的http协议默认端口是80hrrps协议(加密传输)端口443一、请求方法get(获取信息页面)post(上传,修改,添加,服务端信息)put(修改)delete(删除)head(只返回头信息)trace(回显服务器收到的请求,主要用于测试或诊断)connect(HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器)options(客户端查看服务器性能)二、请求报文建立TCP连接在HT_http文档
文章浏览阅读586次。AndroidStudio进行JNI开发:第一种方法使用Android.mk以及Application.mk生成不同内核下的.文件。1.要将AndroidStudio配置支持ndk开发配置的方法如下: 只要在Android NDK location这个位置配置上ndk的路径,之后就可以使用AndroidStudio进行ndk开发.JNI开发的步骤:1、将使用的方法进行定义,之后使用javac..._android jni开发
文章浏览阅读646次。闲来无聊,做了个小小的FTP通信实验,也学到了一些专业外的东西。实验目的:利用虚拟机下fedora系统架设FTP服务器,利用宿主机windows系统访问FTP。实验设置:1.fedora下:ip:192.168.0.20 掩码:255.255.255.0 网关:192.168.0.1 与宿主机连接方式位桥接。2.windows下:ip: 192.168.0.1 掩码:255.255.255.0(显然与fedora在同一网段内,形成局域网)。实验软件:1.fedora下服务器软件:vsftpd2.window_fedora 虚拟机访问宿主
文章浏览阅读1k次。Qt界面篇:用Qt制作一个简单的属性页对话框_qt 设计属性窗口
文章浏览阅读499次。一、项目管理分为五大过程组(47个过程),10大知识领域,如下图:典型生命周期模型如下:二、管理过程1. 项目整体管理说明:项目整体管理包括隶属于项目管理过程组的各种过程和项目管理活动进行识别、定义、组合、统一和协调的过程。在项目管理中,整合兼具统一、合并、沟通和建立联系的性质,这些行动应该贯穿项目始终。作用:通过项目整合管理,我们完成了资源分配,平衡竞争性需求,研究各..._信息管理工程师10大
文章浏览阅读68次。5、《深入浅出MySQL+数据库开发、优化与管理维护+第2版+唐汉明》1、《MySQL技术内幕 InnoDB存储引擎》4、《千金良方:MySQL性能优化金字塔法则》3、《MySQL是怎样运行的》2、《MySQL排错指南》6、《MySQL大智小技》
文章浏览阅读1.7k次。 规则引擎在国内有过一段时期的热潮,特别是JBoss收购了Drools之后,很多人开始关注规则引擎究竟是什么东西。 通过一定程度的了解,大家知道,规则引擎是一个业务逻辑的配置实现。业务逻辑层的代码一般我们通过程序代码实现,但是程序代码不能直观的体现逻辑,而且修改必须由程序员进行。因此我们希望提供一种实现,能够直观的体现逻辑,并且最好可以由业务人员直接修改。 因此从这个角度来说,需要有一个可供业务人_规则引擎分布式改造