TI DSP多核应用部署——MAD

一、使用MAD的目的

1.需要在多个核心上部署多个应用程序
2.需要通过共享公共代码来节省内存
3.需要在核心上动态部署应用程序(当前不支持此功能)

二、MAD组件

MAD组件提供了一组实用程序(utilities)来帮助实现上述需求。
MAD组件使用的5个主要实用程序(utilities)分为以下2类

2.1 编译时的组件

 · 静态链接器:用于链接应用程序和相关的动态共享对象(DSO——dynamic shared objects)。
 · 预链接工具:用于将ELF文件中的段绑定到虚拟地址。
 · MAP工具:多核应用程序预链接器(MAP)工具,用于为多核应用的分段分配虚拟地址。以下是MAP工具功能简介:

用户为设备指定所需的内存分区,并向MAP工具指定用于段放置的高级指令。基于该信息,MAP工具为每个应用程序确定每个ELF段的运行时虚拟/物理地址。然后,它调用预链接器为所有应用程序和相关DSO进行存储分配(地址绑定)。MAP工具还生成一组激活记录,用于在特定核心上加载应用程序。激活记录是运行时加载程序执行以下操作的指令:

 · 设置分区的虚拟内存映射和内存保护/权限属性
 · 在其运行地址复制并初始化可加载段

预链接的应用程序、DSO和激活记录随后被打包到ROM文件系统映像中,以下载到目标。

2.2 运行时的设施

2.2.1 初始加载工具(IBL)

中间引导加载器(IBL——Intermediate Boot Loader)提供将ROM文件系统映像下载到设备的共享外部存储器(DDR)的功能。IBL的配置参数被编程到目标平台的I2C EEPROM(Electrically Erasable Programmable Read-Only Memory电子式可清除程序化只读存储器)中。

2.2.2 运行加载工具(MAD Loader)

MAD Loader实用程序提供了在给定内核上启动应用程序的功能。它执行以下操作以在核心上启动应用程序:

 · 配置核心的虚拟内存映射
 · 配置每个内存分区的内存属性和权限
 · 将段从加载地址复制到运行地址

 · 初始化应用程序的执行环境
 · 执行应用程序的预初始化功能
 · 执行相关库和应用程序的初始化函数
 · 在应用程序的入口点启动应用程序

三、使用模式

MAD实用程序提供2种使用模式:

1. 预链接器旁路模式:在这种操作模式下,MAP工具不会为应用程序段进行地址分配,也不会调用预链接器。这种模式适用于应用程序开发人员已经为应用程序分配了多核地址,并且只需要一个实用程序在指定的核上加载和运行应用程序的用例。
2. 预链接器模式:在这种操作模式中,MAP工具为应用程序段进行地址分配并调用预链接器。这种模式适用于应用程序开发人员希望MAP工具负责地址分配以实现多核应用程序之间共享公共代码的用例。

四、预链接器旁路模式下的MAD数据流

下图显示了预链接旁路模式下的MAD流程

数据流总结

准备镜像

 · 将应用程序静态链接到其运行地址
 · 为Map工具创建一个部署配置文件,标识要加载到每个core上的应用程序
 · 使用部署配置文件作为输入运行MAP工具
 · MAP工具创建一个加载映像(以ROMFS格式),其中包含每个应用程序的激活记录

应用部署

 · 在引导时,设备将运行ROM引导加载程序(RBL)
 · ROM引导加载程序将加载并运行板上的IBL(例如i2c-eeprom)
 · IBL将从tftp服务器下载MAD映像(MAD映像也可以位于NOR/NAND闪存板上)到DDR
 · IBL配置有一个进入执行的入口点

       · 在非MAD的情况下,这将是下载的应用程序的入口点
       · 在MAD的情况下,IBL将被配置为跳转到MAD Loader的入口点

 · MAD loader将
       · 解析ROMFS镜像
       ·  将应用程序段加载到其运行地址,并在每个配置的核心上开始执行应用程序

五、预链接器模式下的MAD流

下图显示了预链接器模式下的MAD流程

数据流总结

