6438|8

7608

帖子

2

TA的资源

五彩晶圆(高级)

楼主
 

STM32MP157A-DK1测评 - 2、MPU的功能 [复制链接]

 
本帖最后由 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共享的外设。

      

 

 

  1. 内核

 

 

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;            // These 128 bit registers will contain 4 values from the x array and 4 values from the y array
  uint32x4_t z4;                // This 128 bit register will contain the 4 results from the add intrinsic

  uint32_t *ptra = x;           // pointer to the x array data
  uint32_t *ptrb = y;           // pointer to the y array data
  uint32_t *ptrz = z;           // pointer to the z array data

  for (i = 0; i < 200 / 4; i++)
    {

      x4 = vld1q_u32 (ptra);    // intrinsic to load x4 with 4 values from x
      y4 = vld1q_u32 (ptrb);    // intrinsic to load y4
      z4 = vaddq_u32 (x4, y4);  // intrinsic to add z4=x4+y4
      vst1q_u32 (ptrz, z4);     // store the 4 results to z
      ptra += 4;                // increment pointers
      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的组成部分,有兴趣的朋友可以找资料看看。

       

 

 

  1. 持久化存储。

 

 

持久化存储包括EMMC,NAND,NOR,QUADSPI等部件。STM32MP157A-DK1中只提供了MicroSD卡插槽,以SD卡作为存储介质存放bootloader,bootfs,rootfs等操作系统组件。

 

 

openSTLinux作为一个完整的Linux发行版,可以使用Linux MMC 框架。配置内核时选择:

 

 

 

 

不管是fdisk,还是dd,还是mount,把它当作块设备操作即可。

 

 

 

 

由于一个很重要的原因,我已经重做了STM32MP157A-DK1的文件系统,所以Bash提示符不是OpenSTLinux默认的提示符,SD卡分区也只有5个分区。这个事情等下一篇测评再说。   

 

  1. 易失性存储

易失性存储主要指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映射到其他地址,这点还需要进一步确认。

 

  1. 时钟、计时器、电源管理。

时钟、计时器和电源统一由Linux管理。这里面比较麻烦的是Device Tree中关于时钟树的构建。构建在Linux的管理之后,PWM等计时器的操作都由Linux内核通过sysfs暴露到用户空间。Linux也提供内核API对计时器进行PWM操作。

 

 

 

 


  1. 高速通信、低速通信、网络通信。

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的方式操作即可。

 

 

 

 


  1. 多媒体、可视化、M4协处理器和安全。

这部分主要是LCD和HDMI输出,用于图形界面的显示和视频播放当处理。一般不需要最终用户参与。

 

 

M4协处理器在后面几篇测评再来看其与A7的交互。

 

 

安全不熟悉,没有深入过。

 

 

 

 


  1. 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原创,如需转载或用于商业用途需征得作者同意并注明出处

 

 

最新回复

赞!!!   详情 回复 发表于 2020-3-31 23:40
点赞(1) 关注
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复
举报

6040

帖子

196

TA的资源

版主

沙发
 

free蜀黍是真用心了,给个好评,有空慢慢品

点评

队长,大板玩起来。吃灰不如让我白嫖。。。  详情 回复 发表于 2020-3-31 13:20
 
 
 

回复

2933

帖子

4

TA的资源

五彩晶圆(中级)

板凳
 

兄弟的测评做的不错,希望后面能讲讲“裸跑”A7核程序和OpenMP的东西。最要是想编写SPI接口的驱动程序。

点评

spi的用户层操作参考 linux-4.19.94/tools/spi,设置好cross compile直接make就行了,我本来打算随后的spi实验就抄这个来着。。。内核层的spi操作在linux-4.19.94/Documentation/spi下面有说明。  详情 回复 发表于 2020-3-31 14:14
兄弟,裸跑跑起来并不复杂,代码就是普通main函数程序,硬件部分最大的区别就是开不开MMU,寄存器操作都是一样的。bootloader就是一段跑在裸机的程序。包括执行之初的uboot(到后面uboot要接管mmu),还有ST提供的otpe  详情 回复 发表于 2020-3-31 13:43
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

4
 
lcofjp 发表于 2020-3-31 10:26
free蜀黍是真用心了,给个好评,有空慢慢品

队长,大板玩起来。吃灰不如让我白嫖。。。
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

5
 
bigbat 发表于 2020-3-31 11:21
兄弟的测评做的不错,希望后面能讲讲“裸跑”A7核程序和OpenMP的东西。最要是想编写SPI接口的驱 ...

兄弟,裸跑跑起来并不复杂,代码就是普通main函数程序,硬件部分最大的区别就是开不开MMU,寄存器操作都是一样的。bootloader就是一段跑在裸机的程序。包括执行之初的uboot(到后面uboot要接管mmu),还有ST提供的otpee和那个什么trust os的boot。然后就是sd卡镜像要把你自己的程序包一个st的magic头,这个wiki上有,但是手册上我没注意到,应该有工具生成。st自己的bootrom要根据这个头验证是不是合法镜像,然后从头部信息里读sd数据到sysram,上面帖子也说了这点,所以裸跑的代码应该基于sysram链接而不能基于传统stm32 mcu的flash。进了main之后一切都和stm32 mcu的搞法是一样的。

不过真没必要上了A7还按M4的方法搞,他们可以看做两个不同的东西。就像C++可以搞成C但是他们是不同的东西。最大的繁荣是软件部分,也就是A7的Linux和安卓生态。虽然硬件包括intel还是arm的硬件都很大,但是不繁荣,他们的硬件很重要很重要,但并不是核心。就像英伟达的gpu直接推动了深度学习,但深度学习的核心仍然是tenserflow和相关软件算法。

点评

十多年前的时候在arm7 s3c44b0x的时候弄过uboot+main的这种程序。这种程序主要是为了验证驱动的代码。后来主要是做M4、M3的开发。虽然也接触过树莓派、BB-black等板子,但是都没有弄过驱动程序。主要是应用层的程序  详情 回复 发表于 2020-3-31 14:21
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

6
 
bigbat 发表于 2020-3-31 11:21 兄弟的测评做的不错,希望后面能讲讲“裸跑”A7核程序和OpenMP的东西。最要是想编写SPI接口的驱 ...

spi的用户层操作参考 linux-4.19.94/tools/spi,设置好cross compile直接make就行了,我本来打算随后的spi实验就抄这个来着。。。内核层的spi操作在linux-4.19.94/Documentation/spi下面有说明。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

2933

帖子

4

TA的资源

五彩晶圆(中级)

7
 
freebsder 发表于 2020-3-31 13:43 兄弟,裸跑跑起来并不复杂,代码就是普通main函数程序,硬件部分最大的区别就是开不开MMU,寄存器操作都 ...

十多年前的时候在arm7 s3c44b0x的时候弄过uboot+main的这种程序。这种程序主要是为了验证驱动的代码。后来主要是做M4、M3的开发。虽然也接触过树莓派、BB-black等板子,但是都没有弄过驱动程序。主要是应用层的程序。看到这个板子后就想更深入的了解一下。其实主要是编译选项的选择。你说的SPI代码我看看。兄弟多费心了。

点评

内核驱动挺麻烦的,涉及的东西除了硬件本身,还有Linux庞大的framework,真有需要学的话最好系统学一下,没有必要需求不学也罢,要学好真的十分消耗精力。前些年还要写各种驱动,现在的芯片BSP都很完备,就算要搞搞  详情 回复 发表于 2020-3-31 14:34
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

8
 
bigbat 发表于 2020-3-31 14:21 十多年前的时候在arm7 s3c44b0x的时候弄过uboot+main的这种程序。这种程序主要是为了验证驱动的代码。后 ...

内核驱动挺麻烦的,涉及的东西除了硬件本身,还有Linux庞大的framework,真有需要学的话最好系统学一下,没有必要需求不学也罢,要学好真的十分消耗精力。前些年还要写各种驱动,现在的芯片BSP都很完备,就算要搞搞,例子和模板也多,抄抄就出来了。前些年还要自己做交叉编译器,现在直接就apt install,鄙人一手熟练的make手艺已经英雄无用武之地。。。当然BSP里面BUG是另一回事。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1万

帖子

2853

TA的资源

管理员

9
 

赞!!!

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表