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万S:闪存API在电源循环/重置芯片后无法正常工作,尽管在将程序加载到电路板后工作无故障,直到重新启动。

Guru**** 2539500 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/615516/ccs-tms320f28377s-flash-api-fails-to-work-after-power-cycling-resetting-the-chip-despite-working-flawlessly-just-after-loading-the-program-to-the-board-until-an-restart

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

工具/软件:Code Composer Studio

我在使用F2.8377万S芯片的闪存API工具时遇到了问题。  当调试闪存库0的读/写时,可以无故障地工作,但是当系统重新启动时,闪存API erase命令无法擦除有问题的扇区(任何扇区),并且生成的唯一错误是fmstat 0x0C10,它对应于erase verify和command fail。  如果我尝试对已清理的扇区进行编程, 则Fapi_issueProgrammingCommand调用将无法保存新数据。  生成的错误代码是两次出现的通用500错误。  当我逐行浏览至erase命令时,所有寄存器似乎都已正确设置。  我在程序中没有使用ECC或DCSM。  在执行实际的主程序代码之前,所有函数都在SectionCopy.asm中从闪存移至RAM,并且我已通过内存浏览器验证所有这些函数都已正确复制到ram。  由于我正在开发的系统要求具有可变操作设置的持久内存,因此应该采取哪些进一步的步骤来解决此问题。  我不能提供完整的代码块,但我会提供一些我当前在保存到闪存功能中的片段,因为它的大部分内容是从控制套件中的示例代码中提取的, 除了一些诊断输出代码之外,我还添加了一些诊断代码,以诊断故障点可能在哪里,并且大多数情况下已被注释掉。  我在多个器件上试用过此代码,甚至在TI-2.8377万s Launchpad上也试用过,但每个器件的结果都相同。  我主要担心的是调试器正在预加载某些内容,但在关闭电源后无法有效地将其恢复到RAM。  现在应该考虑什么来尝试诊断此故障?

此函数的关联代码块错误:

 

 //禁用ECC。  ECC不必禁用即可执行FSM操作
   //编程并擦除。
   //然而,由于OTP ECC勘误,在Sonata Rev. 0芯片上,
   //在使用Flash API函数时,禁用ECC以避免ECC错误
   //读取TI-OTP

   EALLOW;
//   DcsmCommonRegs.FLSEM.ALL = 0x0A503;
   Flash0EccRegs.ecc_enable.bit.enable = 0x00;
   Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x3;
   Flash0CtrlRegs.FBAC.ALL = 0x14;
//   Flash0CtrlRegs.FRD_INTF_CTRL.ALL = 0x3;
   EDIS;


      //
      // Bank0擦除程序
      //
      EALLOW;

      //
      //将泵所有权授予FMC0
      //
      PUMPPREQUEST = 0x5A5A0002;

      //
      //此函数是初始化基于系统的Flash API所必需的
      //执行任何其他Flash API操作之前的频率
      //请注意,FMC0寄存器基本地址作为参数传递
      //
      oReturnCheck = Fapi_initializeAPI(F021_CPU0_W0_base_address, 194);

      IF (oReturnCheck!= Fapi_Status_Success)
      {
          //
          //查看Flash API文档以了解可能的错误
          //
          示例_错误(oReturnCheck);
//          UARTprintf ("初始错误:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
          返回;
      }
///      UARTprintf ("初始通道:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
      //
      // Fapi_setActiveFlashBank函数为设置Flash Bank0和FMC0
      //要在bank0上执行的其他闪存操作。
      //请注意,传递的参数是Fapi_FlashBank0,因为FMC0寄存器
      //基本地址被传递到Fapi_initializeAPI()
      //
      oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
      IF (oReturnCheck!= Fapi_Status_Success)
      {
          //
          //查看Flash API文档以了解可能的错误
          //
          示例_错误(oReturnCheck);
//          UARTprintf ("设置操作失败:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
          返回;
      }
//      UARTprintf ("设置动作通过:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
      //
      //擦除扇区
      //
