首页 > 编程语言 >基于 TI Sitara系列 AM64x核心板——程序自启动说明

基于 TI Sitara系列 AM64x核心板——程序自启动说明

时间:2024-07-29 14:52:46浏览次数:16  
标签:led flash R5F Sitara Cortex TI 自启动 am64 main

前 言

本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。

本说明文档适用开发环境如下:

Windows开发环境:Windows 7 64bit、Windows 10 64bit

虚拟机:VMware15.5.5

Linux开发环境:Ubuntu 18.04.4 64bit

Linux Processor SDK:ti-processor-sdk-linux-rt-am64xx-evm-08.01.00.39

U-Boot:U-Boot-2021.01

CCS版本:CCS11.2.0

MCU+ SDK:mcu_plus_sdk_am64x_08_03_00_18

SysConfig:sysconfig-1.12.1_2446

GCC AARCH64 Compiler:gcc-arm-9.2-2019.12-mingw-w64-i686-aarch64-none-elf

本文测试板卡为创龙科技SOM-TL64x核心板,它是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F设计的多核工业级核心板,通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。

用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研。

基于SBL引导裸机、FreeRTOS程序启动

程序启动流程说明

评估板上电后,固化在CPU内部的RBL将会先运行,RBL根据评估板BOOT SET从启动介质(如eMMC,Micro SD、SPI FLASH)读取SBL,然后通过SBL引导应用程序启动。

程序启动流程如下图所示。

图 1

目前官方提供的MCU+ SDK(版本为mcu_plus_sdk_am64x_08_03_00_18),SBL将会先读取应用程序至MSRAM,然后再进行解析。由于MSRAM空间有限,分配给SBL使用的内存空间仅512KByte,并且SBL运行需使用部分MSRAM空间。因此,为确保SBL引导应用程序正常启动,应用程序大小不能超过380KByte。

图 2

基于Micro SD卡启动

启动卡制作

请准备一张FAT32格式的Micro SD卡,通过读卡器将Micro SD卡连接至PC机。

双击产品资料“4-软件资料\Tools\Windows\”目录下PartManFree-Setup.exe分区管理软件,按默认安装即可。安装完成后,打开分区管理软件,将会自动识别到Micro SD卡分区,请右键选中该分区,点击"Set Active"设置为活跃分区,如下图所示。

图 3

进入MCU+ SDK组件安装目录"C:\ti\mcu_plus_sdk_am64x_08_03_00_18\tools\boot\sbl_prebuilt\am64x-evm\",将sbl_sd.release.tiimage拷贝至Micro SD卡,并重命名为tiboot3.bin,如下图所示。

备注:sbl_sd.release.tiimage为官方提供的SBL镜像。

图 4

 

图 5

 

单核启动

本小节以Cortex-A53核心的led_flash裸机工程为例进行演示,Cortex-M4F和Cortex-R5F核心操作步骤与之类似。

请参考《FreeRTOS、Baremetal案例开发手册》文档,正确编译产品资料“4-软件资料\Demo\Baremetal-demos\led_flash\project\”目录下的led_flash_a53ss_nortos工程,然后将编译生成的led_flash_a53ss_nortos.appimage镜像文件拷贝至Micro SD卡,并重命名为app。

图 6

 

图 7

 

请将Micro SD卡插入评估板Micro SD卡槽,根据评估底板丝印将启动方式选择拨码开关拨为101000(1~6),此档位为Micro SD启动模式。然后使用Micro USB线连接评估板的USB TO UART0调试串口至PC机,

请将评估板上电启动,串口调试终端将会打印如下类似启动信息。同时,可观察到评估底板LED1、LED2闪烁,说明程序自启动成功。

图 8

 

多核启动

本小节以Cortex-A53、Cortex-M4F和Cortex-R5F核心的led_flash裸机工程为例进行演示。

请在磁盘根目录新建一个非中文文件夹test,将产品资料“4-软件资料\Demo\Baremetal-demos\led_flash\bin\”目录下的led_flash_a53ss_nortos.out、led_flash_m4fss_nortos.out、led_flash_r5fss_nortos.out全部拷贝至该目录下。

图 9

 

右键Windows按钮,点击"Windows PowerShell(I)",打开Windows PowerShell终端。

图 10

 

在Windows PowerShell终端执行如下命令进入test目录。

Window# cd E:\test\

图 11
  1. rprc文件生成

在Windows PowerShell终端执行如下命令,基于xxx.out文件使用CCS和MCU+ SDK生成xxx.rprc文件,xxx.rprc文件已包含可加载段的bin文件。CCS与MCU+ SDK路径请以实际情况为准。

Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/out2rprc/elf2rprc.js led_flash_a53ss_nortos.out

Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/out2rprc/elf2rprc.js led_flash_m4fss_nortos.out

Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/out2rprc/elf2rprc.js led_flash_r5fss_nortos.out

