0.0 引言

嵌入式硬件抽象框架常常面临着这样的尴尬:封装层次较高的(arduino,mbed)不能充分暴露必要的API并面临着性能问题,封装层次较低的(HAL,LL)接口复杂且开发困难。近日发现的一个框架Chrome Embed Controller(下简称EC)较好地权衡了开发效率和运行效率,还具有其他的一些可贵的特性。先来看看EC的几个常用API:

  //GPIO declaration //GPIO(name, pin, flag)
), GPIO_OUT_HIGH)//declare as output
), GPIO_INPUT) //declare as input
 
); //set GPIO output
int input = gpio_get_level(GPIO_PC6); //read GPIO input
 
//initialize an i2c port
), GPIO_ODR_HIGH) // I2C port 1 SCL
), GPIO_ODR_HIGH) // I2C port 1 SDA
ALTERNATE(PIN_MASK(B, 0x00C0), GPIO_ALT_F1, MODULE_I2C, GPIO_PULL_UP)
const struct i2c_port_t i2c_ports[] = {
{, GPIO_I2C2_SCL, GPIO_I2C2_SDA},
};
const unsigned int i2c_ports_used = ARRAY_SIZE(i2c_ports);
 
//int i2c_write8(int port, int slave_addr, int offset, int data)
, 0x40, 0x2 + bank, 0x4C); //write u2c output
//int i2c_read8(int port, int slave_addr, int offset, int *data)
, 0x40, 0x6 + bank, & tmp); //read i2c input
 

怎么样,是不是比stdlib和HAL什么的简洁多了?作为一个为专门用途设计的框架,将EC用于通用开发的资料哪怕在国外也寥寥无几。本文首先是我自己探索EC过程中的笔记,更希望能让这样一个优秀且有巨大潜力的框架为嵌入式开发者所知、所用。

What's EC?

  • EC是较新的chromebook上用于硬件管理和启动引导的硬件
  • chromebook团队认为传统BIOS是bullshit,于是自己用通用嵌入式SoC实现了一个作为替代(所以不要对Google说you can you up, the do can and they will up)
  • EC也指运行在该硬件上的嵌入式程序框架,Google团队将其基于BSD License开源(后文中的EC多指该框架)
  • EC具有传统BIOS启动和引导OS以及硬件管理的功能,所以需要与CPU(也称AP,应用处理器)通信
  • EC还直接控制着chromebook上的诸多设备,如键盘,PMU,各种传感器等,所以集成了它们的驱动
  • 尽管EC原本设计用于chromebook,但可以直接移植到独立的MCU上,即我们可以将它用于自己的项目。这也是本文的主要目的。

How does EC works?

任务(Tasks)

  • EC并没有暴露程序入口点(main函数)。我们的程序需要以任务的形式交给调度器执行。
  • 和其他任务调度器一样,EC中的任务是函数
  • 任务有预设的优先级,并在中断时发生抢占
  • 用户把需要执行的任务声明在一个单独文件里

模块(Modules)

  • 模块就是封装好的各个功能单元,有程序体和对应的头文件
  • 既包括SoC上的外设(UART, SPI, etc.)又包括一些硬件设备(传感器,键盘,etc.),还有非硬件的控制逻辑(手势控制,SHA1,etc.)。
  • 通过头文件引入工程,含有初始化函数(配置使用前需要设定的一些寄存器)

控制台(Console)

  • EC使用I2C,SPI或LPC总线与AP通信,尽管EC实际上最终被映射成一个USB设备
  • EC的console执行用户在终端上发来的一些预定义的指令,可以是自带的或用户自定义的,包括打印运行状态,硬件操作和模块的一些操作等。每个模块的操作指令定义在独立的文件里。
  • EC可以直接通过控制台升级固件
  • 控制台也是一个模块,它在debug时可以提供极大的便利,在生产时若不需要也可以不引入

多平台适配(标题格式还想再挣扎一下)

  • 由于不同型号的chromebook使用不同种类的EC控制器,EC固件需要进行跨平台适配
  • EC巧妙设计的API允许用户只针对不同SoC做少量设定即可移植代码
  • 这些设定以宏定义的形式暴露给用户,包括系统时钟,FLASH和RAM大小等
  • 每个平台的设定被写入独立的config文件中
  • 注意:本教程以STM32为平台