准备镜像

 · 识别应用程序之间的通用代码
 · 将公共代码链接为与位置无关的共享对象(DSO)
 · 链接应用程序
 · 以上步骤创建将在设备上运行的一组应用程序/DSO
 · 确定哪些应用程序可以在每个核心上运行
 · 通过设想使用情况来识别设备的内存分区

C6670的内存分区示例 :

DDR:
    32 MB per core 0-3
    128 MB ro image
    16 MB shared r/w
MSMC RAM:
    512 KB per core
    no ro image
    no shared r/w
L2:
    Max Cache
L1:
    All Cache

<syntaxhighlight lang="javascript">

 · 使用以上信息为Map工具创建部署配置文件
 · 使用部署配置文件作为输入运行MAP工具
 · 映射工具生成一个预链接命令文件,其中包含预链接工具的段到虚拟地址绑定指令
 · 预链接工具从Map工具读取ELF文件和预链接命令文件,并预链接所有输入应用程序(将段绑定到虚拟地址、处理动态重定位等),并为预链接的每个EXE和DSO生成一个预链接输出文件
 · 使用预先链接的输出文件和将段分配到物理地址空间的信息,MAP工具创建包含每个应用程序的激活记录的加载映像(以ROMFS格式)

应用部署

 · 在引导时,设备将运行ROM引导加载程序
 · ROM引导加载程序将加载并运行板上的IBL(例如i2c-eeprom)
 · IBL将从tftp服务器下载MAD映像(MAD映像也可以位于NOR/NAND闪存板上)到DDR
 · IBL配置有一个进入执行的入口点。
         · 在非MAD的情况下,这将是下载的应用程序的入口点
         · 在MAD的情况下,IBL将被配置为跳转到MAD Loader的入口点
 · MAD loader将
         · 解析ROMFS图像
         · 将应用程序段加载到其运行地址,并在每个配置的核心上开始执行应用程序

六、开始

6.1 软件包概述

支持多核应用程序部署需要以下工具包

MAD UTILS概述

MAD utils是作为源发行版提供的。以下是mad-utils的目录结构

相应目录中的README.txt文件提供了有关代码组织和构建过程的详细信息

MAP工具配置

MAP工具的输入是一个JSON格式的配置文件。配置文件具有以下对象:

1.deploymentCfgFile:指定部署配置文件
2.LoadImageName:指定要生成的加载图像文件的名称。加载图像文件(采用ROMFS格式)将放置在中/imageâ目录
3.prelinkExe:指定prelinker可执行文件的名称。预链接器可执行文件的路径应设置在执行环境中的集合中
4.ofdTool:指定OFD工具可执行文件的名称。OFD工具可执行文件的路径应设置在执行环境中的集合中。OFD工具是代码生成工具包的一部分
5.malApp:指定MAD加载程序应用程序的文件名
6.nmlLoader:指定NML(无人区(保留虚拟地址空间))加载程序的文件名。NML加载程序是MAD加载程序的一个子组件

MAP工具的配置文件示例如下所示:

MAP工具配置文件

{ "deploymentCfgFile" : "./config-files/deployment_template_C6678.json", "LoadImageName" : "c6678-le.bin", "prelinkExe" : "prelink6x", "stripExe" : "strip6x", "ofdTool" : "ofd6x", "malApp" : "../mad-loader/bin/C6678/le/mal_app.exe", "nmlLoader" : "../mad-loader/bin/C6678/le/nml.exe" }

部署配置文件(预链接器旁路模式)

在预链接器旁路模式中,部署配置文件用于指定以下信息:
 · 加载内存分区的地址
 · 要部署的应用程序

部署配置文件采用JSON格式。“预链接器旁路”模式的部署配置文件包含以下部分:

1.设备名称:此JSON对象标识目标设备
2.分区:这部分标识将在内存中加载ROMFS(ROM File System)映像的内存分区。本节具有以下配置参数:
        1.名称:分区的名称。这在MAP工具调试日志中用作分区标识符
        2.vaddr:分区的虚拟地址
        3.size:内存分区的大小(以字节为单位)。
        4.loadPartition:指定分区是否为Load分区。