图 12

执行完成后,将会在当前目录下生成了led_flash_a53ss_nortos.rprc、led_flash_m4fss_nortos.rprc、led_flash_r5fss_nortos.rprc文件。

图 13
  1. appimage文件生成

基于xxx.rprc文件生成镜像xxx.appimage,需指定启动核心的ID,对应关系如下表所示。

备注:AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。

表 1

在Windows PowerShell终端执行如下命令,将Cortex-A53、Cortex-M4F和Cortex-R5F核心的led_flash可执行程序合并为led_flash.appimage,并指定运行核心分别为a53ss0_0、m4fss0_0、r5fss0_0。

Window# C:\ti\ccs1120\ccs/tools/node/node C:/ti/mcu_plus_sdk_am64x_08_03_00_18/tools/boot/multicoreImageGen/multicoreImageGen.js --devID 55 --out led_flash.appimage led_flash_a53ss_nortos.rprc@0 led_flash_m4fss_nortos.rprc@14 led_flash_r5fss_nortos.rprc@4

图 14

执行完成后,将会在当前目录下生成led_flash.appimage镜像文件。

图 15

请将生成的led_flash.appimage镜像文件拷贝至Micro SD卡,并重命名为app。

图 16

请将Micro SD卡插入评估板Micro SD卡槽,根据评估底板丝印将启动方式选择拨码开关拨为101000(1~6),此档位为Micro SD启动模式。然后使用Micro USB线连接评估板的USB TO UART0调试串口至PC机。

评估板上电启动,串口调试终端将会打印如下类似启动信息。同时,可观察到评估底板LED1、LED2、LED3闪烁,说明程序自启动成功。

图 17

基于Linux引导裸机、FreeRTOS程序启动

基于Linux启动

本小节以产品资料“4-软件资料\Demo\RTOS-demos\”目录下的ipc_rpmsg_echo_linux案例为例进行演示。该案例主要实现Cortex-A53与Cortex-R5F核间通信,以及Cortex-A53与Cortex-M4F核间通信。

请将案例bin目录下的am64-main-r5f0_0-fw、am64-main-r5f0_1-fw、am64-main-r5f1_0-fw、am64-main-r5f1_1-fw、am64-mcu-m4f0_0-fw镜像文件拷贝至评估板文件系统根目录下。

图 18

进入评估板文件系统,执行如下命令,删除原来的软链接。

Target# rm /lib/firmware/am64-main-r5f0_0-fw

Target# rm /lib/firmware/am64-main-r5f0_1-fw

Target# rm /lib/firmware/am64-main-r5f1_0-fw

Target# rm /lib/firmware/am64-main-r5f1_1-fw

Target# rm /lib/firmware/am64-mcu-m4f0_0-fw

图 19

执行如下命令,创建新的软链接。

Target# ln -sf /home/root/am64-main-r5f0_0-fw /lib/firmware/am64-main-r5f0_0-fw

Target# ln -sf /home/root/am64-main-r5f0_1-fw /lib/firmware/am64-main-r5f0_1-fw

Target# ln -sf /home/root/am64-main-r5f1_0-fw /lib/firmware/am64-main-r5f1_0-fw

Target# ln -sf /home/root/am64-main-r5f1_1-fw /lib/firmware/am64-main-r5f1_1-fw

Target# ln -sf /home/root/am64-mcu-m4f0_0-fw /lib/firmware/am64-mcu-m4f0_0-fw

图 20

请将评估板重启,在系统启动过程中,Cortex-R5F、Cortex-M4F核心将会引导启动。在评估板文件系统执行如下命令,查询Cortex-R5F、Cortex-M4F核心与remoteproc关系。

Target# head /sys/class/remoteproc/remoteproc*/name

图 21   表 2

备注:核心与remoteproc对应关系,请以实际情况为准。

执行如下命令,可查看Cortex-M4F、Cortex-R5F核心程序运行日志。

Target# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0

Target# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0

Target# cat /sys/kernel/debug/remoteproc/remoteproc2/trace0

Target# cat /sys/kernel/debug/remoteproc/remoteproc3/trace0

Target# cat /sys/kernel/debug/remoteproc/remoteproc4/trace0

图 22

工程配置说明

本小节主要演示如何在Cortex-R5F、Cortex-M4F核心的Baremetal(裸机)工程与FreeRTOS工程中添加Linux引导配置。

内存空间说明

如Cortex-R5F、Cortex-M4F核心的工程需支持基于Linux启动,则需进行内存空间分配,在Linux设备树中已指定内存空间,预留给Cortex-R5F、Cortex-M4F核心使用。内存空间分配如下图所示。

图 23

Cortex-M4F工程配置

