AliOS Things 基于组件化思想的多bin特性

今年杭州云栖大会上,AliOS Things正式发布,其中有一个基于组件化思想的多bin特性,这是AliOS Things有专利保护的多bin fota升级解决方案核心。随着我们不断的版本迭代,这里很高兴和大家分享下多bin基于AliOS Things v1.1.2版本的具体实现。这里我主要以"两个W(what、why)、一个H(how)"来展开。

What -- AliOS Things多bin特性是什么

AliOS Things v1.1.2版本实现的多bin版本(实现的是三bin方案,分为kernel、framework、app bin),主要是指AliOS Things基于组件化思想能够独立编译、烧录、OTA升级kernel、framework、app bin,这三部分通过syscall来实现彼此的函数调用,syscall是在扁平地址空间中通过访问函数数组来实现的。

       fsyscall                 ksyscall

app ------> framework ------> kernel

如果有反向调用的需求,可以使用函数注册方式来实现。

Why -- 为什么需要AliOS Things多bin特性

AliOS Things 多bin特性到底能够带来什么好处呢?物联网设备数量众多,模组种类也繁杂,芯片厂商、模组厂商、终端厂商开发者都有自己的侧重点,但是对AliOS Things来讲,我们希望让芯片、模组厂商降低硬件成本,让终端厂商开发者简易开发,专注于应用软件的开发,而多bin特性就是为此服务的。

总结来讲,AliOS Things核心利益点就是“减成本、利开发”,具体如下:

  • AliOS Things拆分kernel、framework、app bin,支持细粒度fota升级,减少ota备份空间大小(甚至可以做到0备份空间升级),有效减少硬件flash成本
  • 芯片厂商、模组厂商预置测试稳定的kernel、framework版本,开发者购买阿里云市场中的模组解决方案,专注于开发app即可

下图更直观的展示了单bin和多bin版本在fota升级上的硬件flash消耗对比:


How -- 如何实现AliOS Things多bin特性

上面我们了解了什么是AliOS Things 和AliOS Things 多bin特性的好处,那AliOS Things 多bin特性是如何实现的呢?AliOS Things多bin特性基于AliOS Things的组件化思想,组件化思想是指各个组件之间解耦,组件之间仅通过暴露出来的api接口进行交互,这样子就可以动态调整组件的位置。多bin特性就是在保有基本组件的基础上(如内核组件必属于kernel模块),动态调整其他组件来实现fota升级空间消耗的最优化(比如cloud组件可以动态在kernel、framework模块间切换,如果要最小ota备份区间,可以调整组件使得kernel、framework bin的codesize维持差不多,因为ota备份空间取kernel、framework、app bin的最大值)。

接下来我们具体分析下AliOS Things的多bin特性实现:

1、首先对组件类型要进行区分:

在AliOS Things编译体系的组件makefile 中增加了$(NAME)_TYPE变量,标明组件的类型,各个bin包含哪些组件类型如下:
$(NAME)_TYPE: app、framework、kernel、app&framework、framework&kernel、app&kernel、share(三bin共享)、默认
app bin: app、app&framework、app&kernel、share、默认
framework bin:framework、app&framework、framework&kernel、share
kernel bin: kernel、app&kernel、framework&kernel、share
注意:framework、kernel组件理论上必须标明组件类型,app组件可标可不标

2、Syscall函数调用方式说明:

AliOS Things 多bin特性的syscall方式是在扁平地址空间中的函数数组访问,而且在基于组件化的思想下,syscall是分布在各个组件中,可以灵活配置成syscall函数或者取消,使用宏来标识需要暴露的syscall接口,因为syscall接口是kernel暴露给framework、app或者framework暴露给app的,故在kernel和framework模块的组件中使用AOS_EXPORT宏来进行标识:

#define AOS_EXPORT(ret,fun,argstype...)

参数说明:
ret:返回值类型
fun:函数名
argstype:参数类型,中间用逗号分隔
示例:

Int aos_get_hz(void)
{
return RHINO_CONFIG_TICKS_PER_SECOND;
}
AOS_EXPORT(int,aos_get_hz, void);

使用注意点:
1、宏支持的可变参数类型前面必须是格式化参数项;
2、函数指针类型参数,请去掉fn,如int (*fn)(char *, int)
3、宏不支持在头文件中定义,必须在.c文件中定义,如果只有库文件,没有头文件,请把函数的宏放置在kernel模块或者framework模块的syscall文件中,分别是syscall_ktbl.c和syscall_ftbl.c

对AOS_EXPORT宏的解析是在编译过程中调用python脚本解析的,根据用户设定的宏参数,生成ksyscall和fsyscall的syscall数组和对应函数文件,脚本自动生成的文件在out/syscall目录下。

3、多bin相关文件及调用方式:

AliOS Things 多bin特性分别包含了kernel/ksyscall、framework/fsyscall、app/usyscall三个目录:
ksyscall:kernel syscall函数的数组文件
fsyscall:framework syscall函数的数组文件和kernel syscall函数在frame中的实现
usyscall:fsyscall函数在app中的实现
以mk3060芯片相应组件为例说明组件在各bin中分布以及多bin启动过程说明:

python脚本解析AOS_EXPORT宏,自动生成相应的syscall文件,如下图说明kernel、framework、app目录中的syscall文件以及脚本生成在out目录下的对应文件:

用户在移植多bin特性的时候,因为多bin特性可以单独编译,需要增加kernel、framework、app的ld链接文件,并对相应的空间布局做相应的调整。

小结

