This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CLA 与28035内存问题有关。 当.text 变得太大时、CLA 停止工作

Guru**** 2601915 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/677611/cla-on-28035-memory-issue-cla-stops-working-when-text-becomes-too-large

您好! 我正在尝试对项目使用 CLA。 我从28035的一个工作 CLA 示例 ADC_CLA 开始。 然后、我向 CLA 代码中添加了更多内容、这些内容可以正常工作、直到.text 不再适用。 然后我尝试扩展 .text 的可用空间、但这会导致 CLA 不再工作。 我需要一些帮助! 下面是链接器代码以及内存分配图。

在图中、.text 位于 RAML0L1中、几乎已满。 此时代码工作正常。 如果我添加更多的内容、.text 将不再适用、并开始进入 RAML3。 它将进行编译、但 CLA 将不再工作、我获得了"非法 ISR"。 有人可以提供一些建议吗?

/*
// TI 文件$Revision:/main/1 $
//签入$Date:2009年3月18日09:16:06 $
//##########################################################################################
//
////文件:28035_RAM_CLA_lnk.cmd
//
//标题:针对运行于 RAM 之外的28035示例的链接器命令文件
//
这仅包括28035器件上的所有 SARAM 块。
// 这不包括闪存或 OTP。
//
// 请记住、L0、L1、L2和 L3受代码//保护
安全模块。
//
// 这意味着、在大多数情况下、您需要移至
// 另一个定义了更多存储器的存储器映射文件。
//
//##########################################################################################################################
//$TI 发行版:2803x C/C++头文件 v1.21 $
//$发行 日期:2009年12月1日$
//####################################################################################
/*

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//对于 Code Composer Studio V2.2和更高版本
//------------
//除了这个内存连接器命令文件之外,
//将头连接器命令文件直接添加到项目中。
//将
//外设结构链接到
//内存映射中的适当位置需要使用头链接器命令文件。
//
//可以在中找到头文件链接器 \DSP2803x_headers\cmd
//
//对于 BIOS 应用添加: DSP2803x_Headers_BIOS.cmd
//对于非 BIOS 应用程序,添加:DSP2803x_Headers_nonBIOS.cmd
========================================================================================== /*

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//对于 V2.2之前的 Code Composer Studio
,//----------------
// 1)使用以下-l 语句之一在
工程中包含//头链接器命令文件。 将
外设结构链接到
存储器映射中的适当//位置需要使用头链接器//文件 //

////*取消注释此行以仅包括非 BIOS 应用程序的文件*//
/*-l DSP2803x_Headers_nonBIOS.cmd */

//*取消注释此行以仅包括 BIOS 应用程序的文件*//
*-l DSP2803x_Headers_BIOS.cmd */

* 2)在项目中添加路径 \DSP2803x_headers\cmd 至
project->build options、linker tab、
library search path (-i)下的库搜索路径。
/*================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ //

*定义 DSP2803x
页0的存储器块开始/长度将用于组织程序段
页1将用于组织数据段

注:
F28035上的存储器块是一致的(也是相同的
物理存储器)。
不应该是相同的存储器区域
同时为 PAGE 0和 PAGE 1定义。
这样做将导致程序损坏
和/或数据。

L0块被镜像-就是这样
可在高内存或低内存中访问。
为简单起见、其中仅使用了一个实例
链接器文件。

可组合连续 SARAM 存储器块
如果需要创建更大的存储器块。
*/

MEMORY
{
PAGE 0:
/* BEGIN 用于"引导至 SARAM"引导加载程序模式*/

BEGIN :origin = 0x000000,length = 0x000002
RAMM1 :origin = 0x000480,length = 0x000380 /*片上 RAM 块 M1 */
RAML0L1 :origin = 0x008000、length = 0x000C00
RAML3 :origin = 0x009000,length = 0x001000
reset :origin = 0x3FFFC0、length = 0x000002
IQTABLES :origin = 0x3FE000、length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
IQTABLES2 :origin = 0x3FEB50、length = 0x00008C /*引导 ROM 中的 IQMath 表*/
IQTABLES3 :origin = 0x3FEBDC,length = 0x0000AA//引导 ROM 中的 IQMath 表*/

引导 ROM :origin = 0x3FF27C,length = 0x000D44


page 1:

boot_RSVD :origin = 0x000002,length = 0x00004E // M0的一部分,引导 ROM 将此用于栈*/
RAMM0 :origin = 0x000050、length = 0x0003B0
DataRAM :origin = 0x008C00,length = 0x000400// RAML2 */
CLA_CPU_MSGRAM:origin = 0x001480、length = 0x000080
CPU_CLA_MSGRAM:origin = 0x001500,length = 0x000080
}