//      UINT32 *参考;
//      for (i=0;i <= sectorLength;i+= 16)
//      {
//         ref =(sectorIndex + I);
//         UARTprintf ("扇区预置:0x%x,0x%x,0x%x of 0x%x\n",*参考,参考,i, 截面长度);
//      }
      oReturnCheck = Fapi_issue3cCommandWithAddress(Fapi_EraseSector,
                                                  (UINT32 *)部门索引);
//      for (i=0;i <= sectorLength;i+=16)
//      {
//         ref =(sectorIndex + I);
//         UARTprintf ("扇区POST:0x%x,0x%x,0x%x of 0x%x\n",*参考,参考,i, 截面长度);
//      }
      //
      //等待FSM完成擦除扇区操作
      //
      while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}
//      UARTprintf ("擦除完成:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
      //
      //验证SectorL是否已擦除。  擦除步骤本身执行
      //在运行时进行验证。  此验证是可以执行的第二次验证。
      //
      oReturnCheck = Fapi_doBlankCheck(UINT32 *)sectorIndex,
            截面长度,
            &oFlashStatusWord);

      IF (oReturnCheck!= Fapi_Status_Success)
      {
          //
          //查看Flash API文档以了解可能的错误
          //如果Erase命令失败,请使用Fapi_getFsmStatus()函数获取
          // fmstat寄存器内容,查看是否有EV位,ESUSP位,
          //设置Cstat位或VOLTSTAT位(请参阅API文档了解
          //更多详细信息)
          //
          示例_错误(oReturnCheck);
//          UARTprintf ("擦除程序失败:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
          返回;
      }
//      UARTprintf ("擦除程序通过:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
      //
      //可以为程序功能提供最多8个字的数据缓冲区。
      //每个单词都被编程,直到整个缓冲区被编程或
      //发现问题。 但是,要对大于8的缓冲区进行编程
      //单词,程序函数可以循环调用,为进行8个单词的编程
      //每次循环迭代,直到对整个缓冲区进行编程
      //

      //
      //示例:将闪存扇区C中的0xFF字节与auto--
      //生成的ECC
      //

      //
      //在这种情况下,只需用数据填充缓冲区,即可编程到闪存中。
      //
//      for (i=0;i<=剑_in_flash_buffer;i++)
//      {
//          缓冲[i]= i;
//      }
对于(j=0; j<=blocksize;j+=256)

         对于(i=0;i<=剑_闪_缓冲;i++)
         {
            IF ((i+j)<块大小)
            {
             缓冲区[i]=*(dataBlockIndex+i+j);
            }
            否则
            {
               缓冲区[i]= 0xFFFF;
            }
//             UARTprintf ("已加载缓冲区:%u,0 % ,0 % .1c",.1cn,i,j, 缓冲区[I]);
         }
      对于(i=0,u32Index = sectorIndex + j;
          (u32Index <(sectorIndex + j +剑_闪_缓冲))&&
          (oReturnCheck == Fapi_Status_Success);i+=8,u32Index+=8)
      {
          oReturnCheck = Fapi_issueProgrammingCommand ((UINT32 *) u32Index,Buffer+I,
                                                      8,0,0,
                                          FAPI_DataOnly);

          while (Fapi_checkFsmForReady()== Fapi_Status_FsmBusy);

          IF (oReturnCheck!= Fapi_Status_Success)
          {
              //
              //查看Flash API文档以了解可能的错误
              //
              示例_错误(oReturnCheck);
//              UARTprintf ("程序失败:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
              返回;
          }
//          UARTprintf ("程序通过:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
          //
          //读取fmstat寄存器内容以了解FSM的状态
          // program命令进行任何调试
          //
          oFlashStatus = Fapi_getFsmStatus();

          //
          //验证编程的值。  程序步骤本身进行验证
          //。  此验证是可以执行的第二次验证。
          //
          oReturnCheck = Fapi_doVerify(UINT32 *)u32Index,4,Buffer32+(I/2),
                                       &oFlashStatusWord);

          IF (oReturnCheck!= Fapi_Status_Success)
          {
              //
              //查看Flash API文档以了解可能的错误
              //
              示例_错误(oReturnCheck);
//              UARTprintf ("最终失败:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
              返回;
          }