C6670设备在预链路旁路模式下的部署配置示例如下所示:

{ "deviceName" : "C6670",

"partitions" : [ { "name" : "load-partition", "vaddr" : "0x9e000000", "size" : "0x2000000", "loadPartition" : true } ],

"applications" : [ { "name" : "app1", "fileName" : "../mad-loader/examples/app_1/build/app_1.exe", "allowedCores" : [0,1,2,3] }, { "name" : "app2", "fileName" : "../mad-loader/examples/app_2/build/app_2.exe", "allowedCores" : [0,1,2,3] } ],

"appDeployment" : [ "app1", "app2", "app1", "app2" ] }

部署配置文件(预链接器模式)

部署配置文件用于为MAP工具指定以下信息:
 · 设备每个核心上所需的内存分区 
 · 分区的属性和访问权限
 · 要部署的应用程序

部署配置文件采用JSON格式。部署配置文件包含以下部分:
1.设备名称:此JSON对象标识目标设备。
2.分区:这部分标识内存分区及其属性。用户通过指定段标识符来控制ELF段在分区中的位置
(节名)。partitions是一个结构列表。每个结构都有以下对象:
        1.名称:分区的名称。这在MAP工具调试日志中用作分区标识符
        2.vaddr:分区的虚拟地址。对于没有虚拟寻址的设备,这将是物理地址。
        3.paddr:分区的物理地址。这是一个按设备CoreId编制索引的有序列表。给定索引处的值指定与该核心的虚拟地址相对应的物理地址。对于没有虚拟内存寻址的设备,vaddr和paddr将是相同的。
        4.size:内存分区的大小(以字节为单位)。
        5.secNamePat:节名称模式。这是一个用于标识ELF段的正则表达式字符串。MAP工具将把所有具有匹配节名的段放入这个内存分区。
        6.核心:此分区的适用核心列表。
        7.权限:适用于分区的访问权限列表。允许的值有SR(主管读取)、SW(主管写入)、SX(主管执行)、UR(用户读取)、,
UW(用户写入)、UX(用户执行)。
        8.cacheEnable:启用/禁用缓存。允许的值为True和False。这是一个可选参数,默认值为True。
        9.预取:启用/禁用预取。允许的值为True和False。这是一个可选参数,默认值为False。
        10.shared:指定分区是否在不同核心上的应用程序之间共享。允许的值为True和False。
        11.loadPartition:指定分区是否为Load分区。ROMFS映像将被下载到此分区。MAP工具将尝试使该分区中的Execute段为XIP。允许的值为True和False。这是一个可选参数,默认值为False。系统中只能/必须只有一个加载分区。MAD加载程序映像被XIP放置在加载分区中。
        12.优先级:指定虚拟内存映射的优先级。数字越大,优先级越高。当虚拟内存映射重叠时使用优先级。这是一个可选参数,默认值为0。
3.应用程序:本节指定要加载到设备上的应用程序。应用程序是一个结构列表。每个结构都有以下对象:
        1.name:指定应用程序的名称或别名。
        2.filename:包含应用程序ELF可执行文件的完整路径的文件名。
        3.libPath:指定应用程序使用的共享库的路径。
        4.allowedCores:应用程序可以在其上运行的内核列表。
4.appDeployment:指定在初始启动时要加载到每个核心上的应用程序。这是一个由core-id索引的应用程序名称的有序列表。如果必须在没有应用程序的情况下启动核心,则应指定一个空字符串。
C6678设备的部署配置示例如下所示:

"deviceName" : "C6678", "partitions" : [ { "name" : "ddr-code", "vaddr" : "0x9e000000", "paddr" : [ "0x81e000000", "0x81e000000", "0x81e000000", "0x81e000000","0x81e000000", "0x81e000000", "0x81e000000", "0x81e000000" ], "size" : "0x1000000", "secNamePat": ["^.text", "const", "switch"], "cores" : [0,1,2,3,4,5,6,7], "permissions": ["UR", "UX", "SR", "SX"], "cacheEnable": true, "prefetch" : true, "priority" : 0, "shared" : true, "loadPartition" : true }, { "name" : "ddr-data", "vaddr" : "0xD0000000", "paddr" : [ "0x800000000", "0x801000000", "0x802000000", "0x803000000", "0x804000000", "0x805000000", "0x806000000", "0x807000000" ], "size" : "0x1000000", "secNamePat": ["stack", "^.far$", "args", "neardata", "fardata", "rodata"], "cores" : [0,1,2,3,4,5,6,7], "permissions": ["UR", "UW", "SR", "SW"], "cacheEnable": true, "prefetch" : true, "priority" : 0, "shared" : false } ],

"applications" : [ { "name" : "app1", "fileName" : "../mad-loader/examples/app_1/build/app_1.exe", "libPath" : "../mad-loader/examples/shlibs/build", "allowedCores" : [0,1,2,3,4,5,6,7] }, { "name" : "app2", "fileName" : "../mad-loader/examples/app_2/build/app_2.exe", "libPath" : "../mad-loader/examples/shlibs/build", "allowedCores" : [0,1,2,3,4,5,6,7] } ],

"appDeployment" : [ "app1", "app2", "app1", "app2", "app1", "app2", "app1", "app2" ] }

MAP工具调用

对于预链接模式,MAP工具被调用为:<syntaxhighlightlang=“javascript”>python maptool.py<maptoolCfg.json></syntaxhighlight>
对于预链接旁路模式,MAP工具被调用为:<syntaxhighlightlang=“javascript”>python maptool.py<maptoolCfg.json>bypass prelink</syntaxhighlight>其中maptoolCfg.json是json格式的输入配置文件

6.2 Demo演示

预链接器旁路模式demo

本节将介绍C6670 EVM预链接旁路模式下的MAD流程示例。mad-utils包包含一些将在此处使用的示例应用程序。

STEP-1:镜像准备

 · 将目录mad-loader/examples/中的示例应用程序app_1、app_2构建为静态可执行文件。

在“mad-loader/examples”目录中提供了用于构建示例的构建脚本。要将示例构建为静态可执行文件,请将构建脚本调用为:

./build_examples_lnx.sh C6670 little static

上述步骤应创建将在设备上运行的应用程序集

 · 构建MAD加载程序组件:
         · MAD Loader库
         · NML Loader
         · MAD Loader应用

可以用如下的调用“mad-loader”目录中提供的构建脚本来构建mad-loador可执行文件。

./build_loader_lnx.sh C6670

STEP-2:部署配置准备

负载分区规格:

{
"name"          : "load-partition",
"vaddr"         : "0x9e000000",
"size"          : "0x2000000",
"loadPartition" : true
}
STEP-3:调用MAP工具

 · 使用以上信息为Map工具创建一个部署配置文件。此示例的示例部署配置在mad-utils包中作为映射工具/config文件提供
/deployment_template_C6670_bypass_prelink.json.
 · 创建MAP工具的配置文件。此示例的示例配置在mad-utils包中作为映射工具/config文件提供
/maptoolCfg_C6670_bypass_prelink.json.
在Linux bash shell上调用MAP工具:
python maptool.py config-files/maptoolCfg_C6670_bypass_prelink.json bypass-prelink
检查输出镜像
c6670-l.bin已在中创建/images目录。

STEP-4:设备上的应用程序部署

目标板应在板I2C EEPROM上对IBL进行编程和配置。有关编程和配置IBL的详细信息,请访问http://linux-c6x.org/wiki/index.php/Bootloaders (http://linux-c6x.org/wiki/index.php/Bootloaders). 

以下应为要编程到IBL配置中的blob配置参数:

startAddress = 0x9e000000.

branchAddress = 0x9e001040.

将输出映像c6670-le.bin放入主机上运行的TFTP服务器的根目录中。
接通目标板卡的电源,等待约10秒。该设备现在应该已经下载了ROMFS映像,并在所有核心上部署了示例应用程序。
以下是验证示例应用程序是否已成功部署在核心上的过程:

 · 将CCS连接到核心
 · 加载在该核心上运行的应用程序的标识
 · 验证变量签名的值是否为<app name><core id>。例如app1core0