SECTIONS
{//
设置“引导至 SARAM"模式:
codestart 段(可在 DSP28_CodeStartBranch.asm 中找到)
将执行重定向到用户代码的开始。 */
codestart :>开始, PAGE = 0
ramfuncs :> RAMM1 PAGE = 0.text
:>> RAML0L1 | RAML3,PAGE = 0 /*默认代码段*/
.cinit :> RAMM1, page = 0 /*初始化变量*/
.pinit :> RAMM1, page = 0 /*全局构造函数表*/
.switch :> RAMM1, PAGE = 0.reset
:>重置, PAGE = 0、TYPE = DSECT /*未使用、*/

.stack :> RAMM0,PAGE = 1 align (2)/* stack:偶数字对齐*/
.ebss :> DataRAM, PAGE = 1.econst
:> DataRAM, PAGE = 1
.esysmem :> DataRAM, PAGE = 1

IQmath :> RAML0L1,page = 0
IQmathTables :> IQTABLES,PAGE = 0,TYPE = NoLoad

Cla1Prog :load = RAML0L1,
运行= RAML3、
load_start (_Cla1funcsLoadStart)、
load_size (_Cla1funcsLoadSize)
run_start (_Cla1funcsRunStart)、
PAGE = 0

Cla1ToCpuMsgRAM:>CLA_CPU_MSGRAM,PAGE = 1
CpuToCla1MsgRAM:>CPU_CLA_MSGRAM,PAGE = 1

//如果调用 IQNexp()或 IQexp(),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
//
/*
IQmathTables2:> IQTABLES2,page = 0,type = NoLoad
{

IQMath.lib (IQmathTablesRam)

}
*/
/*如果调用 IQNasin()或 IQasin(),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
//
/*
IQmathTables3:> IQTABLES3,page = 0,type = NoLoad
{

IQMath.lib (IQmathTablesRam)

}
*/

}


段
{
/******* DPLIB 部分 C28x ***** /*
ADCDRV_1CH 部分*/
ADCDRV_1ch_Section:> DataRAMpage = 1

/* ADCDRV_4ch section */
ADCDRV_4ch_Section:> DataRAMpage = 1/*

CNTL_2P2Z section */
CNTL_2P2P2Z_Section:> DataRAMpage = 1 CNTL_2P2Z_SECTION
:> DataRAM page = 1 CNTL_2P2Z
>DataRAMpage = 1/*

CNTL_3P3Z section */
CNTL_3P3Z_Section:>DataRAMpage = 1
CNTL_3P3Z_InternalData:>DataRAMpage = 1
CNTL_3P3Z_Coef:>DataRAMpage = 1/*


DLOG_4CH section */
DLOG_DLOG_SECTION:>DataRAM page = 1 CNTL_3P3Z_COef:>DataRAM page
= 1>DataRAMpage = 1/*

MATH_EMAVG section */
MATH_EMAVG_SECTION:> DataRAMpage = 1/*

PFC_ICMD section*/
PFC_ICMD_SECTION:> DataRAMpage = 1/*

PFC_INVSQR section*/
PFC_INVSQR_Section:> DataRAMpage = 1/*

PWMDCH_RV_SECTION * PWMDCH_SECTION
>DataRAMpage = 1

/* PWMDRV_1chHIRes driver section */
PWMDRV_1chHIRes_Section:> DataRAMpage = 1

/* PWMDRV_PFC2PHIL driver section */
PWMDRV_PFC2PHIL_Section:> DataRAMpage = 1

/* PWMDRV_PSRV_UDPWCLV_SECTION
* PWMDRV_DUT_UPWMDRV_SECTION:* PWMDRV_UPDRV_SECTION *


>DataRAMpage = 1/*

PWMDRV_ComplPairDB driver section */
PWMDRV_ComplPairDB_Section:>DataRAMpage = 1/*

ZeroNet_Section */
ZeroNet_Section:> DataRAMpage = 1/*****

DPLIB 部分 CLA ***** /
//* ADCDRV_1ch_CLA 部分*/
ADCDRV_1ch_CLA_SECTION:> CPU_CLA_MSGRAM页面= 1

/* ADCDRV_4ch_CLA 部分*
/ ADCDRV_4ch_CLA_SECTION:> CPU_CLA_MSGRAM页面= 1

/* CNTL_2P2Z_CLA_CLA_CONTROLLER *部分
:>CPU_CLA_MSGRAM,PAGE = 1
CNTL_2P2Z_CLA_InternalData:> CLA_CPU_MSGRAM,ALIGN = 64,PAGE = 1
CNTL_2P2Z_CLA_COef:>CPU_CLA_MSGRAM,ALIGN = 64,PAGE = 1

//* CNTL_3P3Z_CLA 控制器段*
/ CNTL_3Z_CLA_SECTIONS:>CPU_CLA_MSGRAMpage = 1
CNTL_3P3Z_CLA_InternalData:>CLA_CPU_MSGRAMpage = 1
CNTL_3P3Z_CLA_COef:>CPU_CLA_MSGRAMpage = 1

/* MATH_EMAD_CLA_CLA SECTIONS */
MATH_EMAVG_CLA_SECTIONS:>CPU_CLA_MSCLA_CLA_CLA_CLA_SECTIONS= 1
MP_CLA_CLA_CLA_CLA_INCLA_CLA_CLA_CLA_SECTIONS:>1 CMPA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_INCR_SECTIONS



:>1


>CPU_CLA_MSGRAMpage = 1
PFC_INVSQR_CLA_InternalData:>CPU_CLA_MSGRAMpage = 1

/* PWMDRV_1ch_CLA driver section */
PWMDRV_1ch_CLA_SECTION:> CPU_CLA_MSGRAMpage = 1

// PWMDRV_1chHICRV_CLA_SECTION
* PWMDRV_CLA_CLA_CLA_CLA_CLA_CLA_SECTION:* PWMCLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_PWMCLA_CLA_CLA_SECTION:* PWMCLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLR_SECTION:* PWMCLA_CL


>CPU_CLA_MSGRAMpage = 1

/* PWMDRV_PSFB_CLA driver section */
PWMDRV_PSFB_CLA_SECTION:> CPU_CLA_MSGRAMpage = 1

/* PWMDRV_DualUpDwnCnt_CLA driver section */
PWMDRV_DualUpDwnCLA_CLA_CLA_CLA_CLA_CLA driver*


****** 1 * PWMDRV_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA driver_CLA driver_CLA section:*/PWMDR_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA_CLA Compl_CLA driver_CLA_CLA_CLA section:*

*****
>cpu_cla_MSGRAMpage = 1


}


