i51

i51跨平台中间件
授权协议 GPL
开发语言 C/C++
所属分类 手机/移动开发、 手机开发包
软件类型 开源软件
地区 国产
投 递 者 权弘新
操作系统 跨平台
开源组织
适用人群 未知
 软件概览
在某一些操作系统中因为没有“Application Programming Framework(以下简称APF)”,因而给应用开发者带来了很多不便之处,在这种平台下开发产品只能把应用程序的代码跟系统代码放在一起编译,并最终将IMG烧录到设备上才能得以验证。这种开发模式的最大问题在于效率极低,比如当我们要真机调试时,哪怕是只修改了一个log,你也必须得重新编译整个系统,非常耗时。相比之下,Android的开发就简单多了,开发者可以基于Android SDK,或第三方开发框架做交叉开发,PC端基于仿真器调试APP,真机端发布APP也很简单,只需要将APP文件放入T卡即可。这也正是“智能手机”的定义:“用户可以任意安装删除应用程序”,按照这个定义来说“i51”就是一个可以让平台智能化的技术。
“i51”就是在这个技术背景下产生的,所谓让“用户可以任意安装删除应用程序”是一种很产品化的描述。作为一个技术平台的设计方,除了要满足产品满足市场的需求之外, 必须要把在这个平台上的产品开发体验考虑在内,所以说它对应用开发者必须具备良好的编程体验,例如开发一个APP还要让开发者配置一大堆脚本,背熟一大堆命令,这种繁琐啰嗦的体验就非常不好了。对应用程序来说要跟操作系统无关,这样才可能降低维护跟运维的成本,而对技术平台本身的维护方面,它应该尽可能的减少需要移植的代码,结合这几点“i51”需要有跨平台能力。i51的跨平台思路很简单,我们在系统底层搭起了与系统无关的抽象层,它的实现是一百多个API,上层只对这些API编程,自然就做到了平台无关了。原理是很简单的,但要从多个具体系统中设计出这一百多个抽象的API是件很有挑战性的工作,就这些抽象接口设计我们大概反反复复做了2个多月才最终定型。我们印象最深的是MMI模块的音频播放部分,这类接口在不同的系统中差异都非常大,比如有些是异步的,有些是同步的,并且参数各有差异。虽然就是设计若干接口的事情,可直到i51都已经上线半年后我们才算有了一个完美的声音播放方案,跨平台的设计难度就在这。
概括来说“i51”由两部分组成,(一)为了实现跨平台“APF”,我们在操作系统中内置了一个中间件,它的主要功能是加载跟管理上层的“i51应用程序”,它的核心是“动态加载技术”,并且中间件本身也是基于抽象接口开发的,因此它也具备跨平台能力,这样我们的移植工作变得非常简单了。(二)“APF”是一种框架,或者说是应用程序开发所要遵循的规范,它的实现并没有很多实质性内容,无非就是定义“i51中间件”与“i51应用程序”之间如何交互,如何传递消息等等。定义好“APF”后,我们在此基础上开发了大量 “i51 Software Developing Kit”(俗称SDK),它可以帮助开发者更方便的开发产品,比如为了让i51的应用程序具备更好的表现力,我们开发了自己的物理引擎跟粒子系统,它的表现力满足了我们在ARMv7&ARMv9上的需要。
引用Jelo的话:
“i51是一整套解决方案,下到应用加载、卸载、消息机制、应用程序管理。上到SDK、模拟器、编程框架、各类工具、运行库应有尽有。这个i51是我们公司的核心技术,现在这个技术用不上了,我就申请拿出来开源了,老大一口就同意了,很感动。好处是,这是个商用技术,可靠性完全靠谱,这个技术还申请了广东省科技局的创新基金作为创新鼓励。
对了,我们现在主要用在了MTK、Mstar、展讯、互芯上做了移植,性能靠谱。系统资源普遍在800KB左右,ROM只用35 KB。CPU是ARM7、ARM9居多。”


