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.

[参考译文] CCS/TMS320F2.8377万D:执行时无法找到特定内存

Guru**** 2589245 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/654370/ccs-tms320f28377d-unable-to-find-specific-memory-while-execution

部件号:TMS320F2.8377万D
主题中讨论的其他部件:C2000WARE

工具/软件:Code Composer Studio

错误消息:  

C28xx_CPU1:如果在一个内核上执行擦除/程序(E/P)操作,则另一个内核不应从共享RAM (SR)执行,因为它们用于E/P代码。 此外,CPU1将停止以确定将运行Flash插件代码的CPU的SR所有权,之后CPU1将被设置为运行其应用程序。 在对两个闪存库进行编程后,可从SR开始执行用户代码。

内存
{
第0页:/*程序内存*/
/*内存(RAM/flash)块可移动到Page1以进行数据分配*/
/* begin用于“引导至闪存”引导加载程序模式*/

begin 	:原点= 0x8万,长度= 0x0万A
RAMM0 	:原点= 0x0.0122万,长度= 0x0002DE
RAMD0 	:Origin = 0x00C000,length = 0x0.08万
RAMLS0 	:原点= 0x0.8万,长度= 0x0.08万
RAMLS1 	:原点= 0x0.88万,长度= 0x0.08万
RAMLS2 		:原点= 0x0.9万,长度= 0x0.08万
RAMLS3 		:原点= 0x0.98万,长度= 0x0.08万
RAMLS4 		:原点= 0x00A000,长度= 0x0.08万
RAMGS14 :原点= 0x01A000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
RAMGS15 :原点= 0x01B000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 */
重置 	:原始= 0x3FFFC0,长度= 0x0.0002万

/*闪存扇区*/
FLASHA :原点= 0x0.8万A,长度= 0x001FF6	/*片上闪存*/
FLASHB :原点= 0x8.2万,长度= 0x0.9万	/*片上闪存*/
FLASHC :原点= 0x08B000,长度= 0x0.1万	/*片上闪存*/
FLASHD :原点= 0x08C000,长度= 0x0.1万	/*片上闪存*/
FLASHE :原点= 0x08D000,长度= 0x0.1万	/*片上闪存*/
FLASHF :原点= 0x08E000,长度= 0x00A000	/*片上闪存*/
FLASHG :原始= 0x9.8万,长度= 0x0.8万	/*片上闪存*/
FLASHH :原始= 0x0A0000,长度= 0x0.8万	/*片上闪存*/
FLASHI :原点= 0x0A8000,长度= 0x0.8万	/*片上闪存*/
FLASHJ :原始= 0x0B0000,长度= 0x0.8万	/*片上闪存*/
FLASHK :原点= 0x0B8000,长度= 0x0.2万	/*片上闪存*/
FLASHL :原点= 0x0BA000,长度= 0x0.2万	/*片上闪存*/
FLASHM :原点= 0x0BC000,长度= 0x0.2万	/*片上闪存*/
FLASHN : Origin = 0x0BE000,length = 0x0.2万	/*片上闪存*/

第1页:/*数据存储器*/
/*内存(RAM/flash)块可以移动到PAGE0以进行程序分配*/

BOOT_RSVD :原点= 0x0.0002万,长度= 0x0.012万 /* M0的一部分,引导ROM将使用此堆栈*/
RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
RAMD1 :原点= 0x00C800,长度= 0x0.08万

RAMLS5 :原点= 0x00A800,长度= 0x0.18万

RAMGS0 :原点= 0x00D000,长度= 0x0.1万
RAMGS1 :原点= 0x00E000,长度= 0x0.1万
RAMGS2 :原点= 0x00F000,长度= 0x0.08万
RAMGS3 :原点= 0x00F800,长度= 0x0.08万
RAMGS4 :原点= 0x1万,长度= 0x0.1万
RAMGS5 :原点= 0x1.1万,长度= 0x0.1万
RAMGS6 :原点= 0x1.2万,长度= 0x0.1万
RAMGS7 :原点= 0x1.3万,长度= 0x0.1万
RAMGS8 :原点= 0x1.4万,长度= 0x0.1万
RAMGS9 :原点= 0x1.5万,长度= 0x0.1万
RAMGS10 :原点= 0x1.6万,长度= 0x0.1万
RAMGS11 :原点= 0x1.7万,长度= 0x0.1万
RAMGS12 :原点= 0x1.8万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
RAMGS13 :原点= 0x1.9万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 */

CPU2TOCPU1RAM:原始= 0x03F800,长度= 0x0.04万
CPU1TOCPU2RAM:原始= 0x03FC00,长度= 0x0.04万
}