//          UARTprintf ("最终路径:%x,%x,%x\n",sectorIndex,sectorLength,dataBlockIndex);
      }

提前感谢!

意愿

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

    1)擦除功能不返回参考指南(www.ti.com/.../spnu630)中提到的500错误。 是否确定从擦除功能获得该值?

    2)我知道您没有使用DCSM。 但是,您是否检查过您的应用程序是否错误地对DCSM OTP位置进行编程? 请检查。 如果启用了DCSM,则需要从安全内存(同一区域)执行API,并初始化相应区域的FLSEM。

    3)对于小节复制,您是否使用了SPRAAU8中所述的DSP28xxx_SectionCopy_nonBIOS.ASM? 如果是,您是否从 e2e.ti.com/.../2.1164万获得了更新的文件
    是否将所有必需的部分复制到RAM?
    是否也将Fapi_UserDefinedFunctions.c文件中的函数复制到RAM?

    4)您是否确保为擦除或程序函数提供了有效的地址(可能可以打印该地址并进行检查以确保在非调试器情况下使用。 我了解到连接调试器时扇区被擦除)?

    5)在擦除或程序操作过程中,您是否检查了电压线路是否有任何骤降?

    6)对于闪存初始化,您是否可以按照F2837xS_sysctrl.c中InitFlash_Bank0()中提供的确切顺序进行操作?

    7)在关闭电源后,是否能够成功执行controlSUITE的Flash API使用示例?

    8)使用TI工具将代码加载到闪存时,是否确保启用AutoEccGeneration选项(默认为启用)? 您需要保持启用此功能,以便为应用程序编程ECC,以避免在关闭电源后从闪存执行应用程序时出现ECC错误。 我知道您稍后将禁用ECC -但应该为闪存中的代码对ECC进行编程,以便在初始化例程期间禁用ECC之前不会出现错误。

    连接调试器时,GEL唯一能影响调试的功能是禁用ECC和看门狗。 我认为您的应用程序也在禁用这些(当然是ECC。 不确定看门狗-如果启用,可能是您的应用程序正在正常服务它,因为您确实注意到XRSn引脚上的任何重置切换)。

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

    感谢您的快速响应。 除了物理检查电压降和从独立启动运行fapi示例之外,我已经逐一介绍了这些方法。 我将从这里开始,并再次完成其他每个步骤,以确保在之前的故障排除过程中没有遗漏任何内容; 我相信大家都知道,当你盯着同一个代码太长时间时,眼睛会有点亮,所以我会确保这不是问题的一部分,因为我会回顾一下。 我应该有一个正在工作的片上闪存编程器,或者在我浏览您提供的建议时,有一个详细的发现概要。

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

    针对您的列表:

    "1)擦除功能未返回参考指南(www.ti.com/.../spnu630)中提到的500错误。 是否确定从擦除功能获得该值?"

    正确,是Fapi_doBlankCheck(….);返回Fapi_Error_Fail–500。

    "2)我知道您没有使用DCSM。 但是,您是否检查过您的应用程序是否错误地对DCSM OTP位置进行编程? 请检查。 如果启用了DCSM,则需要从安全内存(同一区域)执行API,并初始化相应区域的FLSEM。"

    我已确认DCSM未被使用,所有关联的寄存器都反映了这一点。

    "3.对于小节复制,您是否使用了SPRAAU8中所述的DSP28xxx_SectionCopy_nonBIOS.ASM? 如果是,您是否从e2e.ti.com/.../2.1164万获得了更新的文件?
    是否将所有必需的部分复制到RAM?
    您是否也将Fapi_UserDefinedFunctions.c文件中的函数复制到RAM?"

    我使用了一个稍作修改的版本,现在我也在复制此文件中的ramfuns,但我怀疑这是问题所在,因为我在从.main中移动复制ramfuncs功能之前就看到了这个问题。 我已经验证了ram中的位置与闪存中复制它们的位置具有相同的二进制值。 我已经做了一个简短的浏览,以确保将SectionCopy.asm中的所有部分都复制到分配给它们的运行RAM块中。 我将我的文件与上面提供的文件进行了比较,结果是相同的,只是我没有“ ;SubB XAR5,#1”,因为它们在提供的代码中被注释掉了;这些是否应该是活动指令?

    "4)您是否确定为擦除或程序功能提供了有效的地址(可能可以打印该地址并进行检查以确保在非调试器情况下使用。 我知道您在连接调试器时看到扇区被擦除了吗?"

    我正在将所有地址值,大小,来源等打印到串行端口,并监视每个后续步骤中的所有内容。

    (5)您是否检查过在擦除或程序操作过程中电压线路是否有任何骤降?'

    ***** 如果其余部分在Fapi功能方面没有改进,我将在明天解决这个问题。****

    "6.对于闪存初始化,您是否可以遵循F2837xS_sysctrl.c中InitFlash_Bank0()中提供的确切顺序?"

    我正是按照这个顺序来做的

    "7.在关闭电源后,是否能够成功执行controlSUITE的Flash API使用示例?"

    ***** 我明天也会讨论这个问题,我需要修改示例以使其正常工作。 ****

    (8)使用TI工具将代码加载到闪存时,是否确保启用AutoEccGeneration选项(默认为启用)? 您需要保持启用此功能,以便为应用程序编程ECC,以避免在关闭电源后从闪存执行应用程序时出现ECC错误。 我知道您稍后将禁用ECC -但应该为闪存中的代码对ECC进行编程,以便在初始化例程期间禁用ECC之前不会出现错误。

    连接调试器时,GEL唯一能影响调试的功能是禁用ECC和看门狗。 我认为您的应用程序也在禁用这些(当然是ECC。 不确定看门狗-如果启用,可能是您的应用程序正在正常服务它,因为您确实注意到XRSn引脚上的任何重置切换)。 "

    我正在为Fapi_UserDefinedFunctions.c中的看门狗提供服务,正如您所承认的,我没有得到重置或陷入estop陷阱。 因此,我也怀疑这是罪魁祸首。 我尝试了带ECC和不带ECC的两种方法,这两种方法都适用于初始调试引导,但在独立引导和通过CCS调试重新启动后都失败。

    明天我会跑其他两个,但是到目前为止,我还没有发现任何明显的失败点。

    如果有任何反馈可以帮助缩小搜索窗口,请告诉我可以在哪里搜索。

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

    将,

    感谢您仔细浏览所有要点。

    #3: 不需要该指令,因为减影是在复制功能的累加器上完成的。  以下几个问题可帮助您进行调试:  

    3.1)是否修改了链接程序命令文件以指定要复制到RAM的所有部分的LOAD和RUN地址符号?

    3.2)您是否确保将任何具有不同负载(闪存)和运行(RAM)地址的用户定义文本部分添加到"DSP28xxx_SectionCopy_nonBIOS.ASM"中,以便正确复制它们,因为您可能已删除memcpy()?   

    3.3)是否确保将任何ASM文件中的任何.sect“ramfuns”(或.sect“.ti.ramfunc”)替换为 .sect“text”,以便 "DSP28xxx_SectionCopy_nonBIOS.ASM"可以将这些部分作为.text部分的一部分复制?

    3.4)是否确实删除 了任何#pragma code_section (xx,“ramfuns”)(或 #pragma code_section (xx,“.ti.ramfunc”),以便将它们映射到.text节?

    3.5)是否确定删除memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize),因为代码在 到达_c_int00之前就被“DSP28xxx_SectionCopy_nonBIOS.asm”复制?

    #4: 希望您正在使用Bank0扇区地址,因为您已为Bank0配置了API。

    6: 看着你的代码,我认为你没有遵循InitFlash_Bank0()的确切顺序。  您可以调用TI提供的函数(如果需要,您可以在最后禁用ECC)。

    8:关于看门狗服务: 如 SPNU630文档的第3.6 (1章) Fapi_serviceWatchdogTimer()节所述,请确保在看门狗服务功能的主体末尾包含EALLOW,以便以后执行的API函数根据需要写入受保护的寄存器。  请参阅下文。

    FAPI_StatusType FAPI_serviceWatchdogTimer (void)

    /*用户在此处添加他们自己的监视程序服务代码*/

    ServiceDog ();//您自己的函数主体

    EALLOW; //添加此EALLOW

    返回(FAPI_Status_Success);

    }

    谢谢,此致,
    Vamsi

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

    同时确保链接程序命令文件中没有映射到RAM的已初始化部分。 TI闪存工具不会加载映射到RAM的初始化区段。 TI闪存工具适用于完全嵌入式闪存应用。

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

    瓦姆西

    我对详细的细分表示赞赏。  在列出的项目中,唯一突出的是我在返回Fapi看门狗服务机构之前没有给EALLOW打电话。  我现在会检查一下是否是问题所在,并告诉您这是否是我问题的解决方案,否则我将从昨天开始继续执行第5和第7项,因为我必须重建焊接台以进一步接触芯片引脚, 并且必须对闪存编程示例项目进行一些更小的修改,使其在电源循环/重置后在主板上独立运行。  

    您在今天早些时候的帖子中详细描述的其他项目都已签出。  闪存库初始化是从sysctl.c函数调用的,附加寄存器设置被置于作为诊断步骤复制/粘贴到论坛的功能代码块中, 为了确保寄存器不会在调用SAVE函数后以某种方式重置为不同的值,此时它会出现,它们是冗余的,可以再次删除。

    我将在浏览上述项目时随时向您通报我的最新进展。

    再次感谢您的帮助,

    意愿

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上,让我来澄清一下:
    "ramfuncs"不在.text部分,它们仍然在"ramfuncs"中,但我在copysection.asm中调用该部分的副本
    我将在此处包含链接器和复制书帖代码以供查看,请告诉我是否存在您认为突出的问题。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    链接程序命令文件:

    内存

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

    开始 :原点= 0x8万, 长度= 0x0.0002万
    RAMM0 :原点= 0x0.0122万, 长度= 0x0002DE
    RAMD0 :原点= 0x00D000, 长度= 0x0.08万
    RAMD1 :原点= 0x00D800, 长度= 0x0.08万
    // RAMLS0 :原点= 0x0.8万, 长度= 0x0.08万
    // RAMLS1 :原点= 0x0.88万, 长度= 0x0.1万
    RAMGS0 :原点= 0x1.4万, 长度= 0x0.8万
    重置 :原点= 0x3FFFC0, 长度= 0x0.0002万





    /*闪存扇区*/
    /* 闪存库0 */
    FLASHA :原点= 0x8.0002万, 长度= 0x001FFE /*片上闪存*/
    // FLASHB :Origin = 0x8.2万, length = 0x0.2万 /*片上闪存*/
    // FLASHC :原点= 0x8.4万, 长度= 0x0.2万 /*片上闪存*/
    // FLASHD :原点= 0x8.6万, 长度= 0x0.2万 /*片上闪存*/
    // FLASHE :原点= 0x8.8万, 长度= 0x0.8万 /*片上闪存*/
    FLASHF :原始= 0x9万, 长度= 0x0.8万 /*片上闪存*/
    FLASHH : Origin = 0x0A0000, length = 0x0.8万 /*片上闪存*/
    FLASHI :原点= 0x0A8000, 长度= 0x0.8万 /*片上闪存*/
    FLASHJ :Origin = 0x0B0000, length = 0x0.8万 /*片上闪存*/
    // FLASHK :原点= 0x0B8000, 长度= 0x0.2万 /*片上闪存*/
    // FLASHL :原点= 0x0BA000, 长度= 0x0.2万 /*片上闪存*/
    FLASHM : Origin = 0x0BC000, length = 0x0.2万 /*片上闪存*/
    FLASHN : Origin = 0x0BE000, length = 0x0.2万 /*片上闪存*/
    /* 闪存库1 */
    FLASHO :原点= 0x0C0000, 长度= 0x0.2万 /*片上闪存*/
    FLASHP :原点= 0x0C2000, 长度= 0x0.2万 /*片上闪存*/
    FLASHQ :原始= 0x0C4000, 长度= 0x0.2万 /*片上闪存*/
    FLASHR :原点= 0x0C6000, 长度= 0x0.2万 /*片上闪存*/
    FLASHS :原点= 0x0C8000, 长度= 0x0.8万 /*片上闪存*/
    FLASHT :原点= 0x0D0000, 长度= 0x0.8万 /*片上闪存*/
    FLASHU :原点= 0x0D8000, 长度= 0x0.8万 /*片上闪存*/
    FLASHV :原点= 0x0E0000, 长度= 0x0.8万 /*片上闪存*/
    FLASHW : Origin = 0x0E8000, length = 0x0.8万 /*片上闪存*/
    FLASHX : Origin = 0x0F0000, length = 0x0.8万 /*片上闪存*/
    flashy :origin = 0x0F8000, length = 0x0.2万 /*片上闪存*/
    FLASHZ :原点= 0x0FA000, 长度= 0x0.2万 /*片上闪存*/
    FLASHAA :原点= 0x0FC000, 长度= 0x0.2万 /*片上闪存*/
    FLASHAB :原点= 0x0FE000, 长度= 0x0.2万 /*片上闪存*/

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



    Boot_RSVD :原点= 0x0.0002万, 长度= 0x0.012万 /* M0的一部分,引导ROM将使用此堆栈*/
    RAMM1 :原点= 0x0.04万, 长度= 0x0.04万 /*片上RAM块M1 */
    // RAMD0 :原点= 0x00D000, 长度= 0x0.08万
    // RAMD1 :原点= 0x00D800, 长度= 0x0.08万
    RAMLS0 :原点= 0x0.8万, 长度= 0x0.08万
    RAMLS1 :原点= 0x0.88万, 长度= 0x0.1万
    RAMLS2 :原点= 0x0.98万, 长度= 0x0.3万
    RAMLS3 :原点= 0x00C800, 长度= 0x0.08万
    RAMGS1 :原点= 0x00E000, 长度= 0x0.48万
    RAMGS2 :原点= 0x1.28万, 长度= 0x0.18万

    FLASHB :Origin = 0x8.2万, length = 0x0.2万 /*片上闪存*/
    FLASHC :原点= 0x8.4万, 长度= 0x0.2万 /*片上闪存*/
    FLASHD :原点= 0x8.6万, 长度= 0x0.2万 /*片上闪存*/
    FLASHE :原点= 0x8.8万, 长度= 0x0.8万 /*片上闪存*/
    FLASHG :原点= 0x9.8万, 长度= 0x0.8万 /*片上闪存*/
    FLASHK : Origin = 0x0B8000, length = 0x0.2万 /*片上闪存*/
    FLASHL :原点= 0x0BA000, 长度= 0x0.2万 /*片上闪存*/


    }


    章节


    code_start: >开始 页面= 0, 对齐(4)
    wddisable:> FLASHA PAGE =0, align(4)(wddisable:> FLASHA页面=0,对齐(4))
    COPY_Sections: > FLASHA PAGE = 0, ALIGN (4)
    .reset: > begin, page = 0, type = DSECT


    /*分配方案领域:*/



    wddisable: load > FLASHA
    Run > RAMD1 (运行> RAMD1),
    load_start(_wdLoadStart),
    load_size (_wdLoadSize),
    load_end (_wdLoadEnd),
    run_start(_wdRunStart),
    Run_Size (_wdRunSize),
    Run_End (_wdRunEnd),
    页面= 0,对齐(4)





    .main: 加载> FLASHA
    Run > RAMD1 (运行> RAMD1),
    load_start (_MainLoadStart),
    Load_Size (_MainLoadSize),
    Load_End (_MainLoadEnd),
    Run_start(_MainRunStart),
    Run_Size (_MainRunSize),
    Run_End (_MainRunEnd),
    页面= 0,对齐(4)

    .cinit: load > FLASHA,
    Run > RAMD0 (运行> RAMD0),
    load_start (_CinitLoadStart),
    Load_Size (_CinitLoadSize),
    load_end (_CinitLoadEnd),
    Run_start(_CinitRunStart),
    Run_Size (_CinitRunSize),
    Run_End (_CinitRunEnd),
    页面= 0,对齐(4)

    .Pinit: Load > FLASHA,
    Run > RAMM0 (运行> RAMM0),
    load_start(_PinitLoadStart),
    Load_Size (_PinitLoadSize),
    Load_End (_PinitLoadEnd),
    Run_start(_PinitRunStart),
    Run_Size (_PinitRunSize),
    Run_End (_PinitRunEnd),
    页面= 0,对齐(4)


    文字: LOAD = FLASHF,//FLASHE PAGE = 0,ALIGN (4)
    RUN = RAMGS0,
    load_start(_TextLoadStart),
    Load_Size (_TextLoadSize),
    Load_End(_TextLoadEnd),
    Run_start(_TextRunStart),
    Run_Size (_TextRunSize),
    Run_End(_TextRunEnd),
    页面= 0,对齐(4)


    ramfuncs: 负载= FLASHA,
    RUN = RAMD1,
    load_start(_RamfuncsLoadStart),
    load_size (_RamfuncsLoadSize),
    load_end (_RamfuncsLoadEnd),
    run_start(_RamfuncsRunStart),
    Run_Size (_RamfuncsRunSize),
    Run_End(_RamfuncsRunEnd),
    页面= 0,对齐(4)

    /* .ebss: LOAD = FLASHE,
    RUN = RAMGS2,
    load_start (_ebss_loadstart),
    load_size (_ebss_size),
    run_start(_ebss_runstart),
    页面= 1,对齐(4)
    */
    econst: LOAD = FLASHG,//FLASHE PAGE = 0,ALIGN (4)
    RUN = RAMGS1,
    load_start (_const_loadstart),
    load_size (_const_loadsize),
    run_start(_const_runstart),
    页面= 1,对齐(4)



    /*分配未初始化的数据段:*/

    堆栈 :> RAMLS1, 第= 1页
    .ebss :> RAMGS2, 第= 1页
    // . econst :> FLASHG, PAGE = 1 /*> RAMGS1 | RAMLS2 | RAMLS5,PAGE = 1*/
    esysmem :> RAMLS0, 第= 1页
    CIO :> RAMM1, 第= 1页



    /*用户定义的内存数据扇区:*/

    BufferDataSection :> RAMLS3, 页面=1, 对齐(4)
    Highrl :> RAMLS2, 页面=1, 对齐(4)
    lowrl :> RAMLS2, 页面=1, 对齐(4)
    timerl :> RAMLS2, 页面=1, 对齐(4)
    healthl :> RAMLS3, 页面=1, 对齐(4)
    healthlims :> RAMLS3, 页面=1, 对齐(4)
    用户 :> RAMLS3, 页面=1, 对齐(4)
    SavedUsers :> FLASHK, page =1, align(4)(已保存用户:> FLASHK,页面=1,对齐(4))
    savedusersdef :> FLASHB, 页面=1, align(4)
    persist :> RAMLS3, page =1, align(4)(持续:> RAMLS3,页面=1,对齐(4))
    持久性: > FLASHL, PAGE =1, ALIGN (4)(页面= 1,对齐(4))
    闪光限值 :> RAMLS3, 页面=1, 对齐(4)
    flashsysdetails :> RAMLS3, page =1, align(4)(闪存详细信息:> RAMLS3,页面=1,对齐(4))
    healthlimsdefault:> FLASHB, page =1, align(4)
    healthlimssaved :> FLASHC, 页面=1, 对齐(4)
    按钮 :> FLASHD, 页面= 1, 对齐(4)
    bootopsdef :> FLASHB, 页面=1, 对齐(4)

    }


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


    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    复制节文件:


    ##################################################################

    ;文件:DSP28xxx_SectionCopy_nonBIOS.ASM--Controller_II_v1_0修改

    ;说明:提供从复制初始化部分的功能
    ; 在进入_c_int00启动之前,在运行时刷新到ram
    ; 例程
    ##################################################################



    .ref _c_int00



    .global copy_sections
    .global _const_loadstart, _const_runstart, _const_loadsize
    .global _MainLoadStart, _MainRunStart, _MainRunSize
    .global _PinitLoadStart, PinitRunStart, PinitRunSize (_P)
    .global _TextLoadStart, _TextRunStart, 文本运行大小(_T)
    .global _CinitLoadStart, CinitRunStart (CinitRunStart) _CinitRunSize
    全局_wdLoadStart, _wdRunStart, _wdRunSize
    .global _RamfuncsLoadStart,_RamfuncsRunStart, _RamfuncsRunSize
    BSS Vara,1.

    ;*******************************************************
    ;*函数: COPY_Sections
    ;*
    ;*说明:将初始化的部分从闪存复制到ram
    ***************

    .sect "copy_sects"

    复制部分:




    MOVL XAR5,#_const_loadsize ;在XAR5中存储段大小
    MOVL ACC,@XAR5 ;将节段大小移至ACC
    MOVL XAR6,#_const_loadstart ;将加载起始地址存储在XAR6中
    MOVL XAR7,#_const_runstart ;在XAR7中存储运行地址
    LCR副本 ;要复制的分支

    MOVL XAR5,#_wdRunSize ;在XAR5中存储段大小
    MOVL ACC,@XAR5 ;将节段大小移至ACC
    MOVL XAR6,#_wdLoadStart ;在XAR6中存储加载开始地址
    MOVL XAR7,#_wdRunStart ;在XAR7中存储运行地址
    LCR副本 ;要复制的分支


    MOVL XAR5,#_PinitRunSize ;在XAR5中存储节大小
    MOVL ACC,@XAR5 ;将节段大小移至ACC
    MOVL XAR6,#_PinitLoadStart ;在XAR6中存储加载开始地址
    MOVL XAR7,#_PinitRunStart ;在XAR7中存储运行地址
    LCR副本 ;要复制的分支


    MOVL XAR5,#_MainRunSize ;在XAR5中存储段大小
    MOVL ACC,@XAR5 ;将节段大小移至ACC
    MOVL XAR6,#_MainLoadStart ;在XAR6中存储加载开始地址
    MOVL XAR7,#_MainRunStart ;将运行地址存储在XAR7中
    LCR副本 ;要复制的分支


    MOVL XAR5,#_RamfuncsRunSize ;在XAR5中存储段大小
    MOVL ACC,@XAR5 ;将节大小移动到ACC
    MOVL XAR6,#_RamfuncsLoadStart ;在XAR6中存储加载开始地址
    MOVL XAR7,#_RamfuncsRunStart ;在XAR7中存储运行地址
    LCR副本 ;要复制的分支


    MOVL XAR5,#_TextRunSize ;将节大小存储在XAR5中
    MOVL ACC,@XAR5 ;将节段大小移至ACC
    MOVL XAR6,#_TextLoadStart ;在XAR6中存储加载开始地址
    MOVL XAR7,#_TextRunStart ;将运行地址存储在XAR7中
    LCR副本 ;要复制的分支

    MOVL XAR5,#_CinitRunSize ;将节大小存储在XAR5中
    MOVL ACC,@XAR5 ;将节段大小移至ACC
    MOVL XAR6,#_CinitLoadStart ;在XAR6中存储加载开始地址
    MOVL XAR7,#_CinitRunStart ;在XAR7中存储运行地址
    LCR副本 ;要复制的分支

    磅_c_int00 ; Branch启动RTS库中的boot.asm

    副本:
    B回路,EQ ;如果ACC为零则返回(没有要复制的部分)

    SubB ACC,#1

    报告 ;将部分从加载地址复制到
    || PWRITE *XAR7,*XAR6++ ;运行地址

    返回:
    LRETR ;返回

    结束

    ;//===================================================================================================
    ;//文件结束。
    ;//===================================================================================================

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

    它是Fapi服务监视程序功能中缺少的EALLOW。

    感谢您的参与,我已经看过代码部分很多次了,我认为它已经不能再正确地看到了。 无论如何,在我确认这是一个解决方案之前,您可以忽略对前两个帖子作出响应的需要。

    非常感谢,度过了一个愉快的周末
    意愿
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将,

    很高兴它有所帮助。
    周末愉快!

    此致,
    Vamsi