接下来我们从架构的角度系统地做一下解读,如上图 “i51”是在底层操作系统基础上搭建起来的一个中间件平台,它为应用层提供了统一的、系统无关的编程接口,它的跨平台性可以让应用团队无需关心操作系统的差异,较好地控制了各个环节的复杂度,因此“i51”应用程序可以运行在所有具有“i51”中间件的设备环境中。
i51体系结构其架构由“Dynamic Components Layer”、“Static Components Layer”构成,动态层中的“对象”具备高度灵活特性,应用程序的发布不受操作系统束缚,并且相关编程框架为应用开发提供了统一且平台无关的编程接口。而,静态层与动态层的特点正相反,它的作用是屏蔽操作系统特征,并为动态层提供最基本的运行时机制,因为这一部分较少变化,所以它的实现通常作为内置代码嵌入到设备的ROM之中。
§ Applications
i51体系的动态层只有一种应用程序,它的实现受“i51编程框架”约束。应用间处于平级关系,所谓平级是指应用间相互独立、不存在依赖关系。另外, 应用程序之间的交互基于静态层提供的“消息机制”完成,整个交互过程受静态层监管。
§ Dynamic Library
“动态库”是操作系统中非常核心的技术,在i51中同样将其作为了体系结构的核心特性,它的价值主要体现在应用层,基于动态库,应用程序生命周期的三个阶段:开发、部署、维护都是完全可重构的,例如按照业务逻辑将应用程序划分多个动态库,当业务发生变化时只需要替换相关动态库即可,而在传统的静态库做法中,一旦业务逻辑发生了变化整个应用必须要重新经过“开发”、“部署”、“维护”三个阶段方可完成业务更换。
§ Static Applications
“静态应用”简称SAP是位于静态层的一组应用程序,因为它跟i51体系的具体实现有关,因此其功能特征在体系结构中并不作限制,开发者可根据不同需求定义这组应用的特征。 § Kernel “内核”负责应用管理、进程管理、资源管理、进程通信等工作。严格来说它也是一个“静态应用”,区别在于它与业务逻辑无关可作为一个体系结构中的标准化部件,如果将其泛化将很难保证体系结构在机制层面的完整,因此它的功能特征必须标准化,开发者需要以此为依据严格实施。
§ SL-API 全称是“Service Logical API”,一组与业务逻辑有关的接口集合,该接口集同时对静态层以及动态层开放,但是其功能特征在体系中同样不做任何约束,开发者可以根据不同需求实现。
§Adapter
“适配器”为上层屏蔽了操作系统特征,提高架构整体的维护性,其接口定义、功能特征作为体系标准化内容实施。
运行时性能
基于内存快照技术,使应用间可无缝切换,并支持多应用同时执行。基于动态库技术,一个应用可以有多个动态库组成,而动态库可以由应用任意装卸,简化了应用间的关系。
维护性能
所有业务逻辑屏蔽在动态层,由开发者通过应用程序或动态库实现。动态库基于适配器实现,使应用程序开发框架具有平台无关性。
若干技术创新
1. 多任务,同一时段可同时加载多个应用程序;
  • 多应用可以用来做什么呢?举个例子,比如爱疯的“推送”机制,或PC的各种“弹窗”,无论用户在做什么系统时不时地总会有一个“对话框”告知用户世界又发生了什么,而基于“i51”的多应用机制开发者也可以走得更远。
2. 动态库,降低了产品开发以及代码维护的复杂度;
  • 动态库的好处实在是太多了,在产品设计、进度管理、架构设计、代码实现各个阶段都有体现。
  • 对产品设计来说,可以把软件“界面”或游戏 “地图”按照不同的动态库实现,有效节省内存、对于后期的升级来说也更具灵活性。
  • 对进度管理来说,动态库更直观、容易感知。
  • 对架构设计来说,动态库可以简化系统复杂度,架构中的“模块”基于动态库实现,模块之间的交互仅通过接口完成。
  •  对代码实现来说,模块基于动态库实现,开发者可以把所有注意力放在自己的模块上,涉及到模块间交互的时候只需要调用彼此的接口。
3.   跨平台,编译一次多处运行;
  • 对产品开发的好处是,团队可以只关心一个“代码版本”。
  • 对产品运营来说,可以只关注一个“平台”。
  • 总之,省时、省力、省钱、高效。