节
{/*
分配程序区域:*/
.cinit :> FLASHB 页面= 0,对齐(4)
。\n定位 :> FLASHB, 页面= 0,对齐(4)
.text :>> FLASHB | FLASHC | FLASHD | FLASHE 页面= 0,对齐(4)
代码开始 :>开始 Page =0,align(4)/*

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

/*初始化部分进入Flash */
.econst :>> FLASHF | FLASHG | FLASHH 页面= 0,对齐(4)
.switch :> FLASHB 页面= 0,对齐(4)

.reset :>重置, Page =0,type = DSECT /* Not Used,*/

Filter_RegsFile :> RAMGS0,	页面= 1

SHARERAMGS0		:> RAMGS0,		页面= 1
SHARERAMGS1		:> RAMGS1,		页面= 1
ramgs0 :> RAMGS0, 页面= 1
ramgs1. :> RAMGS1, Page =1

#ifdef __TI_Compiler_version__
	#if __TI_Compiler_version__>= 1500.9万
	.TI.ramfunc:{} load = FLASHD,
						run = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
load_start(_RamfuncsLoadStart),
load_size (_RamfuncsLoadSize),
load_end (_RamfuncsLoadEnd),
run_start(_RamfuncsRunStart),
Run_Size (_RamfuncsRunSize),
run_end (_RamfuncsRunEnd),
						page = 0,align(4)
	#else
ramfuncs :负载= FLASHD,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
load_start(_RamfuncsLoadStart),
load_size (_RamfuncsLoadSize),
load_end (_RamfuncsLoadEnd),
run_start(_RamfuncsRunStart),
Run_Size (_RamfuncsRunSize),
Run_End(_RamfuncsRunEnd),
页面= 0,对齐(4)
#endif
#endif

/*使用IPC API驱动程序时,需要使用以下部分定义*/
组:> CPU1TOCPU2RAM,页= 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}

组:> CPU2TOCPU1RAM,页= 1
{
GETBUFFER:类型= DSECT
GETWRITEIDX:类型= DSECT
PUTREADIDX:类型= DSECT
}

