无招胜有招-代码解读阿里开源芯片平台无剑100
今年以来我国IT厂商都在A lot的底层平台建设方面可谓是捷报频传,在操作系统方面有如像腾讯的Tiny OS、阿里的Ali Things OS3.0纷纷进行了开源;在数据库方面国产的时序库TdEngine在开源后也在Github上占据榜首位很久,在芯片方面阿里平头哥半导体公司也有很多大手笔,先是在今年7月底发布的玄铁910处理器,这款CPU基于RISC-V的基础架构,有16个core,使用12nm制程工艺,最高主频2.5GHZ,功耗仅0.2瓦,超越行业主流性能30%。
而在今年刚刚结束的世界互联网大会上,平头哥又现场宣布推出开源的MCU平台:无剑100 Open,包含了玄铁处理器、基础接口、开发环境,OS等。无剑芯片平台希望能把整个芯片的研发周期缩短50%,把开发成本降低50%,被阿里定位为面向下一代的AIoT产品的平台。
什么是MCU
MCU(Micro controller Unit)暨微控制单元,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把CPU、内存、定时器以及主板的大部分接口及总线功能(USB、A/D转换DMA)全部整合在一块芯片上,形成芯片级的计算机,以降低总体成本及功耗,可以在不同的应用场合做不同组合控制。在各类遥控器、汽车、步进马达、机器手等lot设备上,都可见到MCU的身影。
MCU之所以特别适合Alot其主要原因在于多数物联网终端对于性能都没有太高要求,整合相应外设模块,不但节约成本功耗,也不会产生散热问题,特别适合使用all in one理念进行设计。
比如本次开源的MCU其CPU、内存及主要外设的规格如下:
CPU 部分
- 32位通用CPU E902
- VIC
- 支持64层中断嵌套
- 每个中断都有独立的优先级
- 内存
- 64KB ISRAM 和 3×64KB DSRAM
- 外围特性
- DMA控制器*1
- 16通道
- 定时器*8
- 连接在APB0和APB1总线上
- 32位计数宽度
- 支持自由计数和用户自定义计数两种工作模式
- GPIO (×1)
- 连接在APB
- 支持32位宽度
- 支持中断生成
- DMA控制器*1
代码解读平头哥的MCU
笔者发现无剑100( Github地址是https://github.com/T-head-Semi/wujian100_open),
开源的这一周时间里,我国各大技术社区都只见报道,却没有技术类文章对其源代码进行解读。由此可见全国各界都在在大力呼吁国产芯片跨跃式发展,但是其实整个行业对于芯片方面的知识储备却是不太充足。当我们真的有了开源的芯片却没有技术社区对其进行解读,未免是件憾事。
不过要想完整了解MCU芯片的代码,需要具备硬件电路设计、驱动程序及操作系统内核等方方面面的知识,这里笔者仅选取一个侧面带大家来看看这款MCU的定时器是如何工作的。
从整体上看计时器或者其它硬件与操作系统的关系如下图:
可以看到用户调用操作系统的服务,而系统服务再调用驱动,驱动再对相应硬件进行操作,以完成功能,哪怕是一个小小的计时器,如果想了解全貌也是相当的不易。不过好在阿里本次开源的比较彻底,上述代码也是一应俱全,下面我们依次展开来为大家解读。
硬件逻辑部分
无剑100平台的硬件Verilog描述源码都在https://github.com/T-head-Semi/wujian100_open/blob/master/soc目录下。
简单介绍一下Verilog语言,Verilog是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
可以看出Verilog是一种专门用于硬件描述的语言,有一定的编程知识及数字电路基础学习起来并不麻烦,本次要介绍的计时器的硬件源码在https://github.com/T-head-Semi/wujian100_open/blob/master/soc/tim.v,节选一部分代码对大家进行解读:
always@(*)/*Verilog的逻辑一般由alway关键字定义,其中()内部的变量变化时执行下面代码,如果是*则代表所有input发生变化都会解发语句执行*/
beginif((psel == 1'b1) && (penable == 1'b1) && (pwrite == 1'b1)) begin/*verilog中的如1'b1,'前面的1代表一位长度,b代表二进制编码,'后面的1代表具体数值,本例中是说psel即选中标志,与penable即可用标志和pwirte即可写标志均为1是进入以下语句*/if(paddr[TIMER_ADDR_LHS:2] == TIMER1LC_OFFSET)//如果是timer1的LOADCOUNT的OFFSETtimer1loadcount_wen = 1'b1;//将timer1的loadcount的event位配置为1elsetimer1loadcount_wen = 1'b0; //将timer1的loadcount的event位配置为0endelsetimer1loadcount_wen = 1'b0; //将timer1的loadcount的event位配置为0end
内存映射表如下:
名称 |
地址偏移 |
宽度 |
访问模式 |
复位数值 |
Description |
Timer1LoadCount |
0x00 |
32 |
R/W |
32’b0 |
将被装载入Timer1的value |
Timer1CurrentValue |
0x04 |
32 |
R |
32’b0 |
Timer1现在的value |
Timer1Control Reg |
0x08 |
4 |
R/W |
4’b0 |
Timer1的控制器 |
Timer1_int_clr |
0x0C |
1 |
R |
1’b0 |
Timer1清中断标志 |
Timer1Int Status |
0x10 |
1 |
R |
1’b0 |
Timer1中断状态 |
Timer2LoadCount |
0x14 |
32 |
R/W |
32’b0 |
将被装载入Timer1的value |
Timer2CurrentValue |
0x18 |
32 |
R |
32’b0 |
Timer1现在的value |
Timer2Control Reg |
0x1c |
4 |
R/W |
4’b0 |
Timer1的控制器 |
Timer2_int_clr |
0x20 |
1 |
R |
1’b0 |
Timer1清中断标志 |
Timer2Int Status |
0x24 |
1 |
R |
1’b0 |
Timer1中断状态 |
驱动部分
无剑100平台的硬件驱动代表均在以下目录https://github.com/T-head-Semi/wujian100_open/blob/master/sdk/csi_driver/wujian100_open/,驱动层一般是既有汇编又有C代码了,我们还是仅关注计时器的驱动,具体如下:https://github.com/T-head-Semi/wujian100_open/blob/master/sdk/csi_driver/wujian100_open/dw_timer.c
其中计时器初始化的函数如下:
timer_handle_t csi_timer_initialize(int32_t idx, timer_event_cb_t cb_event)//idx代表计时器的id,cb_event是回调事件{if (idx < 0 || idx >= CONFIG_TIMER_NUM) {return NULL;}uint32_t base = 0u;uint32_t irq = 0u;void *handler;int32_t real_idx = target_get_timer(idx, &base, &irq, &handler);if (real_idx != idx) {//合法怕校验return NULL;}dw_timer_priv_t *timer_priv = &timer_instance[idx];//设计timer的优先级timer_priv->base = base;timer_priv->irq = irq;//设置硬中断请求优先级timer_priv->idx = idx;dw_timer_reg_t *addr = (dw_timer_reg_t *)(timer_priv->base);timer_priv->timeout = DW_TIMER_INIT_DEFAULT_VALUE;#ifdef CONFIG_LPMcsi_timer_power_control(timer_priv, DRV_POWER_FULL);#endiftimer_deactive_control(addr);//启用前先禁用timer_priv->cb_event = cb_event;if (cb_event != NULL) {drv_irq_register(timer_priv->irq, handler);//注册硬件优先级drv_irq_enable(timer_priv->irq);//启用}return (timer_handle_t)timer_priv;}
那么这个驱动又为库文件https://github.com/T-head-Semi/wujian100_open/blob/master/sdk/libs/libc/clock_gettime.c提供服务,其中clock_timer_init函数会调用csi_timer_initialize函数初始化计时器。具体代码如下:
int clock_timer_init(void){if (CLOCK_GETTIME_USE_TIMER_ID > CONFIG_TIMER_NUM) {return EPERM;}uint32_t timer_loadtimer;timer_handle = csi_timer_initialize(CLOCK_GETTIME_USE_TIMER_ID, timer_cb_fun);if (timer_handle == NULL) {return -1;}APB_FREQ = drv_get_timer_freq(CLOCK_GETTIME_USE_TIMER_ID);timer_loadtimer = 10 * MILLION; /*10Mus=10s */TIMER_LOADCOUNT = timer_loadtimer * (APB_FREQ / MILLION);int ret = csi_timer_config(timer_handle, TIMER_MODE_RELOAD);if (ret != 0) {return -1;}ret = csi_timer_set_timeout(timer_handle, timer_loadtimer);if (ret != 0) {return -1;}unsigned int cv1, cv2;csi_timer_get_current_value(timer_handle, &cv1);csi_timer_get_current_value(timer_handle, &cv2);if (cv2 > cv1) {timer_count_rise = 1;}return 0;}
内核层面的计时器
由于在硬件计时器数量有限,为避免浪费内核层面一般都使用双链表的方法,为各用户提供软计时器服务。这方面我在之前的文章中介绍过鸿蒙Lite OS的相关机制详见(https://blog.csdn.net/BEYONDMA/article/details/100049796),无剑100内核层面的软计时器与之比较类似,这里就不再赘述了。
以上就是笔者对于无剑100MCU计时器代码进行的解读,当然由于芯片层面涉及的知识层面太广,而笔者的水平有限难免有所纰漏,不过总算代表技术社区补上代码解读缺失这方面的遗憾了,也算是达成了心愿。
最后对于阿里平头哥将芯片平台开源,反哺技术社区的做法致以敬意。祝我国在这个物联网时代,能在操作系统、数据库和芯片等方面都能做出领先世界的产品。
无招胜有招-代码解读阿里开源芯片平台无剑100相关推荐
- 百行代码解读阿里 AloT 芯片平台无剑 100!
作者 | 马超 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 今年以来我国IT厂商都在AIot的底层平台建设方面可谓是捷报频传,在操作系统方面有如像腾讯的Tiny OS.阿里的Al ...
- 【数据湖存储】数据湖的终极奥秘,无招胜有招
作为海量数据存储与分析的重要承载方式的数据湖,从2011年概念诞生至今,已经发展了9个年头.而数据湖是什么?又能为数字化经济带来什么?<阿里云数据湖存储解决方案蓝皮书>将为您揭开数据湖的终 ...
- "无招胜有招"nbsp;史上最全的互…
课前秀:三个段子 第一个段子:一个毫无餐饮行业经验的人开了一家餐馆,仅两个月时间,就实现了所在商场餐厅坪效第一名;VC投资6000万,估值4亿元人民币,这家餐厅是雕爷牛腩. 只有12道菜,花了500万 ...
- 无招胜有招——面向对象设计模式随笔,
最近在学习面向对象设计模式,GOF的23种设计模式大概看了一遍,简单总结一下,设计模式主要分为三种模式,分别是创建模式,结构模式,行为模式. 回过头想一下具体有哪些模式,在什么情况下用什么设计模式,好 ...
- Dirty Approach之无招胜有招
每个网站,几乎都有"新闻"的模块.在中国独有的ICP--Internet Copy and Past--模式下,多数站点也靠"转贴"手段汇集新闻信息.如果说新浪 ...
- 阿里平头哥发布AIoT芯片平台“无剑”,可将芯片设计成本降低50%
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 阿里芯片,又有大动作.这次不是AI芯片,而是芯片平台. 世界AI大会期间,平头哥发布AIoT芯片平台,命名"无剑". ...
- 无招胜有招之spring _高频面试题
1.使用 Spring 框架的好处是什么? 1. 轻量:Spring 是轻量的,基本的版本大约 2MB. 2. 控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查 ...
- 最有用的期货技术 — 无招胜有招
什么样的期货策略可持续? 期货市场里不缺交易明星,只缺交易寿星.高超的期货交易技术一直是期货交易者们乐于追逐的梦想.很多人在技术学习上花费了上万学费,在技术实战研究上交的学费更是无法估量.期货市场里股 ...
- 要锤炼出营销魔法,口碑营销“无招胜有招”
药剂师们从不指望偶然配成长生不死药,化学家们不会空耗时日炼铅成金,美国宇航局的科学家们也不会徒劳地修补时间机器. 可是,宝洁公司倒是有一帮人耗费四年时光,要锤炼出营销魔法∶自然而然的口碑,也就是大家告 ...
- 无招胜有招之Java进阶JVM(九)HotSpot
Java 版本1.8.0_121 Java SE 运行环境:也就是我们所说的jre. 至于hotspot:(两个字 讲究) #翻译的官方文档 Java HotSpot虚拟机是Java SE平台的核心组 ...
最新文章
- ICLR2020放榜 687篇入选34篇得满分! 且看OpenReview数据图文详解
- 【uniapp】Error during WebSocket handshake: Unexpected response code: 302
- protobuf入门教程(三):常用序列化/反序列化接口
- 如何将 winston log 库记录的日志写入 mongo DB 数据库
- mongodb python 存文件_Python保存MongoDB上的文件到本地的方法介绍
- eclipse复制代码连接数据库404_推荐一款免费的数据库管理工具,比Navicat还要好用,功能还很强大...
- 项目管理工程师:第二章信息系统服务管理
- shell脚本的作用
- 机器学习11/100天-KNN实践
- C#格式化小数位的方法
- Eclipse is running in a JRE, but a JDK is requi...
- asp.net助学贷款管理系统
- 多道程序设计有哪些新特性呢?它又是如何实现程序的并发执行的呢?
- SSM整合尚硅谷Spring
- 巅峰战舰正在连接服务器,人气冲天《巅峰战舰》火爆连续加开服务器
- html中seo三大标签,探索者SEO告诉你三大标签如何正确使用
- firefox 返回 16 进制 颜色值
- Android---探究Android组件化
- 基于51单片机的宠物自动猫粮狗粮喂养机proteus仿真原理图PCB
- ogg转mp3格式转换器