本小节以Cortex-M4F核心的led_flash裸机工程为例进行演示。

  1. IPC配置

在syscfg配置文件,添加IPC配置,具体配置如下图所示。

图 24
  1. 编译器链接脚本修改

双击打开编译器链接脚本linker.cmd,修改脚本内容。

图 25
  1. 在SECTIONS命令中新增一个.resource_table段,具体代码如下所示。

GROUP {

/* This is the resource table used by linux to know where the IPC "VRINGs" are located */

.resource_table: {} palign(4096)

} > DDR_0

图 26
  1. 在MEMORY命令中,设置.resource_table段的加载地址为0xA4100000,作为Cortex-M4F预留内存空间,具体代码如下所示。

/* Resource table must be placed at the start of DDR_0 when M4 core is early booting with Linux */

DDR_0 : ORIGIN = 0xA4100000 , LENGTH = 0x1000

图 27

Cortex-R5F工程配置

本小节以Cortex-R5F核心的led_flash裸机工程为例进行演示。

AM6412包含1个Cortex-R5F核心:r5fss0_0;AM6442包含4个Cortex-R5F核心分别为:r5fss0_0、r5fss0_1、r5fss1_0、r5fss1_1。不同的Cortex-R5F核心,编译器链接脚本指定的.resource_table段加载地址有所不同,具体如下表所示。

表 3

led_flash_r5fss_nortos工程配置的Cortex-R5F核心为r5fss0_0,下面演示如何修改led_flash_r5fss_nortos工程配置,实现基于Linux引导启动r5fss0_0。

  1. IPC配置

在syscfg配置文件,添加IPC配置,具体配置如下图所示。

图 28
  1. UART配置

UART0为Cortex-A53核心(Linux系统)的调试串口。在led_flash_r5fss_nortos工程中已配置UART0作为调试串口,请在syscfg配置文件取消勾选"Enable UART Log"配置选项,或修改为Linux设备树中未使能的串口。

图 29
  1. 编译器链接脚本修改

双击打开编译器链接脚本linker.cmd,修改脚本内容。

图 30

修改内容如下:

  1. 启动代码链接至R5F_TCMA;
  2. 新增一个.resource_table段;
  3. 代码段、数据段、bss段、堆栈全部链接至DDR,在Linux上为r5fss0_0预留内存地址空间;

SECTIONS

{

GROUP {

.text.hwi: palign(8)

.text.cache: palign(8)

.text.mpu: palign(8)

.text.boot: palign(8)

.text:abort: palign(8) /* this helps in loading symbols when using XIP mode */

} > R5F_TCMA

GROUP {

.text: {} palign(8) /* This is where code resides */

.rodata: {} palign(8) /* This is where const's go */

} > DDR_1

GROUP {

/* This is the resource table used by linux to know where the IPC "VRINGs" are located */

.resource_table: {} palign(4096)

} > DDR_0

GROUP {

.data: {} palign(8) /* This is where initialized globals and static go */

} > DDR_1

GROUP {

.bss: {} palign(8) /* This is where uninitialized globals go */

RUN_START(__BSS_START)

RUN_END(__BSS_END)

.sysmem: {} palign(8) /* This is where the malloc heap goes */

.stack: {} palign(8) /* This is where the main() stack goes */

} > DDR_1

GROUP {

.irqstack: {. = . + __IRQ_STACK_SIZE;} align(8)

RUN_START(__IRQ_STACK_START)

RUN_END(__IRQ_STACK_END)

.fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8)

RUN_START(__FIQ_STACK_START)

RUN_END(__FIQ_STACK_END)

.svcstack: {. = . + __SVC_STACK_SIZE;} align(8)

RUN_START(__SVC_STACK_START)

RUN_END(__SVC_STACK_END)

.abortstack: {. = . + __ABORT_STACK_SIZE;} align(8)

RUN_START(__ABORT_STACK_START)

RUN_END(__ABORT_STACK_END)

.undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8)

RUN_START(__UNDEFINED_STACK_START)

RUN_END(__UNDEFINED_STACK_END)

} > DDR_1

/* Sections needed for C++ projects */

GROUP {

.ARM.exidx: {} palign(8) /* Needed for C++ exception handling */

.init_array: {} palign(8) /* Contains function pointers called before main */

.fini_array: {} palign(8) /* Contains function pointers called after main */

} > DDR_1

/* Sections needed for C++ projects */

GROUP {

.ARM.exidx: {} palign(8) /* Needed for C++ exception handling */

.init_array: {} palign(8) /* Contains function pointers called before main */

.fini_array: {} palign(8) /* Contains function pointers called after main */

} > DDR_1

}

图 31 图 32
  1. 设置.resource_table段的加载地址为0xA0100000,作为r5fss0_0核心预留内存空间;
  2. 设置共享内存链接至Linux为共享内存预留的内存地址空间。