Why EC?

  • Light and Fast

    EC不基于任何现有框架,而是直接对寄存器操作进行了一定层次的封装。这使得它甚至可以运行在32MHz/16kb RAM的STM32L151上——除非自己造轮子,这可能是现在最轻量的多任务嵌入式框架了。

  • 简明的API

    例如,要声明一个GPIO引脚,只需要写一行 GPIO(name, pin, flags) ,让GPIO_XXXX()、GPIO_Typedef啥的都见鬼去吧

  • 跨平台硬件抽象

    正如前文所述,EC是一个跨平台框架,目前已涉及意法STM32、德仪TM4、新唐npcx、Microchip mec1322等产品线,覆盖ARM cortex-m, cortex-m0, nds32等架构。EC将各平台上不同的底层操作封装成统一、高级、简洁的API供用户调用,实现了跨平台、高性能的硬件抽象。

  • 专长

    如果你正在寻找一个合适的方案来辅助高级SoC(比如AP)的启动和硬件管理,那EC无疑是你的极佳选择!EC集成了boot,电源管理,常见IO设备驱动等必要的功能,可以大大简化你的开发流程。又或者你想驱动一些只有在笔记本上应用较多的设备,这些库对于嵌入式MCU不太常见(e.g.触摸板,PD物理层,etc.),EC很可能包含了这些驱动。

  • Google,Yes!

    EC由Google团队开发和维护。EC为千万台chromebook产品提供底层支持。EC有完善的单元和闭环测试程序。EC迄今已有5年的历史,其间很好地证明了它可以胜任传统BIOS的工作并且做得更好。这几点保证了EC的代码质量和健壮性——相比之下,把个人建立和维护的封装库用在某些场合就显得不那么令人放心了。另外,EC的维护和更新至今仍然非常活跃,并且团队对于合并修改的请求的响应非常积极。

……But noting is perfect

你不能……

  • 使用堆

    EC的任务调度器的内存分配机制不允许使用动态内存。尽管如此,EC仍然提供了一个共享缓冲区(Shared Memory Buffer)——目前仅用于debug。实际上因为缺少MMU,降低的可靠性和高昂的开销,在嵌入式系统上使用动态内存一直不被建议。而禁用堆从根本上杜绝了内存泄漏,这在稳定性上带来的巨大提升使得副作用的一点点限制显得不值一提了。

  • ……以及那些并不是很通用的外设

    用作EC的MCU大多较为低端,所以很多高端MCU才有的功能并没有被EC实现或高层封装(e.g.DAC,FSMC,Ethernet,etc.),一些显然对于chromebook没用的功能也同样没有(e.g. CAN)。你可能想自己实现一些外设封装库,但要注意不要与EC的内存管理和资源锁机制冲突。

  • 没有一颗热爱折腾的心

    如果你对嵌入式开发毫无兴趣而只想make things work,EC极可能不是你的最佳选择。EC不是被设计用于通用嵌入式开发的,没有arduino、mbed等流行平台那样完善的生态和丰富的资源——实际上有关于使用EC进行通用开发的资料少得可怜。这意味着你需要自己实现每个EC未封装的功能并有相当的解决问题的能力。

……以及我个人的一点吐槽(TL;DR)

  • 泛滥的宏

    EC在宏的应用上简直称得上出(sang)神(xin)入(bing)化(kuang),例如GPIO的三种声明全都是宏函数你敢信?虽然知道在嵌入式系统上为了提升运行时效率这是常规操作,但读源码的时候我还是想【脏话】

  • 简单不简约

    虽然EC并没有mbed等平台那样的宏图壮志,但却有着不输任何框架的独创设计——"独创"在这里没有褒义。EC使用枚举来声明引脚和任务,使用数组来声明外设,与主流框架使用函数的声明风格相比显得特立独行。尤其是任务和引脚的声明都需要写在独立的文件里,应该是出于被多个文件依赖和增加可维护性的考虑。这样的设计似乎有点声明式的味道,可能有更好的性能,也可能是为了简化针对多任务的统一资源管理的妥协。但无疑的是,这种集中的静态的声明风格损失了灵活性,增加了代码移植和进一步封装的难度,并产生了额外的学习负担。

  • 向上污染的底层特性

    EC的封装为我们省去了大量繁琐的初始化和配置等操作,但恼人的底层特性仍有部分残余,比如基于位操作的配置和令人眼花缭乱的16进制常量。可以通过添加一些简单的宏摆脱这些麻烦,不知为什么已经大面积使用宏的EC没有这么做。更致命的是,这些大量的宏给进一步的高层封装带来了巨大的困难,实际上除非从底层重构,我想不出在接口中完全消除这些宏的办法。

参考资料