AliOS Things 多bin特性致力于 降低硬件成本,让应用开发者更高效开发。多bin特性随着版本在不停迭代,希望有更多开发者参与其中,让多bin特性更简洁、高效、好用,让多bin特性在实际场景中发挥更大作用,致力于AliOS Things生态发展。有什么需求或者指教,欢迎访问github官网:https://github.com/alibaba/AliOS-Things

时间: 2024-08-03 12:42:17

AliOS Things 基于组件化思想的多bin特性的相关文章

android 快速开发框架,基于组件化的MVP结构

AndroidMouldProject2 android快速开发模板工程,组件化的MVP结构,方便快速开发和多人协作,减少代码耦合,同时方便自定义扩展,封装了一些常用 的模块,通过引用AndroidBaseModule基础工程的方式来实现持续更新,同时通过依赖库的方式,增强个性化定制,使工程更加 简洁,使开发者只需要关心自己的逻辑实现,便于维护. 项目结构: 使用方法: 复制代码,修改包名,按照自己的需求更改代码逻辑和依赖关系 新建activity,fragment,model,view,pre

发扬EJB,Spring思想将组件化进行到底

EJB.Spring,这不是Java界最有名的两大冤家,何以把它们扯在一起.其实Spring乃是EJB1.x.2.x的继承者,正如EJB之前的COM.CORBA.他们的思想一脉相承,那就是企业级的组件化思想,也可称之为理想! 一.非组件化的国内软件行业 各个行业的企业总有一些核心业务,长久保持不变,新时期的新业务基本上都是围绕核心业务展开.很长时间以来,IT技术的变化与企业业务的扩展存在着很大的矛盾.当企业的新业务开展之后,如何保证原有业务稳定运行的同时,新业务能够得到IT的支持与扩展?当IT技

发扬EJB、Spring思想将组件化进行到底

EJB.Spring,这不是Java界最有名的两大冤家,何以把它们扯在一起.其实Spring乃是EJB1.x.2.x的继承者,正如EJB之前的COM.CORBA.他们的思想一脉相承,那就是企业级的组件化思想,也可称之为理想! 一.非组件化的国内软件行业 各个行业的企业总有一些核心业务,长久保持不变,新时期的新业务基本上都是围绕核心业务展开.很长时间以来,IT技术的变化与企业业务的扩展存在着很大的矛盾.当企业的新业务开展之后,如何保证原有业务稳定运行的同时,新业务能够得到IT的支持与扩展?当IT技

AlloyTeam:致我们终将组件化的 Web (多图)

这篇文章将从两年前的一次技术争论开始.争论的聚焦就是下图的两个目录分层结构.我说按模块划分好,他说你傻逼啊,当然是按资源划分. "按模块划分"目录结构,把当前模块下的所有逻辑和资源都放一起了,这对于多人独自开发和维护个人模块不是很好吗?当然了,那争论的结果是我乖乖地改回主流的"按资源划分"的目录结构.因为,没有做到JS模块化和资源模块化,仅仅物理位置上的模块划分是没有意义的,只会增加构建的成本而已. 虽然他说得好有道理我无言以对,但是我心不甘,等待他日前端组件化成熟

DotNetCore跨平台~组件化时代来了

进行dotnetcore之后,各种对象都是基于DI进行生产的,这就有了对象的生命周期一说,早在autofac里也有相关知识点,这与Microsoft.Extensions.DependencyInjection是完全温和的,方便大家理解,在讲今天的组件化之前,先对DI的三种生命周期进行理解一下: AddSingleton:单例,进程内它是唯一的 AddTransient:瞬息,在对象在当前环境内,作用域内是唯一的 AddScoped:请求,对象在一个HTTP请求内是唯一的 下面来看今天的组件化的

Android开发:由模块化到组件化(一)

在Android SDK一文中,我们谈到模块化和组件化,现在我们来聊聊组件化开发背后的哪些事.最早是在广告SDK中应用组件化,但是同样适用于普通应用开发. 以下高能,请做好心理准备,看不懂请发私信来交流.本文不推荐新手阅读,如果你刚接触Android开发不久,请立刻放弃阅读本文. 模块化和组件化 模块化 组件化不是个新概念,其在各行各业都一直备受重视.至于组件化什么时候在软件工程领域提出已经无从考究了,不过呢可以确认的是组件化最早应用于服务端开发,后来在该思想的指导下,前端开发和移动端开发也产生

XCoreRedux框架:Android UI组件化与Redux实践

XCoreRedux框架:Android UI组件化与Redux实践 @author: 莫川 https://github.com/nuptboyzhb/ XCoreRedux源码+Demo:https://github.com/nuptboyzhb/XCoreRedux 使用android studio打开该项目. 目录结构 demo 基于xcore框架写的一个小demo xcore XCoreRedux核心代码库 pics 文档的pic资源 前言 Android开发当中的Code Archi

一、Angular 2.0的变革之路-组件化 Web Components

Angular 2.0的变革之路 Angular 1.x从2009年到现在已经过了6个年头,虽然中间Angular1.x顺应前端思想加入了很多新的特性,例如在1.3版本加入的bindToController,在1.5版本加入的用于取代directive部分功能的component.然而从整体的设计思想来说,Web Components已经成为大势所趋,Angular的变革也就势在必行. Angular 2.0 放弃了对1.x版本的兼容,这也就意味着2.0版本没有了1.x版本的历史包袱.Googl

详解vue.js组件化开发实践_javascript技巧

前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然成为了第一个问题.鉴于目前web前端mvvm框架以及组件化开发方式的流行,决定技术栈采用:vue + es6 + 组件化. 这里首先简单说下web前端组件化开发方式的历程: 最早的组件化结构,代码结构可能如下: - lib/components/calendar |- calendar.css |-