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.

[参考译文] TMS320F28377S:SFRA 使我的程序崩溃、并且可能是链接器问题

Guru**** 2321550 points
Other Parts Discussed in Thread: SFRA, TMS320F28377S
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/564684/tms320f28377s-sfra-makes-my-program-crashes-and-probably-linker-problem

器件型号:TMS320F28377S
主题中讨论的其他器件:SFRA

我已经为具有 SFRA 库的 TMS320F28377S 准备了一个新项目。 该库的添加方式与 F2877S 的"spruhz5a"和 数字降压示例中的添加方式相同。

当我按"Connect to the GUI"、程序跳至 ILLEGAL_ISR 时、就会出现此问题。 当我取消注释 SFRA_F_INject 和 SFRA_F_Collect 时、或者当我未连接到 GUI 时、程序似乎正常工作。 我的链接器脚本基于 数字降压示例、并进行了一些修改、例如新扩展名为".TI.ramfunc"。

我观察到了 SFRA_F_INject 函数的奇怪行为 。 当我将参数设置为0.5时、它返回大约2000而不是0.5。

我不理解有关 SFRA_F_Collect 和 SFRA_F_Inject 的警告-请参阅附件。 这意味着什么?

 甚至 SFRA 也被禁用。

============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ 用于
从闪存运行的*//*特定于用户的链接器命令文件*/
/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== */
/*文件:F28069_flash_DP_BoosterPack.CMD */
* */
/*说明:用户自定义段的链接器命令文件、专用于从
闪存运行*//*。*/
* */
/*目标:TMS320F28069*/
* */
*版本:1.00*/
* */
//*--------------------------------------------------------------------------------------------------------------- */
/*版权所有德州仪器(TI)Copyright2015*/
//*--------------------------------------------------------------------------------------------------------------- */
/*修订历史记录: */
//*--------------------------------------------------------------------------------------------------------------- */
/*日期|说明 */
//*--------------------------------------------------------------------------------------------------------------- */
* 01/20/15|版本1.0新版本。 */
//*--------------------------------------------------------------------------------------------------------------- //
//*定义 F2806x
页的内存块开始/长度0将用于组织程序段
页1将用于组织数据段

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

可组合连续 SARAM 存储器块
如果需要创建更大的存储器块。
*/
MEMORY
{
PAGE 0:
/* BEGIN 用于"引导至 SARAM"引导加载程序模式*/

BEGIN:origin = 0x000000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS0:origin = 0x008000、length = 0x000800
RAMLS1_LS2 :origin = 0x008800,length = 0x001800
// RAMLS3:origin = 0x009800,length = 0x000800
RAMLS4:origin = 0x00A000、length = 0x000800
reset:origin = 0x3FFFC0,length = 0x000002

page 1:

boot_RSVD :origin = 0x000002、length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
RAMD1 :origin = 0x00B800,length = 0x000800

RAMLS5 :origin = 0x00A800,length = 0x000800

RAMGS0 :origin = 0x00C000、length = 0x001000
RAMGS1 :origin = 0x00D000、length = 0x001000
// RAMGS2 :origin = 0x00E000、length = 0x001000
RAMGS3 :origin = 0x00FE20、length = 0x0001E0
RAMGS4 :origin = 0x010000,length = 0x002000
RAMGS5 :origin = 0x012000,length = 0x001000
RAMGS6 :origin = 0x013000、length = 0x001000
RAMGS7 :origin = 0x014000、length = 0x001000
RAMGS8 :origin = 0x015000,length = 0x001000
RAMGS9 :origin = 0x016000,length = 0x001000
RAMGS10 :origin = 0x017000、length = 0x001000
RAMGS11 :origin = 0x018000、length = 0x001000
RAMGS12 :origin = 0x019000、length = 0x001000
RAMGS13 :origin = 0x01A000、length = 0x001000
RAMGS14 :origin = 0x01B000、length = 0x001000
RAMGS15 :origin = 0x01C000、length = 0x001000

DataRAM :origin = 0x009800,length = 0x000800//片上 RAM 块 LS3 */

IQTABLES:origin = 0x00E000,length = 0x000B50 // RAMGS2的一部分中的 IQ Math 表*/
IQTABLES2:origin = 0x00EB50,length = 0x00008C // RAMGLS2的一部分
中的 IQ Math 表*:*: origin = 0x00EBDC、length = 0x0000AA/* RAMGS2中的 IQMath 表*/
IQMath :origin = 0x00EC86,length = 0x000afa// RAMGS2和 RAMGS3中的 IQMath 函数*/
FPUTABLES:origin = 0x00F780,length = 0x0006A0// RAMGS2和 RAMGS3中的 FPU 表*/


}//

////*将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
闪存时执行
ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*/

段
{
//分配程序区域:*/
.cinit :> RAMM0, PAGE = 0.Pinit
:> RAMM0, PAGE = 0.text
:>>RAMM0| RAMD0| RAMLS0 | RAMLS1_LS2,PAGE=0

codestart :>开始 PAGE = 0

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
.TI.ramfunc:>> RAMLS1_LS2 | RAMLS4,PAGE = 0
{
--library=SFRA_F_Lib.lib 
--library=SFRA_F_Lib.lib 

}
#else
ramfuncs :>> RAMLS1_LS2 | RAMLS4,PAGE = 0
{

--library=SFRA_F_Lib.lib 
--library=SFRA_F_Lib.lib 
}
#endif
#endif


/*分配未初始化的数据段:*/
.stack :> RAMM1 PAGE = 1.ebss
:>> RAMLS5 | RAMGS0 | RAMGS1 PAGE = 1
.esysmem :> RAMLS5 PAGE = 1

/*初始化段进入闪存*/
.econst :> RAMLS5,page = 1.
switch :> RAMM0, PAGE = 0.reset

:>重置, PAGE = 0、TYPE = DSECT /*未使用、*/

IQmath :> IQMath, PAGE = 1
IQmathTables :>IQTABLES,page =1
FPUmathTables:>FPUTABLES,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 ***** /
//* ADCADRV_1CH 部分*/
ADCADRV_1CH_SECTION:> DataRAMPAGE = 1

//* ADCDRV_4ch 段*/
ADCDRV_4ch_SECTION:> DataRAMPAGE = 1

//* CNTL_2P2Z 段*
/ CNTL_2P2Z_SECTION:> DataRAMPAGE = 1
CNTL_2P2Z:> DataRAM
>DataRAMpage = 1

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

/* DACDRV_ramp section */
DACDRV_DAC_1*1:1 DCD_OCH_SECTION:* 1 DRAM_OCH * 1


>DataRAMpage = 1
DLOG_buff:>DataRAMpage = 1

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

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

/ DataPFC_INVSQR section*/
PFC_INVSQR_SECTION*:/PWRV_PWRV_SECTION*


1 *:/PWRV_PWRV_SECTION 1 * 1 * >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/*

SFRA Data */
SFRA_F_Data:> DataRAM,align = 64,page = 1

} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.我建议在未连接 GUI 时进行调试。

    2.我建议创建两个变量,而不是传递 sturcture.Element。元素传递变量(这听起来可能很愚蠢,但希望消除编译器可能生成的任何问题,我从未传递 structure.Element 参数。

    3.在 SFRA 不工作的正常操作下,您是否得到 SFRA_INPUT 的返回值等于输入,即在代码 BuckBoost.DC.doDuty1ASlewed = BuckBoost.DC.Duty1A?

    4.是否调用 SFRA_F_init 例程??