4.   傻瓜轻量级SDK,开发快速、友好、易用、优雅,接口的命名上足以显示技术控在细节上的追求;C/C++开发;可定制其它开发语言。
  • 有多快速?以“HelloWorld”为例,新建一个“Win32 Console”工程到编译生成“执行文件”需要40秒。而新建一个“i51”工程到编译生成“执行文件”只需要20秒。整个开发过程完全可视化操作,“i51”可视化编程不需要人工敲打各种不友好的“脚本”、“命令”。
  • 专为Soft-Rending设计的游戏引擎,以PNG为例,i51图像的绘制效率是PNG的几十倍。以一张带透明色的320x480图片为例,用PNG 绘制需要十五万三千六百次数值比较运算,大约七万六千八百次赋值运算。而“i51”的图像技术,不需要一次像素比较运算,赋值运算大约也仅有一千六百次。在内存开销方面,一张320x480的图,PNG解码后需要300KB内存存储,而i51的图像解码后只需要150KB。
5.  自动化测试工具。
  • 覆盖“文件系统”、“内存系统”、“短信”、“电话”、“网络”、“输入法”、“Benchmark”,提高测试人员的工作效率。
6.   敏锐的内存管理系统。
  •  可侦测“内存溢出”、“内存泄露”,为开发者解决C语言那令人纠结的内存调试问题。
7.  内存快照技术。
  • 可永久记录应用程序使用的内存数据,等下次启动时会被“i51”自动恢复,对应用程序来说感觉就像没退出过一样,断电关机无妨。
8.  中间件体积。
  • Only 35 KB ROM!!!