/* Resource table must be placed at the start of DDR_0 when R5 cores are early booting with Linux */

DDR_0 : ORIGIN = 0xA0100000, LENGTH = 0x1000

DDR_1 : ORIGIN = 0xA0101000 , LENGTH = 0xEFF000

USER_SHM_MEM : ORIGIN = 0xA5000000, LENGTH = 0x80

LOG_SHM_MEM : ORIGIN = 0xA5000000 + 0x80, LENGTH = 0x00004000 - 0x80

RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0xA5004000, LENGTH = 0x0000C000

图 33

标签:led,flash,R5F,Sitara,Cortex,TI,自启动,am64,main
From: https://www.cnblogs.com/Tronlong818/p/18330073

相关文章

  • pymongo版本更新错误DatetimeConversion
    由于我使用的是pymongo版本3.6.0,现在更新到版本4.6.3,在此更新之后,我可以执行构建并开始运行。但在单元测试中,我的错误为“ImportError:无法从'bson.code_option'(~/bmstmp/dockcont1/configs/main/pybuild/x86_64-v21/Debug/bson/codec_options.py)导入名称'DatetimeC......
  • [Typescript] Restrict available operations on values using value objects
    ValueObjectsareanotherpatterninDomain-drivenDesignthatprovidemorestructurearoundwhatyoucanandcannotdowithatype.InTypeScriptwecreateValueObjectswithclassesthatwilldefinewhatoperationscanbeperformedtothevalueonthec......
  • tidb集群部署
    ####################################################集群IP例子172.21.243.141172.21.243.69172.21.243.47172.21.243.33172.21.243.184172.21.243.64172.21.243.223机器配置我这边是7台机器,每台2c8g100g####################################################离线部署方......
  • Elasticsearch跨集群搜索
    Elasticsearch(简称ES)是一种基于Lucene的搜索引擎,以其高性能、可扩展性和实时搜索能力而广受欢迎。在大型分布式系统中,跨集群搜索成为了一个重要的需求,它允许用户从多个Elasticsearch集群中联合查询数据,以提高搜索效率和数据一致性。ES|QL(ElasticsearchQueryLanguage)作为一......
  • ARFoundation系列讲解 - 93 Immersal GoPro绘制地图
    一、Immerasal地图绘制的方式1.MapperAPP地图绘制:这种⽅式不需要数据处理操作,更适合⼩场景、测试使⽤。只能生成点云模型,无法生成真实环境网格模型。2. 全景相机地图绘制:使⽤全景相机采集原始数据建图的优势在于:全景图⽚视野覆盖范围⼤,可以⽤更少的照⽚完成较⼤场景地图(......
  • 将基于系统时间的循环系统更改为简单的 time.sleep()
    所以我试图修改我见过的游戏代码......这只是一个较大代码的片段。不过我发现很有趣,这段代码使用OCR,它会截取屏幕截图并上传一般概述,以与Webhooks的使用不一致。我发现它使用的系统是通过读取我的系统(计算机)时间...我想将其更改为一种更简单的方法来创建一个循环来每“x”分钟......
  • springboot整合mybatis
    第一部分:创建springboot文件 第一步:打开软件,点击file,点击new然后选择module,在右侧选择springboot第二步:选择配置和JDK以及java版本①选择maven类型②选择JDK1.8版本③选择java8版本④选择jar包类型http://t.csdnimg.cn/XeplRhttp://t.csdnimg.cn/XeplR第三步:选择......
  • 论文阅读:Sequence to sequence learning for joint extraction of entities and relat
    用以解决重叠关系问题GGNNs模型GGNNs(门控图神经网络,GatedGraphNeuralNetworks)是一种处理图结构数据的神经网络模型。它是图神经网络(GNN)的一个变体,使用了类似于长短时记忆网络(LSTM)中的门控机制来更有效地处理图中的信息流。GGNNs的核心机制GGNNs的核心思想是通过在图结构中......
  • Centos中修改Docker镜像源:解决error pulling image configuration:download failed a
    场景在进行拉取镜像时提示:errorpullingimageconfiguration:downloadfailedafterattempts=6:dialing... 这是因为镜像源无法连接和使用了。但是之前已经配置过国内docker的镜像源了。是因为自2024年6月份左右国内镜像源大部分失效,原因自行探索。所以记录下如何修......
  • InputStream inputStream = classLoader.getResourceAsStream("aaa.properties") ; 
    问:InputStreaminputStream=classLoader.getResourceAsStream("aaa.properties"); 获取到的 inputStream 是null答:当您尝试使用ClassLoader的getResourceAsStream方法来获取一个资源文件(如"aaa.properties")的InputStream,但得到的结果是null时,这通常意味着资源文......