STM32MP157A-DK1测评 - 2、MPU的功能
<div class='showpostmsg'> 本帖最后由 freebsder 于 2020-3-30 22:43 编辑<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">正如我在</span><span lang="EN-US"><span style="background:white"><span style="line-height:150%"><span style="color:#4f4f4f"><a href="https://bbs.eeworld.com.cn/thread-1115779-1-1.html" style="color:#0563c1; text-decoration:underline">上一篇测评</a></span></span></span></span><span style="line-height:150%">里的个人观点:STM32MP157A SoC毕竟属于ST的第一代MPU SoC产品,它的功能在不考虑实际应用和单价成本,只观察配置的情况下,与已经推出多代Cortex-A系列产品的友商产品相比是偏弱的。</span></span></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">把MP1 SoC上的主要功能归类出来:内核、总线、易失性存储、持久化存储、时钟、计时器、电源管理、高速通信、低速通信、网络通信、多媒体、模拟信号处理、可视化、安全和IO输入输出,还有个Cortex M4核的协处理器。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">所有的外设以三种方式环境,第一种是Cortex-A7安全环境,第二种是Cortex-A7非安全环境主要运行Linux,第三种是Cortex-M4。详见<a href="https://wiki.st.com/stm32mpu/wiki/STM32MP15_peripherals_overview" style="color:#0563c1; text-decoration:underline">STM32MP15 peripherals overview</a>。</span></span></span></span></p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%"> STM32MP1</span></span><span style="line-height:150%">的一个特色是一部分外设可以在A7和M4之间共享使用,另一部分外设在A7和M4之间独占使用,剩下的一些外设只在A7和M4内核中才能使用。上图图例方块中的斜线是共享,竖线是独占,全色是独享。比如ETH外设,是A7的独享外设。FDCAN是A7和M4独占外设,分配之后便由A7或M4独占。GPIOA-K是A7和M4共享的外设。</span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<ol>
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">内核</span></span></span></span></li>
</ol>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">STM32MP157A</span></span><span style="line-height:150%">是Armv7-A内核体系结构的Cortex-A7 MPCore处理器系列产品,相比Cortex-M系列最显著的区别在A7具备MMU内存管理单元。虽然A7数字上比Cortex-A8小,但却比A8更先进,A7属于Armv7-A体系结构中的中低端产品,A8属于ARM公司已经淘汰的系列。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">之所以说A7属于中低端产品是因为它在Armv7-A体系结构中配置的是顺序执行的部分超标量流水线(高端产品配置乱序全量超标量流水线)。虽然处理器在指令处理性能上受到一定局限,但是成本、功耗和可测性可以得到更好的控制。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">Armv7-A</span></span><span style="line-height:150%">是32位宽度的处理器结构,典型地址空间为4GB。A7在MMU功能之上加配扩展物理地址单元,用来访问更大的空间。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">A7</span></span><span style="line-height:150%">通过Armv7-A的扩展加强了硬件虚拟化(hardware virtualization)的能力,这是A7显著区别于同系列其他低端产品的特点之一。基于硬件虚拟化能力,理论上说所有虚拟容器(如docker,vmware,virtualbox等)和虚拟机(Java,Python)都可以加速性能,加强安全。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">STM32MP1</span></span><span style="line-height:150%">中两颗A7内核每一颗单独享有32KB的L1数据cache和32KB的L1指令cache,两颗处理器共享256K的L2缓存。至于2路组的32K的数据和指令缓存,256K的L2的多少路组cache,cache的轮换策略等十分具体的体系结构指标可以参考ARM提供的<a href="https://developer.arm.com/docs/ddi0464/f" style="color:#0563c1; text-decoration:underline">Cortex-A7 MPCore Technical Reference Manual</a>。此外要读明白Linux中的MMU内存变换管理,也应该仔细读这篇Manual。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">STM32MP1</span></span><span style="line-height:150%">有一个<a href="https://developer.arm.com/architectures/instruction-sets/floating-point" style="color:#0563c1; text-decoration:underline">VFPv4</a>的浮点处理单元,还有一个<a href="https://developer.arm.com/architectures/instruction-sets/simd-isas/neon" style="color:#0563c1; text-decoration:underline">NEON协处理器</a>,NEON自带单精度浮点处理能力,可以提供DSP和SIMD的数据处理功能。DSP大家很熟悉,NEON是一个单指令多数据处理单元(SIMD),顾名思义一条指令处理多个数据,这也是并行手段的一种。NEON可以极大的提高数据处理和机器学习等应用的速度。使用NEON库,编译器优化等手段使用NEON协处理器。GCC可以用-mcpu, -mfpu, 和 -mfloat-abi参数控制NEON代码的开关。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">网上摘一段代码试试:</span></span></span></span></p>
<div aria-label="代码段 小部件" contenteditable="false" role="region" tabindex="-1">
<pre data-widget="codesnippet">
<code class="hljs language-cpp"><span class="hljs-preprocessor">#include <arm_neon.h></span>
<span class="hljs-keyword">void</span> intrinsics (uint32_t * x, uint32_t * y, uint32_t * z)
{
<span class="hljs-keyword">int</span> i;
uint32x4_t x4, y4; <span class="hljs-comment">// These 128 bit registers will contain 4 values from the x array and 4 values from the y array</span>
uint32x4_t z4; <span class="hljs-comment">// This 128 bit register will contain the 4 results from the add intrinsic</span>
uint32_t *ptra = x; <span class="hljs-comment">// pointer to the x array data</span>
uint32_t *ptrb = y; <span class="hljs-comment">// pointer to the y array data</span>
uint32_t *ptrz = z; <span class="hljs-comment">// pointer to the z array data</span>
<span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < <span class="hljs-number">200</span> / <span class="hljs-number">4</span>; i++)
{
x4 = vld1q_u32 (ptra); <span class="hljs-comment">// intrinsic to load x4 with 4 values from x</span>
y4 = vld1q_u32 (ptrb); <span class="hljs-comment">// intrinsic to load y4</span>
z4 = vaddq_u32 (x4, y4); <span class="hljs-comment">// intrinsic to add z4=x4+y4</span>
vst1q_u32 (ptrz, z4); <span class="hljs-comment">// store the 4 results to z</span>
ptra += <span class="hljs-number">4</span>; <span class="hljs-comment">// increment pointers</span>
ptrb += <span class="hljs-number">4</span>;
ptrz += <span class="hljs-number">4</span>;
}
}</code></pre>
<img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" /><span style="background: url("https://bbs.eeworld.com.cn/static/editor/plugins/widget/images/handle.png") rgba(220, 220, 220, 0.5); top: -15px; left: 0px; display: block;"><img height="15" role="presentation" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" title="点击并拖拽以移动" width="15" /></span></div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%"> 随手一编,找到一个openSTLinux的问题,看起来ST SDK里面提供的交叉编译器是不完整的。OMG,<stdint.h>以std开头,是一个标准头文件,这个文件的缺失玩笑开得有点大。虽然ST SDK的编译器可以编译Linux,编译Uboot等,但是不能完整编译用户层应用,这是个BUG。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">换一个社区版的吧。我在Hyper-V里装的debian10,虽然目前不知道怎么用Host机器的U盘,但是整个Linux环境是齐全的。Debian挺好的,直接用apt install gcc-arm-linux-gnueabihf就可以安装交叉编译器。</span></span></span></span></p>
<p> </p>
<p> </p>
<p><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%"> 把neon.o dump出来看汇编,可以看到vld1.32等neon指令。</span></span></span></span></p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">另外这颗Cortex-A7 MP的STM32MP157A还有安全管理单元<a href="https://developer.arm.com/ip-products/security-ip/trustzone" style="color:#0563c1; text-decoration:underline">TrustZone</a>,集成中断管理控制器(<a href="https://developer.arm.com/ip-products/system-ip/system-controllers/interrupt-controllers" style="color:#0563c1; text-decoration:underline">GIC v2</a>,用于MultiProcessor的中断控制),<a href="https://developer.arm.com/docs/100095/0002/introduction/compliance/advanced-microcontroller-bus-architecture-amba" style="color:#0563c1; text-decoration:underline">AMBA4 AXI总线</a>等A7的组成部分,有兴趣的朋友可以找资料看看。</span></span></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"> </p>
<p> </p>
<p> </p>
<ol start="2">
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">持久化存储。</span></span></span></span></li>
</ol>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">持久化存储包括EMMC,NAND,NOR,QUADSPI等部件。STM32MP157A-DK1中只提供了MicroSD卡插槽,以SD卡作为存储介质存放bootloader,bootfs,rootfs等操作系统组件。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">openSTLinux</span></span><span style="line-height:150%">作为一个完整的Linux发行版,可以使用<a href="https://wiki.st.com/stm32mpu/wiki/MMC_overview" style="color:#0563c1; text-decoration:underline">Linux MMC 框架</a>。配置内核时选择:</span></span></span></span></p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">不管是fdisk,还是dd,还是mount,把它当作块设备操作即可。</span></span></span></span></p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">由于一个很重要的原因,我已经重做了STM32MP157A-DK1的文件系统,所以Bash提示符不是OpenSTLinux默认的提示符,SD卡分区也只有5个分区。这个事情等下一篇测评再说。</span></span></span></span> </p>
<p style="text-indent:21.0pt; text-align:justify"> </p>
<ol start="3">
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">易失性存储</span></span></span></span></li>
</ol>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">易失性存储主要指SRAM。SRAM包括通过数据总线访问的DDR和片内内部SRAM两部分。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">DDR</span></span><span style="line-height:150%">主要由美光的低电压DDR3L颗粒MT41K256M16提供,在<a href="https://bbs.eeworld.com.cn/thread-1115779-1-1.html" style="color:#0563c1; text-decoration:underline">上一篇测评</a>中有所表述。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">SRAM</span></span><span style="line-height:150%">有A7专用的,也有M4专用的。地址空间0x2FFC0000开始的256K SRAM是A7专用的SYSRAM,其余的SRAM1,2,4和备份RAM都由M4独享,SRAM3由A7和M4共享,作为共享存储介质。这里的说法与本贴最上面的外设共享示意图有冲突。</span></span></span></span></p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">根据手册P122的说法应该是wiki上的图示有误。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">系统引导时内部的BootROM会使用SYSRAM存放读取在SD(或NAND)等块设备的数据块放在这里作为bootstrap的第一步过程。这么大的SRAM也可以作为一个独立的RTOS运行在其中。系统启动之后,应用层可以通过GCC链接脚本制定地址的方式使用这256K的高速存储空间。当然,这块地址可能被MMU映射到其他地址,这点还需要进一步确认。</span></span></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"> </p>
<ol start="4">
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">时钟、计时器、电源管理。</span></span></span></span></li>
</ol>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">时钟、计时器和电源统一由Linux管理。这里面比较麻烦的是Device Tree中关于时钟树的构建。构建在Linux的管理之后,PWM等计时器的操作都由Linux内核通过sysfs暴露到用户空间。Linux也提供内核API对计时器进行PWM操作。</span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<ol start="5"><br />
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">高速通信、低速通信、网络通信。</span></span></span></span></li>
</ol>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">STM32MP157A-DK1</span></span><span style="line-height:150%">板载的高速通信主要有USB。网络通信配置的是Ethernet。低速通信有I2C,U(S)ART和SPI。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">USB</span></span><span style="line-height:150%">作为一个完整的Linux驱动子系统,一切的一切按照标准Linux的方式操作即可,有很多资料试图讲解Linux下面的USB子系统,最终用户无需在处理USB硬件相关的事物,感兴趣的朋友可以自行查找。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">网络Ethernet同样是这种情况。最终用户无需再关注具体的网络驱动,所有的网络行为都已经通过Linux抽象成Socket(Tcp/Ip)。这部分的说明最经典的是已故作家Richard Stevens写的《UNIX Network Programming》套书。感兴趣的朋友可以自行查找。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">U(S)ART</span></span><span style="line-height:150%">已经被Linux抽象成控制台TTY。内核通过ST-Link的VCOM输出的便是console=ttySTM0,115200的效果。通过struct termios{}结构和相关应用层API设置波特率,停止位等参数后,以普通文件open,read,write的方式操作即可。</span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<ol start="6"><br />
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">多媒体、可视化、M4协处理器和安全。</span></span></span></span></li>
</ol>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">这部分主要是LCD和HDMI输出,用于图形界面的显示和视频播放当处理。一般不需要最终用户参与。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">M4</span></span><span style="line-height:150%">协处理器在后面几篇测评再来看其与A7的交互。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">安全不熟悉,没有深入过。</span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<ol start="7"><br />
<li style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">GPIO</span></span><span style="line-height:150%">,SPI,I2C</span></span></span></span></li>
</ol>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">以上可以看出,STM32MP157A SoC的几乎所有外设的物理机制都不需要最终用户过多参与。这一点和基于MCU的单片机开发完全不同。简单说,MP1的开发就是Linux用户空间应用的开发,没有说内核开发是因为ST已经为MP1这颗SoC提供了很完备的Linux驱动。</span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">那么这里就简单的用GPIO,SPI,I2C三个比较依赖应用层定义的外设做一些简单的实验。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">GPIO</span></span><span style="line-height:150%">比较简单,本篇测评太长了,SPI和I2C留待下一篇。</span></span></span></span></p>
<p style="text-indent:21.0pt; text-align:justify"> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span lang="EN-US"><span style="line-height:150%">STM32MP157A-DK1</span></span><span style="line-height:150%">开发板上有现成的LED可以用。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">参考ST wiki中关于<a href="https://wiki.st.com/stm32mpu/wiki/How_to_control_a_GPIO_in_userspace" style="color:#0563c1; text-decoration:underline">GPIO的说明</a>,安装gpiod和libgpiod2。OpenSTLinux发行版默认已经安装。</span></span></span></span></p>
<p> </p>
<p> </p>
<p align="center" style="text-align:center"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%">用gpiod包含的工具,很容易的关闭和打开板载绿色LED。</span></span></span></span></p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span><span style="font-size:20px;"><span style="font-family:宋体;"><span style="line-height:150%"><span style="line-height:150%"> 直接抄<a href="https://wiki.st.com/stm32mpu/wiki/How_to_control_a_GPIO_in_userspace" style="color:#0563c1; text-decoration:underline">GPIO说明</a>中的C代码例子。直接在开发板上编译,编译这个文件大约1.5秒,确实不快。</span></span></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"></span></span></p>
<p> </p>
<p> </p>
<p style="text-align:justify"><span style="font-size:20px;"><span style="font-family:宋体;"> 绿灯闪烁,哎哟不错哟。</span></span></p>
<p style="text-align:justify"> </p>
<p style="text-align:justify"><b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">freebsder</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></p>
<p> </p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>free蜀黍是真用心了,给个好评,有空慢慢品</p>
<p>兄弟的测评做的不错,希望后面能讲讲“裸跑”A7核程序和OpenMP的东西。最要是想编写SPI接口的驱动程序。</p>
lcofjp 发表于 2020-3-31 10:26
free蜀黍是真用心了,给个好评,有空慢慢品
队长,大板玩起来。吃灰不如让我白嫖。。。 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和相关软件算法。 bigbat 发表于 2020-3-31 11:21
兄弟的测评做的不错,希望后面能讲讲“裸跑”A7核程序和OpenMP的东西。最要是想编写SPI接口的驱 ...
<p>spi的用户层操作参考 linux-4.19.94/tools/spi,设置好cross compile直接make就行了,我本来打算随后的spi实验就抄这个来着。。。内核层的spi操作在linux-4.19.94/Documentation/spi下面有说明。</p>
freebsder 发表于 2020-3-31 13:43
兄弟,裸跑跑起来并不复杂,代码就是普通main函数程序,硬件部分最大的区别就是开不开MMU,寄存器操作都 ...
<p>十多年前的时候在arm7 s3c44b0x的时候弄过uboot+main的这种程序。这种程序主要是为了验证驱动的代码。后来主要是做M4、M3的开发。虽然也接触过树莓派、BB-black等板子,但是都没有弄过驱动程序。主要是应用层的程序。看到这个板子后就想更深入的了解一下。其实主要是编译选项的选择。你说的SPI代码我看看。兄弟多费心了。</p>
bigbat 发表于 2020-3-31 14:21
十多年前的时候在arm7 s3c44b0x的时候弄过uboot+main的这种程序。这种程序主要是为了验证驱动的代码。后 ...
<p>内核驱动挺麻烦的,涉及的东西除了硬件本身,还有Linux庞大的framework,真有需要学的话最好系统学一下,没有必要需求不学也罢,要学好真的十分消耗精力。前些年还要写各种驱动,现在的芯片BSP都很完备,就算要搞搞,例子和模板也多,抄抄就出来了。前些年还要自己做交叉编译器,现在直接就apt install,鄙人一手熟练的make手艺已经英雄无用武之地。。。当然BSP里面BUG是另一回事。</p>
<p>赞!!!</p>
页:
[1]