一切信仰都带着呻吟。一切爆发都有片刻的宁静。一切死亡都有冗长的回声。
在一个SoC的系统结构设计中,除了硬件结构以外,软件结构的设计对整个SoC的性能有很大的影响。
尽管硬件的结构设计无论对哪个公司来说都是一种挑战,却不能忽略系统级上的挑战。
因为一个SoC产品不只包括硬件,而是软件和硬件的结合。在很多的SoC中,软件设计的复杂度和开发周期都要超过整个硬件的设计。软件设计在很大程度上决定了SoC中硬件电路的性能发挥。
1.数据流的路径
在很多嵌入式系统中,数据流在硬件和软件中的路径决定了系统的效率和性能。
数据流的路径通常是从数据位通过物理接口流入系统开始的,并经硬件设备输入接口流入硬件设备输入控制器。软件驱动程序将数据输入操作系统的数据结构,然后再送入应用存储器空间中。
应用程序间的通信直接通过共享的全局存储器交换数据,或者通过操作系统以消息的形式传送数据。
在输出端,应用通常通过操作系统向设备驱动程序传送数据,它将数据输入一个硬件输出控制器,然后通过操作系统向设备驱动程序传送数据,经硬件设备输出接口传出。
2.软件环境
SoC芯片中的软件环境包括应用软件的运行环境和应用软件的开发环境。开发环境包括应用软件源代码、编译器、连接器、开发界面和硬件调试接口等。
其中,软件源代码位于开发环境的最上层,而调试接口则是环境中的底层。对于一个SoC来说,如果其中的处理器采用MIPS、ARM或Tensilica的处理器时,SoC上应用的开发者可以从提供商那里获得开发环境,而不用自己去开发。
这也是很多的就是解决方案,给你从芯片到带着小系统的东西。
但即使标准的开发环境也从来都不是标准的。为了在新的系统中去实现包括更多新的功能,在每一个开发周期中,需要在开发环境中增加各种开发工具。
SoC中应用软件的运行环境主要由
- 应用程序、
- 操作系统核心、
- 各种驱动、
- 芯片本身构成。
图4-13所示为软件的运行环境及开发工具。(对于一些不太需要任务管理、资源管理及进程管理的应用,SoC也往往不会采用操作系统。想起了当时面试的时候面试官问我玩过一下操作系统没,但当时都是玩的裸机。唯一一个也是基于协议栈的东西。)
在应用软件运行环境的最上层是应用程序。应用程序实现了系统的各种特定应用,如音频或视频解码等。应用程序之间可以通过某种标准接口(如网络协议)进行通信。相同类型的应用可以在这种方式下获得好处。
在这种消息传递中能够实现可靠的接口,但会带来性能的问题。应用程序之间的通信也可以通过操作系统核心以存储器共享的方式通信来提高速度。比如某一应用程序将一块数据放到缓存中,并把指针传递给另一个应用软件,但以这样的方式交换数据往往也会带来某些问题。
在应用程序的下一层是操作系统核心,负责任务的创建、任务的调度和存储器管理等。
在操作系统的下一层由
- 各种I/O接口(如UART、USB、IDE、WLAN、LCD等)驱动、
- 硬件加速器驱动和
- 其他实现如异常处理、
- 中断服务程序、
- 初始化、
- 复位及Bootloader等的系统软件构成。
3.软硬件接口
在一个真实的SoC系统结构设计中还必须考虑到软硬件接口(Interface)。主要的软硬件接口有:
- ①存储空间映射(Memory Map),包括所有设备的可配置寄存器的地址映射;
- ②设备驱动;
- ③初始化、复位、Bootloader程序;
- ④中断服务程序及中断向量;
- ⑤I/O引脚的复用等。
这些是在系统结构设计时必须定义好的,在硬件设计时必须按照定义做,这样才能保障系统软件正常工作。
1.存储空间映射
通常情况下,SoC中的各个片上模块及与之通信的片外设备,如Flash及Flash控制器的寄存器、RAM及存储器控制模块中的寄存器,以及各种外设等,均采用统一地址空间进行编址访问,为每一个设备分配一定数量的地址空间的过程称为存储空间映射。图4-14所示为一款IBM的SoC的存储空间映射的例子。
图4-14 基于IBM的PLB和OPB总线协议的SoC的存储空间映射实例
2.设备驱动
在SoC设计中,需要大量投资来开发设备驱动(I/O接口驱动、硬件加速器驱动),这是产品成功的关键。
设备驱动的作用是在操作系统内核与I/O硬件设备之间建立连接。
其目的是,对于软件设计者而言,这个接口屏蔽了各类设备的底层硬件细节,使软件设计者可以像处理普通文件一样对硬件设备进行打开、读写、关闭等操作。
设备驱动主要完成的工作包括:
- 初始化(如设定传输率,定时器的周期等),
- 中断服务处理(如对硬件中断的处理),
- 输入/输出设备的接口服务(如启动和停止定时器、DMA传输等)。
操作系统提供商通常会提供常见设备的驱动包。这些驱动程序可以作为参考设计,而实际上应用开发者还是需要做出大量修改。参考设计毕竟只是参考,最后的产品中很少完全使用参考设计。与桌面系统不同,嵌入式系统与接口和应用密切相关,一个操作系统获得成功很大程度上取决于各种最新驱动程序的可获程度。
3.初始化、复位、Bootloader程序
SoC设计中的初始化程序主要负责整个SoC各个关键组件的初始化工作。
初始化
这些初始化工作主要包括:
- 初始化CPU内部的一些特殊寄存器、
- 初始化Cache参数、
- 初始化存储器管理单元MMU(Memory Management Unit)、
- 初始化其他SoC组件(如URAT、Timer等)、
- 初始化设置中断向量表等,
- 并开始执行应用程序或操作系统。
复位主要是在上电时完成处理器、SoC芯片及整个系统的复位工作。
它使得CPU的指令指针指到某一个特定的存储器地址,然后从这个地址取指并执行一系列的复位中断服务程序。
例如,一款IBM公司的PowerPC 405GP处理器在上电复位时,将从地址0XFFFFFFFC开始执行相关的程序,而这段程序可能是在通过PCI连接的存储器上。
复位
复位主要是在上电时完成处理器、SoC芯片及整个系统的复位工作。它使得CPU的指令指针指到某一个特定的存储器地址,然后从这个地址取指并执行一系列的复位中断服务程序。
例如,一款IBM公司的PowerPC 405GP处理器在上电复位时,将从地址0XFFFFFFFC开始执行相关的程序,而这段程序可能是在通过PCI连接的存储器上。
Bootloader
Bootloader是在操作系统运行之前执行的一小段程序。
通过这部分程序,设计者可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
Bootloader的主要运行任务就是将内核映象加载到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。
Bootloader是基于特定硬件平台来实现的,因此,几乎不可能为所有的SoC建立一个通用的Bootloader。Bootloader不但依赖于处理器的体系结构,还依赖于SoC中各设备模块的配置。
因此一般交付的时候芯片厂商会将芯片和Bootlloader一起交付,同时一些安全的启动方案就在这个地方会出现。
4.中断服务程序及中断向量
当处理器正在处理内部数据时,外界发生了紧急情况,要求处理器暂停当前的工作转去处理这个紧急事件。
处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断,而对于紧急事件的处理程序称为中断服务程序。
各类中断服务程序的入口地址均存放在中断向量表中。
5.I/O引脚的复用
I/O引脚的数量将影响到芯片乃至系统板的面积。通常为了减小面积会将两个或两个以上不在同一个时间使用的不同功能的I/O引脚进行复用。
例如,用在测试时的扫描链信号引脚与正常使用时的UART模块的引脚复用。
6.模型
为了能及时开发出目标系统所需要的软件,在SoC芯片能够获得之前,需要有一种SoC模型来开发和运行软件。
以前,SoC模型通常是基于FPGA的。随着电子系统级设计的发展,一种虚拟的仿真模型出现了。仿真模型的速度虽然相对实际芯片要慢一些,但可以更早地展开软件的开发,而且随着服务器等处理速度的提高,相对来说提高了仿真模型的速度。
这里也就是原型验证的意义所在。
随着SoC设计中越来越多地使用多核,软件开发环境需要为应用开发者提供新的编程模型。
比如,在每一个独立的处理器上运行标准的操作系统,这样可以为应用开发者提供相当的灵活性。但应用开发者要面临着协同这些处理器中的所有任务的问题。
而更加普遍的做法或许是,为开发者提供一个多处理器多线程的开发模型,每一个线程映射到不同的独立处理器上。
这种模型限制了对每个处理器的访问,却降低了在应用层可能发生的同步问题。
这些编程模型只是为处理器提供通用的开发环境,而实际的芯片是一个更大并包括复杂通信的系统,这样的系统需要在开发环境中被建模。
软件的复杂性正在不断地增长,并且软件通常能够更好地处理复杂性的问题。软件系统的功能和复杂性的进一步发展也使得SoC设计方法学的极限得以扩展。
参考资料
《SoC设计方法与实现》
作者:Hkcoco
文章来源:TrustZone
推荐阅读
更多物联网安全,PSA等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA技术交流群,请备注研究方向。