预链接器模式demo

本节将介绍C6678 EVM上预链接器模式下的MAD流程示例。mad-utils包包含一些将在此处使用的示例应用程序和DSO

STEP-1:镜像准备

 · 在目录mad-loader/examples/shlibs/中构建示例共享库作为动态可重定位对象
 · 将目录mad-loader/examples/中的示例应用程序app_1、app_2构建为动态可重定位对象
“mad-loader/examples”目录中提供了一个构建examples的构建脚本。要将示例构建为可重定位对象,请将构建脚本调用为:

./build_examples_lnx.sh C6678 little relocatable

上述步骤应创建将在设备上运行的一组应用程序/DSO

 · 构建MAD加载程序组件:
         · MAD加载器库
         · NML装载机
         · MAD装载机应用
可以如下调用“mad-loader”目录中提供的构建脚本来构建mad-loador可执行文件:

./build_loader_lnx.sh C6678

STEP-2:设备内存分区和部署配置准备

对于本例,我们将把所有可执行段和所有数据段放在DDR内存中。对于数据段,DDR存储器在8个核心之间被平均分区。因此,我们需要为设备创建2个内存分区,1个给程序段一个给数据段。

分区-1(用于代码):

{
"name"        : "ddr-code",
"vaddr"       : "0x9e000000",
"paddr"       : [ "0x81e000000", "0x81e000000", "0x81e000000", "0x81e000000","0x81e000000", "0x81e000000", "0x81e000000", "0x81e000000" ],
"size"        : "0x1000000",
"secNamePat"  : ["^.text", "const", "switch"],
"cores"       : [0,1,2,3,4,5,6,7],
"permissions" : ["UR", "UX", "SR", "SX"],
"cacheEnable" : true,
"prefetch"    : true,
"priority"    : 0,
"shared"      : true,
"loadPartition" : true
}

分区-1也被标记为加载分区,因为下载的ROMFS映像将被放置在这里。MAP工具将可执行段放置在此分区XIP(Execute In Place)中。MAD加载程序也放置在这个分区中。

分区-2(用于数据):

{
"name"         : "ddr-data",
"vaddr"        : "0xD0000000",
"paddr"        : [ "0x800000000", "0x801000000", "0x802000000", "0x803000000", "0x804000000", "0x805000000", "0x806000000", "0x807000000" ],
"size"         : "0x1000000",
"secNamePat"   : ["stack", "^.far$", "args", "neardata", "fardata", "rodata" ],
"cores"        : [0,1,2,3,4,5,6,7],
"permissions"  : ["UR", "UW", "SR", "SW"],
"cacheEnable"  : true,
"prefetch"     : true,
"priority"     : 0,
"shared"       : false
}
STEP-3:调用MAP工具

 · 使用上面的信息为Map工具创建一个部署配置文件。此示例的示例部署配置在mad-utils包中作为映射工具/config文件提供
/deployment_template_c6678.json.
 · 创建MAP工具的配置文件。此示例的示例配置在mad-utils包中作为映射工具/config文件提供
/maptoolCfg_c6678.json.
在Linux命令shell上调用MAP工具:
python maptool.py config-files/maptoolCfg_c6678.json
 · 检查输出镜像
c6678-le.bin has been created in ./images directory.

STEP-4:设备上的应用程序部署

目标板应在板I2C EEPROM上对IBL进行编程和配置。有关编程和配置IBL的详细信息,请访问http://linuxc6x.org/wiki/index.php/Bootloaders(http://linux-c6x.org/wiki/index.php/Bootloaders)。以下应为要编程到IBL配置中的blob配置参数:

 · startAddress = 0x9e000000.

 · branchAddress = 0x9e001040