/*以下部分定义适用于SDFM示例*/
Filter1_RegsFile :> RAMGS1,	page =1, Fill=0x1111
Filter2_RegsFile :> RAMGS2,	page =1,Fill=0x2222
Filter3_RegsFile :> RAMGS3,	page =1,Fill=0x3333
Filter4_RegsFile :> RAMGS4,RegsFile	=0x44:
>RAMGS5,	页面=1,填充=0x3333
}/*


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

以上给出的是2837xD_FLASH_lnk_CPU1.cmd

我不确定要更新哪个部件来解决此问题

我们非常感谢您的帮助:)

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

    这不是一个错误。 它是为FYI显示的注释。

    由于共享RAM由Flash插件代码使用,因此建议在执行前将代码加载到两个闪存库中。 如果您仅使用一个内核(在开发过程中),则本说明不适用。

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

    您好,Vamsi:

    很抱歉,我因健康问题而感到痛苦。

    感谢您的快速回复。 虽然我无法理解根本原因,为什么我会看到之前帖子中所述的备注。

    我必须补充以下内容:

    我从几天以来一直在开发一个代码,它通过下面给出的函数导入几个数组

    void llorlineshape(void){
    
    外部浮点型V0[31];
    外部浮点st0[31];
    extern float gama_air [31];
    extern float gamma self[31];
    外部浮子EP [31];
    
    ...}
    

    此函数(在main函数中调用n次)还会进行进一步的处理,并且程序工作正常。

    在这种情况下,我没有找到我在之前的帖子中提到的错误消息/备注。

    现在,我已将参数更改为更高的值

    void llorlineshape(void){
    
    外部浮点型V0[460]
    外部浮点st0[460];
    extern float gamma空气[460];
    extern float gama_self[460];
    外部浮子EP [460];
    
    ...}
    


    数组中的元素数量必须为460个,这是不可避免的。

    使用这些元素后,使用的内存也会增加(在构建后的内存分配窗口中可以看到)

    内存使用率的增加是否会导致显示此注释(在以前的帖子中引用)?

    此外,调试过程也会使用此注释完成,当我按'运行/恢复'时,程序将找不到任何空间,一旦达到此功能就会停止。

    有什么建议?

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

    希望您现在感觉更好。

    只要在调试器中连接目标,就会打印此注释。

    您是否也在应用程序中使用CPU2?

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

    不,我不打算使用CPU2
    我刚刚增加了要导入的数组大小...
    从那时起,我就看到了这张便条

    此问题是否与内存分段有关?
    这个问题能否通过扩大一些部门来解决? 说出FLASH或RAMGx/LX?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Rohan:

    如果您仅使用CPU1,则本说明不适用。

    您提到"程序找不到空间,一旦达到此功能就会停止。"

    为了更好地了解您的问题,我有几个问题:
    1.在函数'llorlineshape'中,您是否定义数组- v0,st0,gma_air,gma_self,ep? 或者,这些是在其他地方定义的,您在此处声明?
    2.当您点击此功能时,您是否可以在CCS中检查拆卸,程序停止之前点击了哪个指令。
    3.您提到"程序找不到空间",这是否意味着您可以看到数组已在某个位置定义,并在CCS的监视窗口中查看?

    请附加项目的内存映射文件。

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

    你好,Rajaravi Krishna Katta

    [引述]
    如果您仅使用CPU1,则本说明不适用。
    [/引述]

    我没有使用CPU2。 我从C2000软件中导入了一个闪光项目,并编辑了主代码。 所有设置保持不变。

    [引述]

    在函数'lorlineshape'中,您是否定义数组- v0,st0,gma_air,gma_self,ep? 或者,这些是在其他地方定义的,您在此处声明?

    [/引述]

    是的,这些数组在其他位置定义(在项目中添加的另一个'.c'文件)并在此函数中声明。

    [引述]

     当您点击此功能时,您是否可以在CCS中检查装配,程序停止之前点击了哪个指令。

    [/引述]

    我可以向您发送代码的'.c'文件,您可以在那里对其进行调试。这样会更方便。稍后当您有一些评论要分享时,您可以简单地将其发布在该线程中,而不是亲自告诉我。

    以下是文件- 主文件和阵列为storede2e.ti.com/.../5238.main.c的其他文件

    e2e.ti.com/.../HITRAN.c

    此致,  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    仅供参考,
    您将看到在早期代码中发布的代码中启用了DAC和ADC, 虽然我一直在运行这些程序,但测试此问题不需要这些程序,因为这些初始化在理论上不会影响所需的功能,而且我在未来的工作中将需要运行这些程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Rohan:

    我可能看到您已更改链接器命令文件->2837xD_FLASH_lnk_CPU1.cmd。 您已修改了RAM位置,闪存扇区大小和源站位置。 而是使用相同的链接程序命令文件。

    如果在单个RAM内存中分配内存时遇到任何问题,请组合RAM。

    例如:-   

    RAMGS0   :原点= 0x00C000,长度= 0x0.1万

    RAMGS1   :原点= 0x00D000,长度= 0x0.1万

    如果不能在RAMGS0中容纳内存块,请按如下所示进行修改并使用RAMGS

    使用RAMGS   :Origin = 0x00C000,length = 0x0.2万

    顺便提一下,我可以编译代码而不修改文件main.c和HITRAN.c中的链接器命令文件

    程序正在进入并执行'lorlineshape'函数。

    尝试单步操作,检查程序是否进入'lorlineshap'功能。 检查错误是否发生在功能的任何特定部分。

    您是否尝试过将HITRAN中的阵列分配到RAM位置以实现更快的访问?

    如果您遇到任何问题,请告诉我。

    谢谢!

    Katta

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

    您好 Rajaravi:

    按照您的建议,我使用了C2000ware的默认链接程序文件。 (实际上,我已经创建了新的工作空间并下载了新的C2000Ware,以便重新开始)

    我只在CPU1中调试了它

    这一次程序没有停止,但我得到了这样的输出。

    e2e.ti.com/.../2018_2D00_01_2D00_24_2D00_12_2D00_30_2D00_01.flv

    由于llorlineshape函数是'while (1)'之前调用的,因此它应该只评估一次'simuled[900]',然后应该永远进入while循环。

    但正如我所看到的那样,'imuled'数组正在持续计算,变量'c','lp'和'd'也在变化,这是不可取的。

    我怀疑分配给这些变量的存储位置与'lorlineshap'函数的处理过程是一致的。 是这样吗?

    如果是,我如何纠正?

    提前感谢

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

    在更新这些变量时,您是否可以暂停程序并查看控件的存放位置?

    我可以看到您使用了其中一个ADC示例中的ConfigureADC,但更改了实现。
    您能否检查所有ADC配置是否正确?

    同时,我将请我们的ADC专家检查ADC配置是否存在任何问题。

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

    非常感谢您的帮助,尽管我怀疑这不是ADC问题(因为我在较小的HITRAN阵列中使用了相同的配置,但工作正常)。 但是如果您有这种感觉,请继续并看看出现了什么情况。

    同时,我将尝试研究相同的内容。:)

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

    粗略查看ADC设置和采样方案后,似乎工作正常。

    如果您使用CPU计时器直接触发ADC,可能会更高效,更可预测, 然后在ADC SOC1的末尾使用ADC ISR来读取结果并进行计算-但我认为在调试当前问题之前,您不必担心这一点:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢Devin的快速回复,
    一旦解决了这个问题,我一定会尝试用计时器触发ADC。
    如果您可以共享一些有用的链接,这将在将来非常有用。
    此致,
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Rohan:

    HW驱动采样Usig CPU计时器与使用ePWM计时器没有根本的区别。 C2000ware中有一些ePWM驱动的触发示例。

    我认为您的采样周期也足够短,可以直接使用ePWM (它是16位计时器,而不是32位CPU计时器),如果这样更容易。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Rajaravi:
    您对更改链接文件中的空间分配有什么建议吗?

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

    大家好,

    我通过更改 定义不同段的内存部分的链接文件来运行程序。

    程序没有获得足够的内存来分配给在llorlineshape函数中生成的局部变量。 通过增加堆栈内存,我可以使此程序顺利运行

    已按如下所示更新链接文件

    堆栈 :> RAMGS2 页面= 1
    //而不是RAMM1 

    此致

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

    [引述用户="Rajaravi Krishna Kata"]

    您是否尝试过将HITRAN中的阵列分配到RAM位置以实现更快的访问?

    [/引述]

    您能告诉我如何操作吗?

    此致

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

    您可以使用
    #pragma DATASECTION (array_name,"array_section"),然后再输入数组和
    在链接程序命令文件中使用"array_section:> RAMGS6, page =1"将所需的数组分配到RAM位置。

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

    您好Rajaravi:

    感谢您 的建议。 但我仍然不清楚该如何编写此代码

    我已经从这个pdf中了解了pragma指令的理论及其使用原因:

    因此,在阅读我能理解的内容时,我想补充的是─

    #pragma data_section( V0,"V0_sect")
    float V0[460]={...);#pragma
    data_section( st0,"st0_sect")
    float st0[460]={...);
    #pragma data_section( gma_air,"gma_sect")
    float gma_air[460]={...;
    #pragma float_gma_data_ep_ma_sect,"pgma_ma_sect_data_ep_mma'{.";
    
    
    
    #pragma data_section( delta,"delta sect")
    float delta [460]={...);#pragma
    data_section( n,"n_sect")
    float n[460]={...];
    

    但我应该在哪里添加它? 在主文件中主功能之前?

    然后在链接程序文件中,将RAMGS3,4,5,6, 7,8,9 AS  

    v0_sect:> RAMGS3,page = 1
    st0_sect:> RAMGS4,page = 1
    gair_sect:> RAMGS5,page = 1
    gself_sect:> RAMGS6,page = 1
    ep_sect:> RAMGS7,page = 1 gair_sect_sect
    :> RAMGS8,page = 1
    n_sect,page = 1 RAMGS9,page = sect 

    我觉得应该有办法不使用这么多的RAMGS。 请告诉我,我是否可以将这些阵列分配给同一个RAMGS或仅包含2-3个RAMGS的群集(因为单个[460]阵列不会占用太多空间)。

    此致,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为上述查询启动新线程,以便将来有人可以更轻松地搜索该查询

    e2e.ti.com/support/development_tools/compiler/f/343/t/66.1203万

    此致,