架构设计
* 王全伟(jelo.wang@gmail.com),热爱开源,零八年至今发起并独立完成析码编译器核心的开发,并于同年创立突壳开源社区(TOK.CC),至今已完成正则表达式引擎(REEC)、arm-elf动态链接器、i51、ELL、Hello3D等开源项目。技术完美主义者,现任深圳豆游网络首席技术官。
开发团队
* 王全伟,负责“Kernel”的开发,QQ:66970490;
* 颜天显,负责“MTK Adapter”的开发,QQ:1093235028;
* 吴平,负责“MTK Adapter”的开发,QQ:273357112;
* 吴练,负责“SPRD Adapter”的开发,QQ:471648306;
* 向荣,负责“SPRD Adapter”的开发,QQ:502495295;
* 苏言华,负责“SPRD Adapter”的开发,QQ:370532256;
* 史龙龙,负责“MStar Adapter”的开发,QQ:410886148;
* 林可,负责“MStar Adapter”的开发,QQ:112140555;
* 田敏,负责“MStar Adapter”的开发,QQ:470373759;
* OSCA,负责“MStar Adapter”的开发,QQ:45594280;
* 李雪峰,负责“i51 SDK”的开发,QQ:273642539;
* 叶盼,负责“i51 SDK”的开发,QQ:450763942;
  • 1.LED基本操作 当LED端口置低电平时LED点亮(有的单片机是置高电平点亮,根据单片机原理图进行判断) 点亮8个LED(接单片机P1口) void bsp_LedOn(void) { P1 = 0X00; } 熄灭8个LED void bsp_LedOff(void) { P1 = 0xff; } 流水灯操作 unsigned char i = 0; unsigned cha

  • 基本概念 51系列单片机的每个端口都是8位准双向口,共占32位引脚。每个端口都包括一个锁存器(一个D触发器构成)、一个输出驱动器和输入缓冲器。在无片外扩展存储器的系统中,这4个端口的每一位都可以作为准双向通用 I/O 端口使用。在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口分别作为低8位地址线和双向数据总线。 数据的传送方式 (1)同步传送 无条件传送。外设工作速度非常快或非常慢时宜

  • 说明:这里采用使用IO模拟的方式来实现I2C 点击这里下载SGP30测试源码及数据手册 /*SGP30传感器初始化函数*/ void SGP30_Init(void) { Start_I2c(); //启动I2C总线 SendByte(SGP30WAddr); //发送SGP30传感器写地址 SendByte(0x20); //发送命令(0x2003|SGP30_IAQ_init)

  • 在51单片机上实现I2C通信 代码较复杂,跟着老师来都会比较混乱 #include<reg52.h> #include<intrins.h> #define uchar unsigned char sbit dula = P2^6; sbit wela = P2^7; sbit SCL = P2^1; sbit SDA = P2^0; void time0Init(); void displ

 相关资料
  • 多平台支持 Mpx支持在多个小程序平台中进行增强,目前支持的小程序平台包括微信,支付宝,百度,qq和头条,不过自2.0版本后,Mpx支持了以微信增强语法为base的跨平台输出,实现了一套业务源码在多端输出运行的能力,大大提升了多小程序平台业务的开发效率,详情可以查看template增强特性 不同平台上的模板增强指令按照平台的指令风格进行设计,文档和代码示例为了方便统一采用微信小程序下的书写方式。

  • 我需要在我的应用程序中为不同的标签指定不同的FontFamily。我需要使用默认字体(如Android的Roboto和iOS的Helvetica)及其修改(如轻、中、粗)。据我所知,我应该使用Roboto-Light和Helvetica-Light来获得字体的轻版本(中号和粗体相同)。除了这个需求之外,我还需要在XAML中设置字体(如文档中所描述的),所以我最终得到了以下代码 然而,在Androi

  • 作为第三代数据统计和分析平台,诸葛实现了对用户的实名(实账号)分析,并主张互联网产品分析以用户为中心的分析思想并提供了一系列方法论。对用户的唯一标识来源于企业自身数据库对用户的唯一识别符,也即诸葛底层数据采集是以用户为中心的采集,我们提供了跨平台分析版本, 满足企业以用户为中心的整体的分析需求,不同平台相同业务价值下的用户完整的故事解读(例如:分析电商的用户在PC端浏览产品,在移动端支付的转化率)

  • 说明 由于在跨端开发中,必不可少的会遇到不同端需要有不同实现的情况。参考滴滴chameleon中的多态,megalo中实现了类似的跨平台兼容方案。需要使用时,请保证@megalo/target的版本号大于或等于0.7.2。 js的跨平台兼容 megalo中下面两种形式的引用会被特殊处理: [path-to-name]/[name]/index.mpjs [path-to-name]/[name]

  • 问题内容: 我正在使用以下代码在Linux / OSX上为Python库隐藏stderr,但我不控制默认情况下写入stderr的Python库: 是否有一个简单的跨平台替代/ dev / null?理想情况下,它不会消耗内存,因为这是一个长期运行的过程。 问题答案: os.devnull怎么样?

  • 问题内容: 我想在Unix和Windows上使用特定于平台的目录。请看一下代码: 这个输出 我想第二次打电话给(windows)类似 是否可以告诉我在Windows上运行的程序使用Windows分隔符?还是应该始终将反斜杠转换 为正斜杠()?这里首选的策略是什么? 问题答案: 我看到“问题”在哪里。在golang-nuts上的讨论为我提供了提示,该提示始终使用并且是用于依赖平台的操作的函数。 在W

  • 问题内容: 我有一个在后台运行的C ++进程,该进程很少会生成“事件”,因此在同一框中运行的Python进程将需要拾取。 C端的代码必须尽可能轻巧。 Python端是只读的。 实现必须是跨平台的。 发送的数据非常简单。 我有什么选择? 谢谢 问题答案: zeromq-仅此而已。将消息编码为字符串。 但是,如果要使用protobuf从库中进行序列化,它将为Python和C ++生成类。您可以在任一端

  • 问题内容: 我想开发一个跨平台的应用程序。 Java是跨平台的吗?我的意思是,我可以在Windows中开发Java应用程序并在Mac OS X和Linux中使用它吗? 如果是,怎么办? 我发现用Java编写的应用程序有两个安装文件,一个用于Windows,另一个用于Mac。 这使我感到困惑。 任何插图或建议将不胜感激。 问题答案: Java是跨平台的吗? 从某种意义上说,Java是跨平台的, 即已