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.

[参考译文] TMS320F28069M:Motorware 示例的.TI.ramfunc 更改

Guru**** 2522770 points
Other Parts Discussed in Thread: MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/787018/tms320f28069m-ti-ramfunc-changes-for-motorware-examples

器件型号:TMS320F28069M
主题中讨论的其他器件:MOTORWARE

您好!

您能否提供修改 Motorware 示例以使用最新编译器所需的更改列表?  

我想我正在经历 ramfunc 处理的变化(基于 Motorware 18实验室示例的应用程序、编译器18.1.4)-在运行闪存构建时不断获取 IllegalISR。  

到目前为止、我已经:  

1.将#pragma CODE_SECTION 替换为 __attribute__((ramfunc))

2.修改存储器映射(尚未到达确切内容的底部)

3.我是否应该删除 Memcopy ((uint16_t *)&RamfuncsLoadStart、(uint16_t *)&RamfuncsLoadEnd、(uint16_t *)&RamfuncsRunStart);(等)?  

谢谢

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

    作为这方面的后续行动,我已经做了我能找到的一切来修改这些内容,即:  

    1.将#pragma CODE_SECTION 替换为 __attribute__((ramfunc))

    2.添加了存储器映射部分、如下所示:  

    部分
      /*分配计划领域:*/
      binit     :> FLASHA_B,  page = 0
      .cinit             :> FLASHA_B,  page = 0
      .pinit             :> FLASHA_B,  PAGE = 0
      .text              :> FLASHA_B,  page = 0
      codestart          :> begin,     page = 0
      .TI.ramfunc        :load = FLASHD,
                            运行= RAML0_1、
                            表(BINIT)、
                            PAGE = 0
    3.已删除 Memcopy 例程。  
    4.修改了 usDelay()的.sect 语句。  
    唉,每当我运行它时,都会立即抛出 InvalidISR(),调用栈指向 mainISR()(whcih 是 RAM 函数之一)。 禁用 mainISR()前面的_attribute_statement 可解决问题:因此它与 RAM 函数复制绝对相关,我不确定从哪里开始查看下一个!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    似乎您已经完成了应该使用 ramfunc 属性的所有操作。

    1.连接仿真器和独立运行时是否都会出现此问题?

    2.您是否收到任何构建/链接器警告?

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

    尊敬的惠特尼:

    遗憾的是、如果没有连接仿真器、它根本不起作用:可能是相同的问题、也可能是其他问题(仍在跟踪此问题)。 No build/ linker warnings:its all clean。  

    我曾经想到的一个关于实现.binit 复制函数的问题是:我需要编写这个文件、还是应该将其包含在项目的某个位置? 只要想一想、我们的项目是对一个现在相当旧的项目的升级、可能会缺少一些通常是默认情况下构建的项目。  

    昨天晚上的进一步测试几乎证实了失败:IllegalISR()被扔在它到达的第一个 ramfunc 上。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还有一个想法:我的应用使用 CLA、但处理仍然以旧的方式执行、也称为:


    Cla1Prog :load = FLASHA_B,
    运行= CLA_PROG、
    load_start (_Cla1funcsLoadStart)、
    load_end (_Cla1funcsLoadEnd)、
    load_size (_Cla1funcsLoadSize)、
    run_start (_Cla1funcsRunStart)、
    PAGE = 0

    这是否会导致与 binit 例程不兼容?

    在这里迷路了!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在对这个主题进行更多的阅读/思考之后、它提出的问题比答案更多。

    由于 Estop 发生在主 ISR 调用上、这可能与在闪存和 RAM 之间分配/复制中断矢量表有关。 读取 spra958l 时、它会显示"加电时、所有中断矢量必须位于非易失性存储器(即闪存)中、但作为代码中器件初始化过程的一部分被复制到 PIEVECT RAM 中"。 Motorware 不执行此操作:相反、它将中断矢量表直接初始化为存储器位置0x0000 0D00、作为_PI_Obj_结构的一部分:将矢量直接写入代码中的0x0000 0D00表。 问题就变成:

    为什么 spra958l 如此具体地说它们必须位于闪存中、然后在运行时复制到 RAM 中?
    2.使用标准 Motorware ISR 矢量分配 HAL_initIntVectorTable(),为矢量分配哪个函数地址:Flash 中的地址或 RAM 中.binit 的副本?

    可以在这里做一些澄清:我阅读得越多,问题就越令人困惑!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不过、mainISR 是否是唯一一个抛出 IllegalISR 的函数? 我认为其他一些 ramfuncs、例如 usDelay 或闪存配置函数也可能有问题。 不是这样吗?

    我认为 spra958l 假设大多数应用程序将其矢量表放入一个常量表中、该表存储在闪存中、而不是一次将几个矢量表插入代码中。 假设您希望所有 ISR 都从 RAM 运行以获得最佳性能、闪存中的表中将包含 RAM 地址、这些地址将被复制到0xD00表中。 不过、MotorWare 实验的方法不一定是错误的。 此外、代码生成工具知道、由于您在 cmd 文件中放置了不同的加载和运行地址、因此当您在代码中执行 mainISR 时、它应该使用运行(RAM)地址。 不过,您可以在 HAL_initIntVectorTable()中放置一个断点以确保正确。

    我做了一些实验、尝试更新 MotorWare 实验室以使用 ramfunc 属性、但我似乎无法重现这种情况。 副本似乎按预期生成。 我将向代码生成团队发送消息、看看他们是否有任何想法。

    惠特尼

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

    感谢您的回答:所有问题都非常有效。

    它绝对是导致当前问题的主 ISR。 我刚刚运行了一个构建、该构建除了运行正常的 mainISR 外、启用了所有复制到 RAM 函数。 但是、当 mainISR 设置为复制到 RAM 时、它会在启用 ISR 时抛出-堆栈回扫指向 mainISR 入口点。  

    通过 HAL_initVectorTable()运行调试器会显示0x85b7处的 mainISR 地址,该地址与映射文件相关(并且是 RAM 位置,而不是闪存)。  

    因此、此处的位置为:  

    函数实际上没有复制到其 RAM 链接位置(可疑)。

    2.在访问 mainISR 时、还有其他东西在抛出 CPU、但仅在启用 ramfuncs 的情况下(可能)  

    是否有任何关于需要将此函数加载到低64k 区域的规则、或有关程序存储器与数据存储器(我正在加载到程序中)的详细信息?  

    今天、我没有机会运行未经修改的 Motorware 示例、明天的工作。 我的应用程序已经对链接器文件进行了相当大的修改-以支持 CLA/CAN、因此内存被打乱。 如果我错过了任何突出的规则、这肯定会实现它。 如果您能发现任何内容、我将复制下面的链接器文件以实现完整性?  

    MEMORY
    {
    PAGE 0:/* Program Memory */
    /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    RAML0_1:origin = 0x008000、length = 0x000C00 /*片上 RAM 块 L0和 L1 */
    CLA_PROG :origin = 0x009000,length = 0x001000
    RAM_for_funcs:origin = 0x00A000,length = 0x002000 /*片上 RAM 块 L4 *//
    INSTASPIN :origin = 0x013800,length = 0x000800
    
    OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */
    FLASHH :origin = 0x3D8000,length = 0x004000 /*片上闪存*/
    FLASHG :origin = 0x3DC000、length = 0x004000 /*片上闪存*/
    FLASHF :origin = 0x3E0000、length = 0x004000 /*片上闪存*/
    FLASHE :origin = 0x3E4000,length = 0x004000 /*片上闪存*/
    FLASHD :origin = 0x3E8000、length = 0x004000 /*片上闪存*/
    FLASHC :origin = 0x3EC000、length = 0x004000 /*片上闪存*/
    FLASHA_B :origin = 0x3F0000、length = 0x007F80 /*片上闪存*/
    csm_RSVD :origin = 0x3F7F80、length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 */
    开始 :origin = 0x3F7FF6,length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 //
    csm_PWL_P0 :origin = 0x3F7FF8、length = 0x000008 /* FLASHA 的一部分。 FLASHA *中的 CSM 密码位置/
    
    FPUTABLES :origin = 0x3FD590,length = 0x0006A0//引导 ROM 中的 FPU 表*/
    IQTABLES :origin = 0x3FDC30,length = 0x000B50 //引导 ROM 中的 IQMath 表*/
    IQTABLES2 :origin = 0x3FE780,length = 0x00008C //引导 ROM 中的 IQMath 表*/
    IQTABLES3 :origin = 0x3FE80C,length = 0x0000AA/*引导 ROM 中的 IQMath 表*/
    
    ROM :origin = 0x3FF3B0,length = 0x000C10 /*引导 ROM */
    重置 :origin = 0x3FFFC0,length = 0x000002 引导 ROM 的/*部分*/
    向量 :origin = 0x3FFFC2,length = 0x00003E /*部分引导 ROM */
    
    第1页:/*数据存储器*/
    /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
    /*寄存器保留在第1页上 //
    
    boot_RSVD :origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    
    CLA1 :origin = 0x001400、length = 0x000080 /* CLA 寄存器*/
    CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080 /* CLA 到 CPU */
    CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080 /* CPU 到 CLA */
    
    ECANA :origin = 0x006000、length = 0x000040 /* eCAN-A 控制和状态寄存器*/
    ECANA_LAM :origin = 0x006040、length = 0x000040 /* eCAN-A 本地接受屏蔽*/
    ECANA_MOTS :origin = 0x006080、length = 0x000040 /* eCAN-A 消息对象时间戳*/
    ECANA_MOTO :origin = 0x0060C0、length = 0x000040 /* eCAN-A 对象超时寄存器*/
    ECANA_MBOX :origin = 0x006100,length = 0x000100 /* eCAN-A 密耳盒*/
    
    CLARAM2 :origin = 0x008000、length = 0x000800
    CLARAM0 :origin = 0x008800,length = 0x000400
    CLARAM1 :origin = 0x008C00,length = 0x000400
    
    RAML4 :origin = 0x00A000、length = 0x002000 /*片上 RAM 块 L4 */
    RAML5 :origin = 0x00C000、length = 0x002000 /*片上 RAM 块 L5 */
    RAML6 :origin = 0x00E000、length = 0x002000 /*片上 RAM 块 L6 */
    RAML7 :origin = 0x010000,length = 0x002000 /*片上 RAM 块 L7 */
    RAML8 :origin = 0x012000,length = 0x001800 /*片上 RAM 块 L8。 从0x13800到0x14000为 InstaSPIN */
    USB_RAM 保留 :origin = 0x040000、length = 0x000800 /* USB RAM*/
    }
    
    SECTIONS
    {
    
    //分配程序区域:*/
    .binit:> FLASHA_B,page = 0.cinit
    :> FLASHA_B,PAGE = 0.Pinit
    :> FLASHA_B,PAGE = 0
    .text :> FLASHA_B,PAGE = 0
    codestart :>开始, PAGE = 0
    .TI.ramfunc :load = FLASHA_B,
    运行= RAML0_1、
    表(BINIT)、
    PAGE = 0、align (4)
    
    csmpasswds :>csm_PWL_P0、page = 0
    csm_rsvd :>csm_RSVD,page = 0
    
    /*分配未初始化的数据段:*/
    .stack :>RAMM0,page = 1.ebss
    :> RAML4,page = 1
    .esysmem :>RAML4,page = 1/*
    
    初始化段进入闪存*/*
    要使 SDFlash 对这些段进行编程,它们必须被分配到 PAGE 0 */
    .econst :> FLASHA_B,PAGE = 0
    .switch :> FLASHA_B,PAGE = 0
    
    //分配 IQ 数学区域:*/
    IQmath :> FLASHA_B,PAGE = 0 /*数学代码*/
    IQmathTables :> IQTABLES,PAGE = 0,TYPE = NOLOAD
    
    Cla1RegsFile:> CLA1, PAGE = 1
    Cla1Prog :load = FLASHA_B,
    运行= CLA_PROG、
    //table (BINIT)
    load_start (_Cla1funcsLoadStart)、
    load_end (_Cla1funcsLoadEnd)、
    load_size (_Cla1funcsLoadSize)、
    run_start (_Cla1funcsRunStart)、
    PAGE = 0
    
    Cla1ToCpuMsgRAM:>CLA1_MSGRAMLOW,PAGE = 1
    CpuToCla1MsgRAM:>CLA1_MSGRAMHIGH,PAGE = 1
    Cla1DataRam0:>CLARAM0,PAGE = 1
    Cla1DataRam1:>CLAM1,PAGE = 1 CLARARAM2
    :>CLARA2
    
    :
    {*。obj (CLAscratch)
    。 += CLA_ScratchPad_size;
    *。obj (CLAscratch_end)}> CLARAM0、
    PAGE = 1
    
    /***外设帧1寄存器结构***/
    ECanaRegsFile :> ECANA、 页面= 1
    ECanaLAMRegsFile:> ECANA_LAM,页面= 1
    ECANA_MboxesFile:> ECANA_MBOX,页面= 1
    ECANaMOTSRegsFile:> ECANA_MOTS,页面= 1
    ECANA_MOTOMESH 文件:> ECANA_MOOX,页面= 1
    
    /*分配 FPUthmath*
    :> FPUTABLES,PAGE = 0,TYPE = NOLOAD
    
    DMARAML5.:> RAML5, PAGE = 1
    DMARAML6:> RAML6, PAGE = 1
    DMARAML7:> RAML7, PAGE = 1
    DMARAML8:> RAML8, PAGE = 1.
    
    
    /*.reset 是编译器使用的标准段。 它包含
    用于 C 代码的_c_int00起始地址的*//*。 使用
    引导 ROM 时,*/*不
    需要此部分和 CPU 矢量*//*表。 因此,默认类型设置为*/
    /* DSECT */
    .reset :>重置, PAGE = 0、TYPE = DSECT
    向量 :>引导程序,页= 0,类型= DSECT
    
    }
    

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

    而且,一如既往,它是让你得到的简单的东西。

    问题确实出在链接器文件中:我对 ramfuncs 和 CLA 数据使用相同的 RAM 区域:CLA 初始化正在覆盖 RAM 函数。 换用至 RAML5解决了问题。

    感谢您的帮助:我们确认了未知的事实、才发现了显而易见的事实!