将输出映像c6678-le.bin放入主机上运行的TFTP服务器的根目录中。
接通目标板的电源,等待约10秒。该设备现在应该已经下载了ROMFS映像,并在所有核心上部署了示例应用程序。
以下是验证示例应用程序是否已成功部署在core上的过程:

 · 将CCS连接到核心。加载中MAP工具创建的CCS GEL文件/images目录。该GEL文件将具有为示例应用程序加载符号的功能。
 · 运行GEL函数以刷新在该内核上运行的应用程序的符号。
 · 验证变量签名的值是否为<app name><core id>。例如app1core4

6.3 软件概述

MAD Loader概述

代码组织

./examples:此文件夹包含用于测试MAD流的示例应用程序和DSO

./mal:此文件夹包含MAD加载程序库和加载程序应用程序的源

/nmlLoader:此文件夹包含NML的来源。NML是MAD加载器的子组件,并且驻留在保留的虚拟地址空间中。

编译说明

注意:在WINDOWS环境下构建:在WINDOWS平台上构建需要GNU实用程序,如“make”。Windows构建环境需要安装MINGW-MSYS。MINGW-MSYS可从http://sourceforge.net/projects/mingw/files/

生成环境设置:在开始生成之前,必须完成以下环境设置

 · 变量C_DIR应设置为代码生成工具的顶部目录。
 · 代码生成工具二进制文件应该在路径中。

Linux bash shell: export C_DIR=/opt/TI/TI_CGT_C6000_7.2.4 export PATH=/opt/TI/TI_CGT_C6000_7.2.4/bin:$PATH

MSYS bash shell: export C_DIR='"C:/Program Files/Texas Instruments/C6000 Code Generation Tools 7.2.4"' export PATH=/c/Program\ Files/Texas\ Instruments/C6000\ Code\ Generation\ Tools\ 7.2.4/bin:$PATH

构建脚本:当前目录中提供了用于构建MAD加载程序的示例构建脚本。在构建脚本中修改上述环境变量,以适应现有的构建环境。

 · build_loader_lnx.sh:在Linux bash shell中构建MAD加载程序的脚本
 · build_loader_msys.sh:在msys bash shell中构建MAD加载程序的脚本

生成脚本用法:

对于小端构建,脚本被调用为:

./build_loader_lnx.sh device_name

对于大端构建,脚本被调用为:

./build_loader_lnx.sh device_name big where device name can be C6670 or C6678

示例应用程序:

示例应用程序可以使用“mad-loader/examples”目录中提供的示例构建脚本来构建。上面提到的环境变量必须在构建脚本中进行修改。构建脚本的用法如下:

./build_examples_lnx.sh C6678|C6670 big|little [static|relocatable]

关于MAD加载器构建MAD加载器库的详细信息:

用于构建MAD加载程序库的makefile位于目录“mal/malLib/build

以下是构建MAD加载程序库的步骤:<syntaxhighlightlang=“bash”>cd mal/malLib/build make DEVICE=<设备编号:支持的设备编号为C6670、C6678></syntaxhighlight>MAD加载应用程序:

The makefile for building the MAD loader library is in the directory "mal/malApp/build"

由于MAD加载器应用程序链接MAD加载器库,因此必须在构建MAD加载器程序之前构建MAD加载程序库

以下是构建MAD加载程序库的步骤:<syntaxhighlightlang=“bash”>cd mal/malApp/build make DEVICE=<设备编号:支持的设备编号为C6670、C6678></syntaxhighlight>

MAD加载程序应用程序需要是DDR中的XIP。链接器命令文件“lnk_<device number>.cmd”用于确保MAD加载程序应用程序绑定到DDR中的XIP地址。
重要提示:MAD加载程序应用程序需要用于堆栈、堆和全局变量的RW区域。默认情况下,链接器命令文件已设置为将RW区域分配到DDR内存的末尾。这可以由用户根据目标执行环境来改变。用户应该注意,这个内存不应该被正在加载的应用程序使用。应注意避免在应用程序/部署配置文件中使用此区域。

NML:

用于生成NML的makefile位于目录“nmlLoader/build”中

以下是构建NML的步骤:<syntaxhighlightlang=“bash”>cd nmlLoader/build make DEVICE=<DEVICE number:支持的设备号为C6670、C6678></syntaxhighlight>

