本帖最后由 freebsder 于 2020-3-30 22:43 编辑
正如我在上一篇测评里的个人观点:STM32MP157A SoC毕竟属于ST的第一代MPU SoC产品,它的功能在不考虑实际应用和单价成本,只观察配置的情况下,与已经推出多代Cortex-A系列产品的友商产品相比是偏弱的。
把MP1 SoC上的主要功能归类出来:内核、总线、易失性存储、持久化存储、时钟、计时器、电源管理、高速通信、低速通信、网络通信、多媒体、模拟信号处理、可视化、安全和IO输入输出,还有个Cortex M4核的协处理器。
所有的外设以三种方式环境,第一种是Cortex-A7安全环境,第二种是Cortex-A7非安全环境主要运行Linux,第三种是Cortex-M4。详见STM32MP15 peripherals overview。
STM32MP1的一个特色是一部分外设可以在A7和M4之间共享使用,另一部分外设在A7和M4之间独占使用,剩下的一些外设只在A7和M4内核中才能使用。上图图例方块中的斜线是共享,竖线是独占,全色是独享。比如ETH外设,是A7的独享外设。FDCAN是A7和M4独占外设,分配之后便由A7或M4独占。GPIOA-K是A7和M4共享的外设。
- 内核
STM32MP157A是Armv7-A内核体系结构的Cortex-A7 MPCore处理器系列产品,相比Cortex-M系列最显著的区别在A7具备MMU内存管理单元。虽然A7数字上比Cortex-A8小,但却比A8更先进,A7属于Armv7-A体系结构中的中低端产品,A8属于ARM公司已经淘汰的系列。
之所以说A7属于中低端产品是因为它在Armv7-A体系结构中配置的是顺序执行的部分超标量流水线(高端产品配置乱序全量超标量流水线)。虽然处理器在指令处理性能上受到一定局限,但是成本、功耗和可测性可以得到更好的控制。
Armv7-A是32位宽度的处理器结构,典型地址空间为4GB。A7在MMU功能之上加配扩展物理地址单元,用来访问更大的空间。
A7通过Armv7-A的扩展加强了硬件虚拟化(hardware virtualization)的能力,这是A7显著区别于同系列其他低端产品的特点之一。基于硬件虚拟化能力,理论上说所有虚拟容器(如docker,vmware,virtualbox等)和虚拟机(Java,Python)都可以加速性能,加强安全。
STM32MP1中两颗A7内核每一颗单独享有32KB的L1数据cache和32KB的L1指令cache,两颗处理器共享256K的L2缓存。至于2路组的32K的数据和指令缓存,256K的L2的多少路组cache,cache的轮换策略等十分具体的体系结构指标可以参考ARM提供的Cortex-A7 MPCore Technical Reference Manual。此外要读明白Linux中的MMU内存变换管理,也应该仔细读这篇Manual。
STM32MP1有一个VFPv4的浮点处理单元,还有一个NEON协处理器,NEON自带单精度浮点处理能力,可以提供DSP和SIMD的数据处理功能。DSP大家很熟悉,NEON是一个单指令多数据处理单元(SIMD),顾名思义一条指令处理多个数据,这也是并行手段的一种。NEON可以极大的提高数据处理和机器学习等应用的速度。使用NEON库,编译器优化等手段使用NEON协处理器。GCC可以用-mcpu, -mfpu, 和 -mfloat-abi参数控制NEON代码的开关。
网上摘一段代码试试:
#include <arm_neon.h>
void intrinsics (uint32_t * x, uint32_t * y, uint32_t * z)
{
int i;
uint32x4_t x4, y4;
uint32x4_t z4;
uint32_t *ptra = x;
uint32_t *ptrb = y;
uint32_t *ptrz = z;
for (i = 0; i < 200 / 4; i++)
{
x4 = vld1q_u32 (ptra);
y4 = vld1q_u32 (ptrb);
z4 = vaddq_u32 (x4, y4);
vst1q_u32 (ptrz, z4);
ptra += 4;
ptrb += 4;
ptrz += 4;
}
}
随手一编,找到一个openSTLinux的问题,看起来ST SDK里面提供的交叉编译器是不完整的。OMG,<stdint.h>以std开头,是一个标准头文件,这个文件的缺失玩笑开得有点大。虽然ST SDK的编译器可以编译Linux,编译Uboot等,但是不能完整编译用户层应用,这是个BUG。
换一个社区版的吧。我在Hyper-V里装的debian10,虽然目前不知道怎么用Host机器的U盘,但是整个Linux环境是齐全的。Debian挺好的,直接用apt install gcc-arm-linux-gnueabihf就可以安装交叉编译器。
把neon.o dump出来看汇编,可以看到vld1.32等neon指令。
另外这颗Cortex-A7 MP的STM32MP157A还有安全管理单元TrustZone,集成中断管理控制器(GIC v2,用于MultiProcessor的中断控制),AMBA4 AXI总线等A7的组成部分,有兴趣的朋友可以找资料看看。
- 持久化存储。
持久化存储包括EMMC,NAND,NOR,QUADSPI等部件。STM32MP157A-DK1中只提供了MicroSD卡插槽,以SD卡作为存储介质存放bootloader,bootfs,rootfs等操作系统组件。
openSTLinux作为一个完整的Linux发行版,可以使用Linux MMC 框架。配置内核时选择:
不管是fdisk,还是dd,还是mount,把它当作块设备操作即可。
由于一个很重要的原因,我已经重做了STM32MP157A-DK1的文件系统,所以Bash提示符不是OpenSTLinux默认的提示符,SD卡分区也只有5个分区。这个事情等下一篇测评再说。
- 易失性存储
易失性存储主要指SRAM。SRAM包括通过数据总线访问的DDR和片内内部SRAM两部分。
DDR主要由美光的低电压DDR3L颗粒MT41K256M16提供,在上一篇测评中有所表述。
SRAM有A7专用的,也有M4专用的。地址空间0x2FFC0000开始的256K SRAM是A7专用的SYSRAM,其余的SRAM1,2,4和备份RAM都由M4独享,SRAM3由A7和M4共享,作为共享存储介质。这里的说法与本贴最上面的外设共享示意图有冲突。
根据手册P122的说法应该是wiki上的图示有误。
系统引导时内部的BootROM会使用SYSRAM存放读取在SD(或NAND)等块设备的数据块放在这里作为bootstrap的第一步过程。这么大的SRAM也可以作为一个独立的RTOS运行在其中。系统启动之后,应用层可以通过GCC链接脚本制定地址的方式使用这256K的高速存储空间。当然,这块地址可能被MMU映射到其他地址,这点还需要进一步确认。
- 时钟、计时器、电源管理。
时钟、计时器和电源统一由Linux管理。这里面比较麻烦的是Device Tree中关于时钟树的构建。构建在Linux的管理之后,PWM等计时器的操作都由Linux内核通过sysfs暴露到用户空间。Linux也提供内核API对计时器进行PWM操作。
- 高速通信、低速通信、网络通信。
STM32MP157A-DK1板载的高速通信主要有USB。网络通信配置的是Ethernet。低速通信有I2C,U(S)ART和SPI。
USB作为一个完整的Linux驱动子系统,一切的一切按照标准Linux的方式操作即可,有很多资料试图讲解Linux下面的USB子系统,最终用户无需在处理USB硬件相关的事物,感兴趣的朋友可以自行查找。
网络Ethernet同样是这种情况。最终用户无需再关注具体的网络驱动,所有的网络行为都已经通过Linux抽象成Socket(Tcp/Ip)。这部分的说明最经典的是已故作家Richard Stevens写的《UNIX Network Programming》套书。感兴趣的朋友可以自行查找。
U(S)ART已经被Linux抽象成控制台TTY。内核通过ST-Link的VCOM输出的便是console=ttySTM0,115200的效果。通过struct termios{}结构和相关应用层API设置波特率,停止位等参数后,以普通文件open,read,write的方式操作即可。
- 多媒体、可视化、M4协处理器和安全。
这部分主要是LCD和HDMI输出,用于图形界面的显示和视频播放当处理。一般不需要最终用户参与。
M4协处理器在后面几篇测评再来看其与A7的交互。
安全不熟悉,没有深入过。
- GPIO,SPI,I2C
以上可以看出,STM32MP157A SoC的几乎所有外设的物理机制都不需要最终用户过多参与。这一点和基于MCU的单片机开发完全不同。简单说,MP1的开发就是Linux用户空间应用的开发,没有说内核开发是因为ST已经为MP1这颗SoC提供了很完备的Linux驱动。
那么这里就简单的用GPIO,SPI,I2C三个比较依赖应用层定义的外设做一些简单的实验。
GPIO比较简单,本篇测评太长了,SPI和I2C留待下一篇。
STM32MP157A-DK1开发板上有现成的LED可以用。
参考ST wiki中关于GPIO的说明,安装gpiod和libgpiod2。OpenSTLinux发行版默认已经安装。
用gpiod包含的工具,很容易的关闭和打开板载绿色LED。
直接抄GPIO说明中的C代码例子。直接在开发板上编译,编译这个文件大约1.5秒,确实不快。
绿灯闪烁,哎哟不错哟。
此内容由EEWORLD论坛网友freebsder原创,如需转载或用于商业用途需征得作者同意并注明出处