立创天空星GD32开发板 开源嵌入式组件移植测试 OneOS Lite移植测
移植目标硬件(开发板/芯片/模组)
OneOS Lite支持ARM Cortex M核芯片和RISC-V内核的芯片的移植,比如STM32 基于Cortex M核全系列、GD32 基于Cortex M核全列、NXP 基于Cortex M核全系列等。本教程将使用立创开发板GD32F407进行示例移植,其他 ARM Cortex M系列开发板和芯片移植方法类似。调试ARM Cortex M核还需要仿真器,如果您的开发板或者芯片模组没有板载仿真器,就需要连接外置的仿真器,如DAPLink。
OneOS Lite
OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统,具有可裁剪、跨平台、低功耗、高安全等特点,支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构,兼容POSIX、CMSIS等标准接口,支持Javascript、MicroPython等高级语言开发模式,提供图形化开发工具,能够有效提升开发效率、降低开发成本,帮助用户快速开发稳定可靠、安全易用的物联网应用。
OneOS Lite总体架构采用分层设计,主体由驱动、内核、组件、安全框架组成。采用一个轻量级内核加多个系统组件的模式,加上海量硬件的适配支持,使OneOS Lite 具备极高的可伸缩性与易用性。
OneOS系统特点
灵活裁剪:抢占式的实时多任务RTOS内核,支持多任务处理、软件定时器、信号量、互斥锁、消息队列、邮箱和实时调度等特性,RAM和ROM资源占用极小。可灵活裁剪,搭配丰富组件,适应不同客户需求。
跨芯片平台:应用程序可无缝移植,大幅提高软件复用率。支持的主流芯片架构有:ARM Cortex-A和Cortex-M、MIPS、RISC-V等。支持几乎所有的MCU和主流的NB-IOT、4G、WIFI、蓝牙通信芯片。
组件丰富:提供丰富的组件功能,如互联互通、端云融合、远程升级、室内外定位、低功耗控制等。同时提供开放的第三方组件管理工具,支持添加各类第三方组件,以便扩展系统功能。
低功耗设计:支持MCU和外围设备的功耗管理,用户可以根据业务场景选择相应低功耗方案,系统会自动采用相应功耗控制策略,进行休眠和调频调压,有效降低设备整体功耗。
安全设计:针对物联网设备资源受限、海量连接、网络异构等特点,在系统安全、通信安全、数据安全等方面提供多维度安全防护能力。
OneOS开发资料
OneOS源码开源地址
https://gitee.com/cmcc-oneos/OneOS
开发文档官网
https://os.iot.10086.cn/v2/doc/homePage
开发工具源码下载
https://os.iot.10086.cn/download/
开发工具OneOS_Cube
https://os.iot.10086.cn/download/tool
OneOS-GD32开发板测试
下载源码
git clone https://gitee.com/cmcc-oneos/OneOS.git
内核启动简单分析
内核启动主要有下面几个步骤:
1. 系统先从启动文件开始运行,然后进入 OneOS Lite的内核启动函数 os_kernel_init()和os_kernel_start();
2.os_kernel_init中调用k_run_init_call函数执行OS_INIT_LEVEL_PRE_KERNEL_1,进行内核启动前的第一阶段的初始化;
3. 初始化内核各模块,如tick队列,调度器,定时器等
4. 创建recycle,idle,timer,sys系统任务;
5. 启动调度器,最后会运行sys任务,sys任务调用k_run_init_call函数依次执行其他自动化宏注册的函数,最后调用main函数进入用户程序入口。
安装OneOS_Cube工具
OneOS-Cube工具地址 https://os.iot.10086.cn/download/tool
下载工具请点击OneOS-Cube下载
直接点击下载的OneOS-Cube工具进行安装,安装路径不支持含有中文和空格字符。
OneOS-Cube工具使用方法:进入到代码工程目录,任意空白处点击右键,再找到“OneOS_Cube”执行,即可打开OneOS-Cube的命令行操作界面。
这样OneOS-Cube成功启动了
OneOS-Cube常用的用户指令非常简单,OneOS 3.0及以上版本的常用指令简单介绍如下:
工程模板创建
创建工程
在OS源码根目录中,打开project文件夹。启动CUBE工具,输入创建工程命令 oos project
默认是STM32系列芯片,因此需要选择GD32芯片品牌系列型号等信息,按S键进行配置保存,按ESC键退出并开始生成工程代码。 在这里我们选择的立创天空星开发板对应的芯片,GD32F407VET6作为案例进行测试。
保存.config配置文件,ESC退出开始生成代码。
生成代码
编译代码
使用cube工具编译代码
需要切换到GD32F407VE的工程目录中,输入oos build命令,编译代码
使用MDK工具编译代码
输入oos init -i keil命令,选择Project工程,进行编译代码
修改代码
由于默认工程生成的代码与实际我们用到的板子是不一样的,因此我们需要进行修改,目前我们只修改立创天空星开发板板载的LED模块。将board.c代码中默认的LED的IO端口PA8修改成PB2.
在主函数添加部分串口打印代码,在操作系统内部一般使用os_kprintf进行打印功能,这个函数C库中printf功能一样。
#include <board.h>
#include "stdio.h"
static void user_task(void *parameter)
{
int i = 0;
for (i = 0; i < led_table_size; i++)
{
os_pin_mode(led_table.pin, PIN_MODE_OUTPUT);
}
while (1)
{
for (i = 0; i < led_table_size; i++)
{
os_pin_write(led_table.pin, led_table.active_level);
os_kprintf("gd32-lckfb bsp_led on \r\n");
os_task_msleep(500);
os_pin_write(led_table.pin, !led_table.active_level);
os_kprintf("gd32-lckfb bsp_led off \r\n");
os_task_msleep(500);
}
}
}
int main(void)
{
os_task_id task;
os_kprintf("gd32f407 lckfb-board hardware_init [ok] \r\n");
os_kprintf("gd32f407 lckfb-board 2024-07-28 [ok]\r\n");
os_kprintf("gd32f407 lckfb-board oneos-lite testing [ok]\r\n");
task = os_task_create(OS_NULL, OS_NULL, 256, "user", user_task, OS_NULL, 3);
OS_ASSERT(task);
os_task_startup(task);
return 0;
}
下载代码
理论上完成上面的操作就可以直接下载代码了,但是我在实际操作过程中发现下载程序没有任何反应,查找资料发现修改部分配置文件才可以。
参考文章 OneOS
输入oos config命令,进入配置工具,选择Drivers里面boot,配置部分东西。
修改boot里面的起始地址与size大小,这个东西和MDK-KEIL的配置差不多。
修改前:
修改后:
退出ESC,保存即可,重新编译即可。
第一种下载方法使用MDK-KEIL下载,简单方便,我这里使用的DAPlink进行下载。
下载完成效果,打印正常,shell正常,led正常闪烁。
第二种下载方法使用PyocD进行下载,使用的工具还是DAPlink。进入工程目录下面的out文件夹里面,输入两个命令进行烧录代码
pyocd erase -c -t gd32f407ve --config pyocd.yaml
pyocd load oneos.bin -t gd32f407ve --config pyocd.yaml
下载完成效果
总结
完成上面的移植之后,接下来就可以开始学习OneOS-lite的系统内核与设备驱动和物联网组件相关部分了,特别是设备驱动部分,这是精华部分,绝大多数的RTOS内核其实的大差不差,例如FreeRTOS,UCOS等,但是OneOS-lite提供了设备驱动层的东西,大量的利用面向对象的思想,这是值得学习。
OneOS Lite 提供了丰富的基础驱动支持,驱动部分通过对底层代码和厂家 SDK 的统一封装,以 device 设备的方式对外提供统一的接口和较为全面的协议支持,更便于客户上手开发。目前 OneOS Lite 已经支持了包括 STM32、NXP、MM32、HC32、GD32 等多个厂家及芯片平台,并且针对其不同系列做了深度适配,覆盖了常用的 GPIO、SPI、QSPI、ADC、DAC、CAN、I2C、ETH、SAI 等接口,同时配套了相关的协议和应用示例,如各类传感器、屏幕显示、网络链接、音频等,后续仍在不断丰富和完善,力求为客户提供一个便捷高效的开发环境。
设计原则
OneOS Lite 在各类外设的基础上抽象出了设备驱动模型,有效提高了代码可复用性、可移植性,模块分层解耦,降低了各层的开发难度。设备驱动框架设计遵循以下原则:
下层向上层提供统一的访问接口
分层设计,屏蔽硬件差异
每一层只跟其相邻的层建立联系
各层的作用如下:
系统调用接口提供统一的对外接口,实现对设备的访问。
设备管理层实现了对设备驱动程序的封装,向上对接系统调用接口。
设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。
设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能,它负责创建和注册设备。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_43599390/article/details/140748091
|