由于NML是DDR中的XIP,因此必须确保NML代码段绑定到DDR中为XIP的虚拟地址。NML是加载在DDR上的ROM文件系统的一部分。如果NML ELF文件的偏移量在ROM文件系统中发生变化,则需要修改该地址。如果MAD加载程序应用程序的大小发生变化,就会发生这种情况。为了在ROM文件系统中获得NML的当前偏移量,请试运行MAP工具,MAP工具将创建一个文件/tmp/fsOffsets.txt。此文件将列出文件系统中所有文件的偏移量。链接器命令文件“lnk_<device number>.cmd”用于确保NML绑定到DDR中的XIP地址。

重要提示:NML还需要堆栈和全局变量的RW区域。默认情况下,链接器命令文件已设置为将RW区域分配到DDR内存的末尾。这可以由用户根据目标执行环境来改变。用户应该注意,这个内存不应该被正在加载的应用程序使用。应注意避免在应用程序/部署配置文件中使用此区域。

MAD Loader APIs

MAD加载程序库可以由应用程序链接,以提供应用程序部署服务。本节介绍MAD加载程序库提供的API。

Loader APIs:

int mal_lib_init (void *load_partition_addr): API to initialize the library int mal_lib_stop_core

(unsigned int coreId): API to stop a core. Non graceful forced shutdown. int mal_lib_load_core

(unsigned int coreId, char *appName): API to load and run an APP on a given core.

File System APIs:

int mal_lib_fopen (const char *filename): API to open a file stream

int mal_lib_fclose (int file_handle): API to close a file stream

int mal_lib_fsize (const char *filename, unsigned int *size): API to get the file size

unsigned int mal_lib_fread (void *ptr, unsigned int size, unsigned int count, int file_handle): API to read from a file stream

int mal_lib_fseek (int file_handle, unsigned int offset, int origin): API to seek to a position in a file

long mal_lib_ftell (int file_handle): API to get the current offset in the file

6.4 在目标上调试应用程序

预链接器模式:

在预链接模式下使用MAD工具时,应用程序将预链接到部署配置文件中指定的内存地址。预链接器在执行重定位时不会更新ELF文件中的DWARF信息。因此,为了使用重新定位的图像进行符号调试,MAP工具生成一个CCS GEL文件,该文件将应用程序的重新定位信息提供给CCS调试服务器。该GEL是在“./images”目录中创建的。

预链接器旁路模式:

在预链接器旁路模式下,应用程序可执行文件不会重新定位。因此,目标调试功能将正常工作。

使用CCS加载和运行MAD链接镜像:

有时,使用CCS加载和运行输出镜像进行初始测试是很有用的。

请按照以下步骤使用CCS加载并运行镜像:

 · 启动CCS并加载EVM的配置文件
 · 连接到核心0
 · 打开内存浏览器(查看-->内存)并导航到0x9E000000
 · 在内存浏览器上单击鼠标右键,然后选择“加载内存”;浏览并选择上一步生成的图像(*.bin)(您可能需要更改文件类型选项才能查看.bin文件);按“下一步”
 · 输入0x9E000000作为起始地址。
 · 请确保您选择的类型大小(C6678情况下为32位)。单击“完成”
 · 要运行程序,请打开核心0的寄存器浏览器(查看-->寄存器)
 · 将PC(程序计数器)更改为0x9E001040
 · 运行核心0

注意:您将无法在CCS控制台中看到printfs的输出,但如果您的图像在UART中打印消息,您应该能够看到输出

七、一些有用的参考

镜像处理演示:此演示使用MAD工具进行多核部署,可以作为一个有用的示例参考。用户指南可http://processors.wiki.ti.com/index.php/MCSDK_Image_Processing_Demonstration_Guide(http://processors.wiki.ti.com/index.php/MCSDK_Image_Processing_Demonstration_Guide)

C66x多核DSP论坛:为MAD实用程序提供技术支持。http://e2e.ti.com/support/dsp/c6000_multicore_dsps/default.aspx(http://e2e.ti.com/support/dsp/c6000_multicore_dsps/default.aspx)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值