/*
//===================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Niclas Samuelsson"].text :>> RAML0L1 | RAML3,page = 0 /*默认代码部分*/

    [引用用户="Niclas Samuelsson"]

     Cla1Prog         : LOAD = RAML0L1,
                          RUN = RAML3,
                          LOAD_START(_Cla1funcsLoadStart),
                          LOAD_SIZE(_Cla1funcsLoadSize)
                          RUN_START(_Cla1funcsRunStart),
                          PAGE = 0

    [/报价]

    您好、Niclas、

    我认为您需要更改您的 CLA 运行地址。 CLA 运行地址和文本部分重叠。 请告诉我这是否能解决您的问题。

    谢谢

    Vasudha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在、我让.text 在 RAML0L1已满时使用 RAMM1、而不是 RAML3。 现在程序运行正常、但我需要在.text 中添加更多内容、因此它也不适合 RAMM1。

    除了 CLA 之外、是否没有 RAML3 (origin = 0x009000、length = 0x001000)可用于任何其他用途? RAML3占用的空间非常小、因此我想我可以将其分为两个部分、并将其中一个部分用于.text。 但这是不可能的?  

    BR Niclas  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Niclas、

    您可以看到数据表的第6.1.8节 L0 SARAM 以及 L1、L2和 L3 DPSARAM。 另请参阅第6.2节"存储器映射"。

    如果您使用的是 CLA,RAML3需要专用于其程序空间。 为此、C28x 必须使用 MEMCFG 寄存器为 CLA 程序空间配置它、这意味着 C28x 不能将它用于其程序空间。

    您能否将 C28x 程序移至闪存? 这将为 C28x 程序(.text)提供更多内存。 您可以将任何时间关键的程序段放入.TI.ramfunc 中。

    或者、您也可以手动管理 RAML3存储块。 如果您可以确保 CLA 当前没有使用它、则可以将它配置回 C28x 以使 C28x 执行程序。 然后、当 CLA 的程序需要它时、您可以将其配置回 CLA、只要执行此配置的代码不在 L3中、 您可以确保在 CLA 正在运行并且为 CLA 配置了 L3时、C28x 不会从 L3运行。

    希望这对您有所帮助。

    SAL