Chrome EC框架探索_0.0_引言的更多相关文章

  1. Chromium EC框架探索 1.1 开发环境搭建

    1.1 开发环境搭建 本节参考官方文档getting started building ec images quickly编写本节介绍搭建ec开发环境的两种方式,后一种对于绝大多数人而言是不必要的. ...

  2. Unity3D for VR 学习(2): 暴风魔镜框架探索

    学习一个新技术,有三个法宝: 法宝1: 掌握厂家提供的用户API手册 法宝2: 掌握厂家提供的demo样例 法宝3:<每个研发人员都应树立的一个demo模式> 故,学习魔镜4技术,亦如是也 ...

  3. 基于 webpack 的 chrome 扩展开发探索

    起 最近利用闲暇时间在进行一款 chrome 扩展 V2EX-HELPER 的开发(如果巧遇 V 友欢迎试用),今天把它彻底改成了用 webpack 打包依赖的模式,不由得感概 webpack 的强大 ...

  4. chrome性能测试框架webpagereplay

    今天学习了下chrome的性能测试框架,其实它可用于在稳定的环境下测试浏览器向服务器发起http请求至下载请求文档到本地的这个过程.好处在于,其原理在于先将第一次请求回来的文档下载在本地,然后在本地模 ...

  5. Web自动化之Headless Chrome测试框架集成

    使用Selenium操作headless chrome 推荐 简介 WebDriver是一个W3C标准, 定义了一套检查和控制用户代理(比如浏览器)的远程控制接口,各大主流浏览器来实现这些接口以便调用 ...

  6. ASP.NET Core框架探索(一)

    今天我们来结合源码来探究一下ASP.NET CORE Web框架的运行原理. 可以先整体看一下下面这张基于源码分析过程的一个总结大纲,包含各环节完成的关键步骤: 下面我们将一起来结合源码探索启动一个A ...

  7. ASP.NET Core框架探索之Authentication

    今天我们来探索一下ASP.NET Core中关于权限认证,所谓权限认证,就是通过某些方式获取到用户的信息. 需要开启权限认证,我们首先需要在容器中注入认证服务,使用services.AddAuthen ...

  8. ASP.NET Core框架探索之Authorization

    今天我们一起来探索一下ASP.NET Core框架中的Authorization.我们知道请求进入管道处理流程先会使用Authentication进行用户认证,然后使用Authorization进行用 ...

  9. dubbo框架----探索-大型系统架构设计(图解)

    对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) ...

随机推荐

  1. 腾讯入股Snap,能救“阅后即焚”的命吗?

    ​ ​   互联网社交的强大包容性,让各种社交形式都能有着较多的受众群体.普适性极广的QQ.微信."脸谱":专攻陌生人社交的陌陌:让人们发布意见的微博--当然也少不了"阅 ...

  2. uploadifive如何动态传参

    直接上代码 关键:$('#file_upload').data('uploadifive').settings.formData = { 'ID': 'ceshi'}; //动态更改formData的 ...

  3. bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白

    bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白 $("#sel_userName").selectpicker({ "w ...

  4. Java 设置Excel数据验证

    数据验证是Excel 2013版本中,数据功能组下面的一个功能,在Excel2013之前的版本,包含Excel2010 Excel2007称为数据有效性.通过在excel表格中设置数据验证可有效规范数 ...

  5. 大厂面试官问你META-INF/spring.factories要怎么实现自动扫描、自动装配?

    大厂面试官问你META-INF/spring.factories要怎么实现自动扫描.自动装配?   很多程序员想面试进互联网大厂,但是也有很多人不知道进入大厂需要具备哪些条件,以及面试官会问哪些问题, ...

  6. 实用的Python(3)超简单!基于Python搭建个人“云盘”

    1 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类似 ...

  7. JMeter-WebService接口的测试

    前言 JMeter3.2版本之后就没有SOAP/XML-RPC Request插件了,那么该如何进行webservice接口的测试呢? 今天我们来一起学习一下怎么在3.2以后版本的JMeter进行we ...

  8. p2.js 与 createjs 的组合应用

    开始前简单说下其他几款js物理引擎 box2d老牌,功能全面,但是效率低下,移动端基不用考虑的 matterjs  效率目前我测试下来最高,但是依然还在开发中(好像还很缓慢),目前功能局限,而且有bu ...

  9. SVG 新手入门

    svg 入门新认知 一.第一步创建设置svg <svg width="100%" height="500"> </svg> 设置粗细 5 ...

  10. LaTex公式符号

    下面这个网站是我认为比较齐全的网站 http://www.mohu.org/info/symbols/symbols.htm