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.

[参考译文] TMS570LS3137-EP:CPU启动问题-使用调试器时正常-独立运行KO

Guru**** 2589280 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS1224

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1096919/tms570ls3137-ep-cpu-startup-issue---ok-with-debugger---ko-in-standalone

部件号:TMS570LS3137-EP
主题中讨论的其他部件:HALCOGENTMS570LS1224

你(们)好

目前,我们的项目遇到了障碍,SW无法自行启动。 这只是没有引导加载程序的应用程序SW端。 用于测试应用程序的起始地址设置为0x0。

SW将使用调试器正常运行。 当调试器断开连接时,它将继续运行“OK”(确定)。

如果我们关闭并重新打开主板,它将不会执行。

我试图使用调试器(XSD200)来仅加载符号,根据我的理解,这些符号相当于“附加”到正在运行的目标。

当ECU处于此limbo状态时,代码始终在数据异常中止时停止。 问题是我们无法在通电时捕获执行的开始,因此我们无法精确定位导致问题的代码中的位置。

如果重置CPU以重新启动代码,则无法重现该问题。

仅重新启动而不重置将导致异常触发的位置不一致。 请注意,启动代码不是由halcogen生成的,我们使用的是ETAS RTA OS。

 

所有其它项目“裸机”,其中通过HALCOGEN生成引导顺序,工作正常。

到目前为止,我们无法成功地将halcogen引导序列与操作系统功能(尤其是操作系统矢量初始化功能)混合。 它总是会触发某种异常。

请问您有什么意见?

提前感谢。

分段

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

    您好,

     当您连接到处理器并发现它被捕获在数据故障处理程序中时,数据故障状态寄存器和其他程序的值是什么? 请参阅以下内容? 请参阅Arm Cortex-R4F TRM,了解这些位的解码,了解故障的根本原因。  

      

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

    您好Charles

    感谢您的回复。

    这是我得到的:

    它在电源循环中保持一致。 数据故障地址0xD0FE9EF8似乎在保留空间中。

    如果我对 Arm Cortex-R4F TRM的内容有很好的解释,0x808意味着:

    bit12 == 1: AXI从错误(SLVERR或OOK响应独占读取事务)导致中止。

    位3-0 == 0x8: 同步外部中止,数据故障地址的有效值为... 它似乎在一个保留的空间里,但却在令人惊奇。

    将继续在论坛中寻找可能导致这种情况的原因。

    在解决这一问题时,我们将非常感谢您的帮助。

    此致

    分段

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

    您好,Seb:

     错误状态表示故障 是由于写入引起的。 错误地址确实是一个非法地址,它将导致内部地址解码逻辑向处理器生成中止信号。 虽然我不确定导致中止的原因,但我倾向于认为它可能与操作系统有关。  

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

    你(们)好

    我不确定它是否与操作系统相关。 我做了一些测试,它看起来很早就会中止。

    这是主要功能:

     

    测试1:操作系统矢量初始化后激活LED

     

     

    结果:在调试器上运行正常。 关闭并重新打开电源后,未到达LED端口初始化功能/ LED亮起-低亮度模式

     

    测试2:在OS vector init 和Comment Out fnIosCustomTargetStartup()之后激活LED

     

     

    结果:在调试器上运行正常。 关闭电源后再打开,未达到初始化功能/ LED亮起-低亮度模式

     

    测试3:在OS vector init 和Comment Out fnIosCustomTargetStartup()和Comment Out OS_InitializeVectorTable()之后激活LED

     

     

     

    结果:

    使用调试器,到达LED初始化功能并点亮LED

    使用以下堆栈进入OS Shutdown (操作系统关机)

     

    CPU未处于系统模式,因此关机

     

     

     

    关闭电源后再打开,未达到初始化功能/ LED亮起-低亮度模式

     

    测试4:OS_InitializeVectorTable()返回,但在系统初始化和LED激活之后返回

     

     

     

    使用调试器运行,但在代码中的稍后SPI传输时被卡在while循环中...

    关闭电源后再打开,未达到初始化功能/ LED亮起-低亮度模式

    所有这些都让我认为调试器将CPU设置为良好的执行状态,而在main之前的引导代码不会这样做。

    启动代码不是由halcogen生成的,与Halcogen的功能相比,它是非常小的。 它一直保持这样的状态,因为它似乎扰乱了操作系统的执行,而且我总是以一种例外的方式结束。

    如果这有帮助,我可以私下分享项目。

    此致

    分段

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

    您好,

     根据您的测试4结果,我同意在main()启动之前,您的启动代码可能有一些不正确的地方。  我将建议一种调试方法。  我想你有sys_intvecs.asm文件,对吗? 将"resetEntry (重置尝试)"修改为下面以红色显示。 这将强制处理器在加电后在Resettry上旋转。 然后使用调试器提供的“移动到行”将程序计数器强制到_c_int00的第一行。 从这里,您可以单步执行代码,直到看到中止。  

    ----------------------------------
    ; sys_intvecs.asm

    ;(c)德州仪器(TI) 2009-2013,2013,保留所有权利。

    .sect ".intvecs"
    手臂

    ----------------------------------
    ;导入中断例程的引用

    .ref _c_int00
    .ref _dabort

    .def重置启动

    ----------------------------------
    ;中断向量

    重置启动
    b #-8
    未定义结束
    b未定义结束
    svcEntry
    B服务入门
    PrefetchEntry
    B预胎儿心腔
    b _dabort
    已保留的尝试
    b已保留
    LDR PC,[PC,#-0x1b0]
    LDR PC,[PC,#-0x1b0]

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

    您好Charles

    感谢您的回复。 我会尝试执行此操作,但在我们设置了操作系统后,引导顺序与标准设置略有不同。

    它取自ETAS提供的"HelloWorld"示例。

    主项目具有以下用于矢量设置的链接器脚本:

    章节

    /*异常向量表/异常处理程序代码
    * IRQ/SWI和数据/预取异常分为各自的部分
    *以更好地支持用户生成的矢量表
    *公共输出部分用于防止链接器注入长跨跳曲面*/
    //下面的部分(如果我们正在使用操作系统库)
    //.OS_ExceptionVectors:加载= 0x004
    //{
    //--library=RTAOS.lib(.OS_ExceptionVectors)/* OS生成的矢量表(包括FIQ处理程序)。 */
    //--library=RTAOS.lib(.OS_IRQ)
    //--library=RTAOS.lib(.OS_SWI)
    //--library=RTAOS.lib(.OS_ExceptionHandlers)
    //}//CRC_TABLE (_App_CRC_TABLE,算法=TMS570_CRC64_ISO)

    //如果我们使用的是操作系统源文件,请参阅下面的部分
    .OS_ExceptionVectors:{},load = 0x004
    OS_IRQ:{},palign = 4 > VECTBL
    OS_SWI :{},palign =4 > VECTBL
    .os_ExceptionHandlers :{},palign =4 > VECTBL

    我的重置处理程序如下所示:

    ;;此文件提供使用标准TI初始化的重置处理程序
    ;;例程,但跳过初始切换至用户模式(参见下文)。

    .sect ".text"
    对齐4.
    单击
    .armfunc OS_InitAdjustingEntry
    州32.
    全局OS_InitAdjustingEntry
    .global _c_int00

    os_InitAdjustingEntry:

    ;启用对浮点协处理器的访问。
    MRC P15,#0x0,r0,c1,c0, #0x2;读取协处理器访问控制寄存器。
    MOV R3,#0x00F0万;协处理器10和11的完全访问掩码
    orr r0,r0,r3;(VFP协处理器)。
    MCR P15,#0x0,r0,c1,c0, 0x2;写入协处理器访问控制寄存器。

    ;启用高级VFP扩展(fpexc中的位30)。
    MOV r0,#0x4000万
    vmsr fpexc,r0
    ;跳至超过TI提供的C启动代码40字节。 前40个字节
    ;(即 10个说明)执行上述VFP初始化
    ;,然后切换到用户模式,因为我们要跳过切换到用户模式
    ;模式下,我们需要复制VFP初始化代码并跳过
    ;模式更改。
    ;请参阅TI目录中的lib\rtssrc.zip\boot.asm。
    BL _c_int00 + 40

    与c_int00类似:

    .armfunc _c_int00

    ;************************************************************************
    ;* 32位状态引导例程*
    ;************************************************************************

    .global __stack
    ;*******************************************************
    ;*定义用户模式堆栈(默认大小为512)
    ;*******************************************************
    __stack:.usect ".stack",0,4

    .global _c_int00
    ;*******************************************************
    ;*函数DEF:_c_int00
    ;*******************************************************
    _c_int00:.asmfunc stack_usage(0)

    如果__TI_NEON_support__|__TI_VFP_support__
    ;*------------------
    ;*设置对协处理器的特权和用户模式访问
    ;* 10和11,需要启用NENE/VFP
    ;*协处理器访问控制REG
    ;*位[23:22]- CP11,[21:20]- CP10
    ;*设置为0b11以启用用户和PRIV模式访问
    ;*------------------
    MRC P15,#0x0,r0,c1,c0,#2
    MOV R3,#0xf0万
    Orr r0,r0,r3
    MCR P15,#0x0,r0,c1,c0,#2

    ;*------------------
    ;设置EN位,FPEXC[30]以启用NEON和VFP
    ;*------------------
    MOV r0,#0x4000万
    FMXR FPEXC,r0
    endif

    ;*------------------
    ;*设置为用户模式
    ;*------------------
    R0夫人,CPSR
    BIC r0,r0,#0x1F;清除模式
    orr r0,r0,#0x10;设置用户模式
    MSR CPSR_CF,r0

    ;*------------------
    ;*初始化用户模式堆栈
    ;*------------------
    如果__TI_Avoid嵌入式常量
    MOVW sp,__stack_end
    MOVT sp,__stack_end
    否则
    LDR sp,c_stack_end
    endif

    ;*------------------
    ;*调用__MPU_INIT HOOK函数。
    ;*------------------
    BL __MPU_INIT

    ;*------------------
    ;*执行所有必需的初始化
    ;*_SYSTEM_PRE_INIT()返回非零:
    ;*-进程BINIT表
    ;*-执行C自动初始化
    ;*-调用全局构造函数
    ;*------------------
    bl _system_pre_init
    CMP R0,#0
    BEQ bypass_auto_init
    BL __TI_auto_init
    旁路自动初始化:

    ;*------------------
    ;*调用应用程序
    ;*------------------
    bl _args_main

    ;*------------------
    ;*如果应用程序没有调用EXIT,则调用EXIT(1)
    ;*------------------
    MOV R0,#1
    BL出口

    ;*------------------
    ;*完成,永久循环
    ;*------------------
    L1:B L1
    {\f2 .endasmfunc}

    ;*******************************************************
    ;*此模块使用的常量
    ;*******************************************************
    如果!__TI_Avoid嵌入式常量
    c_stack_end .lo __stack_end
    endif

    ;************************************************
    ;*未定义的引用*
    ;************************************************
    .global __stack_end
    .global _system_pre_init
    .global __TI_auto_init
    .global _args_main
    全局退出
    .global __MPU_INIT

    结束

    __MPU_INIT为空。

    我正在处理一个简化的项目,它比主项目的构建速度更快,并且允许更快的迭代。

    HALCOGEN为裸机项目生成的启动序列具有更多内容。 因此,我们的想法是尽可能保留Halcogen生成的内容以供启动,但要根据操作系统的需要进行调整。

    在这个简化的项目中,我有以下链接器脚本:

    章节

    /*异常向量表/异常处理程序代码
    * IRQ/SWI和数据/预取异常分为各自的部分
    *以更好地支持用户生成的矢量表
    *公共输出部分用于防止链接器注入长跨跳曲面*/
    //下面的部分(如果我们正在使用操作系统库)
    //.OS_ExceptionVectors:加载= 0x004
    //{
    //--library=RTAOS.lib(.OS_ExceptionVectors)/* OS生成的矢量表(包括FIQ处理程序)。 */
    //--library=RTAOS.lib(.OS_IRQ)
    //--library=RTAOS.lib(.OS_SWI)
    //--library=RTAOS.lib(.OS_ExceptionHandlers)
    //}//CRC_TABLE (_App_CRC_TABLE,算法=TMS570_CRC64_ISO)

    //如果我们使用的是操作系统源文件,请参阅下面的部分
    .OS_ExceptionVectors:{},load = 0x004
    OS_IRQ:{},palign = 4 > VECTBL
    OS_SWI :{},palign =4 > VECTBL
    .os_ExceptionHandlers :{},palign =4 > VECTBL

    .cinit:{}> flash /* Initialization Tables */
    文本{*(.text)}>闪烁
    .const:{}> flash /*常量数据*/
    .Pinit:{}> FLASH /*模板初始化表*/

    .bss:fill = 0x00 {}> MEM /*全局变量和静态变量,
    *必须填充0x00至
    *运行时初始化*/
    数据:{}> MEM /*已初始化数据*/
    sysmem:{}> MEM /*动态内存分配区域*/

    /* CPU堆栈*/
    堆栈:{}(无负载)> MEM (高)
    }

    和以下重置处理程序:

    ;;此文件提供使用标准TI初始化的重置处理程序
    ;;例程,但跳过初始切换至用户模式(参见下文)。

    .sect ".text"
    对齐4.
    单击
    .armfunc OS_InitAdjustingEntry
    州32.
    全局OS_InitAdjustingEntry
    .global _c_int00
    .global _coreInitRegisters

    os_InitAdjustingEntry:

    BL _coreInitRegisters _
    ;启用对浮点协处理器的访问。
    MRC P15,#0x0,r0,c1,c0, #0x2;读取协处理器访问控制寄存器。
    MOV R3,#0x00F0万;协处理器10和11的完全访问掩码
    orr r0,r0,r3;(VFP协处理器)。
    MCR P15,#0x0,r0,c1,c0, 0x2;写入协处理器访问控制寄存器。

    ;启用高级VFP扩展(fpexc中的位30)。
    MOV r0,#0x4000万
    vmsr fpexc,r0
    ;跳至超过TI提供的C启动代码40字节。 前40个字节
    ;(即 10个说明)执行上述VFP初始化
    ;,然后切换到用户模式,因为我们要跳过切换到用户模式
    ;模式下,我们需要复制VFP初始化代码并跳过
    ;模式更改。
    ;请参阅TI目录中的lib\rtssrc.zip\boot.asm。
    bl _c_int00 ;+ 40

    使用从Halcogen获取的以下_cint00,按照通常涵盖的方式(至少部分覆盖)为所有安全装置脱机 通过Autosar MCAL并使其尽可能简单,但使用一个轻微的修改注释掉_coreInitRegisteres_,就像调用_c_Int00之前在重置处理程序中完成的那样,它会根据需要将CPU置于系统模式。

    另外,在 操作系统矢量表完成时,注释掉_coreInitStackPointer_。

    void _c_int00 (void)

    ///*用户代码开始(5)*/
    // UINT32_t c_stack_end;
    ///*用户代码结束*/
    //
    ///*初始化核心寄存器以避免CCM错误*/
    //_coreInitRegisters_();
    //
    ///*用户代码开始(6)*/
    ///*用户代码结束*/
    //
    ///*初始化堆栈指针*/
    //_coreInitStackPointer_();
    //

    /*用户代码开始(7)*/
    /*用户代码结束*/

    /*勘误表设备#140的变通方法:(仅适用于A版芯片)
    *
    *勘误表说明:
    *冷启动后,内核比较模块(CCM-R4)可能导致断言nError
    *解决方法:
    *清除ESMSR2中的ESM Group2通道2错误和CCMSR寄存器中的比较错误*/
    IF (DEVICE_ID_REV == 0x802AAD05U)

    _esmCcmErrorsClear_();
    }

    /*用户代码开始(8)*/
    /*用户代码结束*/

    /*启用CPU事件导出*/
    /*这允许CPU发出检测到的任何单位或双位错误的信号
    *通过其ECC逻辑访问闪存或数据RAM。
    */
    _coreEnableEventBusExport_();

    /*用户代码开始(11)*/
    /*用户代码结束*/

    /*勘误表CORTEXR4 66的变通办法*/
    _勘 误表_CORTEXR4_66_();

    /*勘误表CORTEXR4 57 */的变通办法
    _勘 误表_CORTEXR4_57_();

    /*重置处理程序:以下指令从系统异常状态寄存器中读取
    *以确定CPU重置的原因。
    */

    /*检查开机重置条件*/
    /*SAFETYMCUSW 139 S MR:13.7 <approved>"Hardware status bit read check"*/
    如果((SYS_Exception & poweron_reset)!=0U)

    /*用户代码开始(12)*/
    /*用户代码结束*/
    /*添加条件以检查PLL是否可以成功启动*/
    如果(_RETRICAT_SSWF021_45_Both _PLLs(PL_retries)!=0U)

    /*将系统置于安全状态*/
    HandlePLLLockFaile();
    }
    /*清除所有重置状态标志*/
    sys_exception = 0xFFFFU;

    /*用户代码开始(13)*/
    /*用户代码结束*/
    /*用户代码开始(14)*/
    /*用户代码结束*/
    /*用户代码开始(15)*/
    /*用户代码结束*/
    /*继续正常启动顺序*/
    }
    /*SAFETYMCUSW 139 S MR:13.7 <approved>"Hardware status bit read check"*/
    否则,如果((SYS_Exception & OSC Failure_reset)!=0U)

    振荡器故障导致/*重置。
    在此处添加用户代码以处理振荡器故障*/

    /*用户代码开始(16)*/
    /*用户代码结束*/
    }
    /*SAFETYMCUSW 139 S MR:13.7 <approved>"Hardware status bit read check"*/
    否则,如果((SYS_Exception & watchdog _reset)!=0U)

    /*重置已到期
    * 1)窗口监视违反-在此处添加用户代码以处理监视违反。
    * 2) ICEPICK重置-通过CCS加载代码后/通过CCS重置系统
    */
    /*检查看门狗状态寄存器*/
    如果(watchdog状态!= 0U)

    /*在此处添加用户代码以处理监视程序违规。 */
    /*用户代码开始(17)*/
    /*用户代码结束*/

    /*清除异常状态寄存器中的监视程序重置标志*/
    sys_exception = watchdog重设;

    /*用户代码开始(18)*/
    /*用户代码结束*/
    }
    否则

    /*清除异常状态寄存器*/中的ICEPICK重置标志
    SYS_Exception = ICEPICKICK重置;
    /*用户代码开始(19)*/
    /*用户代码结束*/
    }
    }
    /*SAFETYMCUSW 139 S MR:13.7 <approved>"Hardware status bit read check"*/
    否则,如果((SYS_Exception & CPU_RESET)!=0U)

    /*由于CPU重置导致重置。
    CPU重置可能是由CPU自检完成,或引起的
    通过切换CPU重置控制寄存器的"CPU RESET (CPU重置)"位。 */

    /*用户代码开始(20)*/
    /*用户代码结束*/

    /*清除所有重置状态标志*/
    sys_exception = cpu_reset;

    /*用户代码开始(21)*/
    /*用户代码结束*/

    }
    /*SAFETYMCUSW 139 S MR:13.7 <approved>"Hardware status bit read check"*/
    否则,如果((SYS_Exception & SW_RESET)!=0U)

    /*由于软件重置而导致重置。
    添加用户代码以处理软件重置。 */

    /*用户代码开始(22)*/
    /*用户代码结束*/
    }
    否则

    /*由nRST从外部驱动为低电平导致的重置。
    添加用户代码以处理外部重置。 */

    /*用户代码开始(23)*/
    /*用户代码结束*/
    }

    /*检查开机期间是否出现ESM group3错误。
    *在eFuse自动加载或从闪存OTP读取时可能会发生这种情况
    *在通电过程中。 设备操作不可靠,不建议使用
    *在这种情况下。
    * ESM group3错误仅驱动nError针脚过低。 外部电路
    监视nError引脚的*必须采取适当的措施来确保这一点
    *系统被置于安全状态,具体取决于应用程序。
    */
    如果(esmREG->SR1[2])!= 0U)

    /*用户代码开始(24)*/
    /*用户代码结束*/
    /*SAFETYMCUSW 5 C MR:NA <approved>"FOR(;;) can be removed by adding "# if 0" and "# endif" in the user codes above and below "*/
    /*SAFETYMCUSW 26 S MR:NA <approved>"FOR(;;) can be removed by adding "# if 0" and "# endif" in the user codes above and below "*/
    /* SAFETYMCUSW 28 D MR:NA <approved>"for (;)可通过在上述及以下用户代码中添加"# if 0"和"# endif"来删除"*/
    对于(;;)

    }/*等待*/
    /*用户代码开始(25)*/
    /*用户代码结束*/
    }

    /*用户代码开始(26)*/
    /*用户代码结束*/

    /*初始化系统-时钟,闪存设置和Efuse自检*/
    SystemInit();

    /*勘误表PBIST#4的变通办法*/
    勘误表_PBIST_4();

    /*在STC ROM上运行PBIST */
    pbistRun(UINT32)STC_ROM_PBIST_RAM_GROUP,
    ((UINT32) PBIST_TripleReadSlow |(UINT32) PBIST_TripleReadFast);

    /*等待PBIST完成STC ROM */
    /*SAFETYMCUSW 28 D MR:NA <approved>“Hardware status bit read check”*/
    while (pbistIsTestCompleted()!= true)

    }/*等待*/

    /*检查STC ROM上的PBIST是否通过自检*/
    if( pbistIsTestPassed()!= true)

    /* PBIST和STC ROM自检失败。
    *需要自定义处理程序来检查内存故障
    *并采取适当的下一步措施。
    */

    pbistFail ();

    }

    /*禁用PBIST时钟并禁用内存自检模式*/
    pbistStop();

    /*在PBIST ROM上运行PBIST */
    pbistRun(UINT32)PBIST_ROM_PBIST_RAM_GROUP,
    ((UINT32) PBIST_TripleReadSlow |(UINT32) PBIST_TripleReadFast);

    /*等待PBIST完成PBIST ROM */
    /*SAFETYMCUSW 28 D MR:NA <approved>“Hardware status bit read check”*/
    while (pbistIsTestCompleted()!= true)

    }/*等待*/

    /*检查PBIST ROM是否通过自检*/
    if( pbistIsTestPassed()!= true)

    /* PBIST和STC ROM自检失败。
    *需要自定义处理程序来检查内存故障
    *并采取适当的下一步措施。
    */

    pbistFail ();

    }

    /*禁用PBIST时钟并禁用内存自检模式*/
    pbistStop();
    /*用户代码开始(29)*/
    /*用户代码结束*/

    /*用户代码开始(31)*/
    /*用户代码结束*/


    /*用户代码开始(37)*/
    /*用户代码结束*/


    /*初始化CPU RAM。
    *此功能使用系统模块的硬件自动初始化存储器及其
    相关的保护计划。 通过设置MSIENA寄存器的位0初始化CPU RAM。
    *因此值0x1传递给函数。
    *此功能将初始化整个CPU RAM和相应的ECC位置。
    */
    内存初始化(0x1U);

    /*用户代码开始(38)*/
    /*用户代码结束*/

    /*为TCRAM访问启用ECC检查。
    *此功能启用CPU的ECC逻辑以访问B0TCM和B1TCM。
    */
    _coreEnableRamecc_();

    /*用户代码开始(39)*/
    /*用户代码结束*/

    /*用户代码开始(55)*/
    /*用户代码结束*/


    /*用户代码开始(68)*/
    /*用户代码结束*/

    /*用户代码开始(72)*/
    /*用户代码结束*/

    /*通过Vic控制器启用IRQ偏移*/
    //_coreEnableIrqVicOffset_();


    /*用户代码开始(73)*/
    /*用户代码结束*/

    /*初始化VIM表*/
    //vimInit();

    /*用户代码开始(74)*/
    /*用户代码结束*/

    /*配置系统对发送给ESM组1*/的错误情况的响应
    /*此功能可从HALCoGen */的ESM选项卡进行配置
    esmInit();
    /*初始化复制表*/
    __TI_auto_init();
    /*用户代码开始(75)*/
    /*用户代码结束*/

    /*调用应用程序*/
    /*SAFETYMCUSW 296 S 8.6 <approved>“启动代码(块范围的库函数)”*/
    /*SAFETYMCUSW 326 S MR:8.2 <approved>“启动代码(库中的主代码声明)”*/
    /*SAFETYMCUSW 60 D MR:8.8 <approved>“启动代码(库中的main声明;仅对相同的执行extern)”*/
    主要();

    /*用户代码开始(76)*/
    /*用户代码结束*/
    /*SAFETYMCUSW 122 S MR:20.11 <approved>“Startup code (exit and abort need to be present )"*/
    // exit(0);

    /*用户代码开始(77)*/
    /*用户代码结束*/
    }

    重新刷新后,如果调试器步进到main,或者在重新刷新后直接运行,此项目也可以正常运行。

    关闭电源后重启,仅加载符号,数据中止为:

    数据故障地址似乎一致。

    仍仅在加载符号模式下,在系统重置/CPU重置并重新启动后,我可以在_c_int00中进入该行:  

    然后,它进入数据中止,并使用:

    这似乎是最后的一致性...

    有什么想法可能导致我们在重新加载和重启后出现行为差异?

    它是否会链接到栈指针获取奇怪的值(即超出RAM范围)?...

    谢谢

    分段

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

    你(们)好  

    我尝试了你在上一篇文章中所说的调试技术。 我可以移动到重置处理程序的第一行,然后执行该处理程序,导致以下完美中止:

    我尝试了很多东西,但到目前为止,我没有做出一个能解释这首诗的一贯行为。

    压力增大,思想失控。

    是否有基于上述内容的指针?

    此致

    分段

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

    您好,Seb:

      您有多少块板? 您是否始终遇到所有主板的相同问题?

      查看您的错误状态,它会为CP15_instruction_falut_status寄存器显示0xD。 这是权限错误。 通常,这是由于MPU设置阻止访问地址的特定区域。  

     在您移动到ResetEntry (重新设置)后,您是否可以单步执行操作?   

      我还看到你们对以下两行进行了评论。 这些是HalcGen初始化处理器的第一件事。 尽管您提到操作系统将在以后处理它们,但将它们注释出来可能是一个问题。 但我认为这可能为时已晚。  

    //_coreInitRegisters_();
    //
    ///*用户代码开始(6)*/
    ///*用户代码结束*/
    //
    ///*初始化堆栈指针*/
    //_coreInitStackPointer_();

      

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

    您好Charles

    我手边没有其他板来检查我是否与另一板检查完全相同的问题。

    但当然,从我的帖子开始,在我们拥有的每一个主板上,我们都可以使用调试器启动SW,但它将在关闭电源后无法启动LTO。

    在最后一篇关于你的调试技术的文章中,我不能单步走。 它直接地说是例外。

    在尝试调试技术之前,我对  _c_int00中的_coreInitRegisters_()和_coreInitStackPointer_()函数进行了有效的注释,但我的重置处理程序就像这样-所以实际上执行了这两个函数:

    os_InitAdjustingEntry:

    BL _coreInitRegisters _
    bl _coreInitStackPointer_
    ;启用对浮点协处理器的访问。
    MRC P15,#0x0,r0,c1,c0, #0x2;读取协处理器访问控制寄存器。
    MOV R3,#0x00F0万;协处理器10和11的完全访问掩码
    orr r0,r0,r3;(VFP协处理器)。
    MCR P15,#0x0,r0,c1,c0, 0x2;写入协处理器访问控制寄存器。

    ;启用高级VFP扩展(fpexc中的位30)。
    MOV r0,#0x4000万
    vmsr fpexc,r0

    ;初始化堆栈指针

    ;LDR sp,c_stack_end

    ;跳至超过TI提供的C启动代码40字节。 前40个字节
    ;(即 10个说明)执行上述VFP初始化
    ;,然后切换到用户模式,因为我们要跳过切换到用户模式
    ;模式下,我们需要复制VFP初始化代码并跳过
    ;模式更改。
    ;请参阅TI目录中的lib\rtssrc.zip\boot.asm。
    bl _c_int00 ;+ 40

    此外 ,由于操作系统使用单一堆栈来处理所有事务,并且没有CAT2 ISR,因此对_coreInitStackPointer_进行了如下修改。

    _coreInitStackPointer_

    CPS #17
    LDR sp,fiqSp
    CPS #18
    LDR sp,irqSp
    CPS #19
    ldr sp,svcSp.
    CPS #23
    LDR sp,中止Sp.
    CPS #27
    LDR sp,undefSp
    CPS #31
    LDR sp,用户组
    BX LR

    userSp .word 0x800万+0x00001000</s>0.1万
    svcSp .word 0x800万+0x00001000+0x00000000</s>0.1万 0万
    fiqSp .word 0x800万+0x00001000+0x000000000000+0x000000000000</s>0.1万 0万0万0万0万
    irqSp .word 0x08000000+0x00001000+0x000000000000+0x0000000000000000+0x000000000000</s>0.1万 0万0万0万0万0万0万
    abortSp .word 0x08000000+0x00001000+0x000000000000+0x000000000000+0x000000000000+0x000000000000+0x00000000</s>0.1万 0万0万0万0万0万0万0万0万0万
    undefSp .word 0x08000000+0x00001000+0x000000000000+0x000000000000+0x0000000000000000+0x000000000000+0x000000000000</s>00001000 0万0万0万0万0万0万0万0万0万0万

    {\f2 .endasmfunc}

    但即使这样,我也会直接 在第一个步骤中遇到一个未定义的异常。

    任何指示器都值得欣赏。 如果这有帮助,我也可以共享项目。

    此致

    分段

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

    您好,

     我希望我能提供更多帮助。 但我真的不知道哪里出了问题。  

    它直接变为例外。[/QUOT]

    您是如何单步走的? 您是否逐行逐步拆卸? 在您将行移至ResetEntry (重新设置)后,哪个汇编行导致预取中止或数据中止?

    在拆卸窗口中,您需要使用下面的图标执行单步拆卸。  

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

    您好Charles

    您是如何单步走的? 您是否逐行逐步拆卸? 在您将行移至ResetEntry (重新设置)后,哪个汇编行导致预取中止或数据中止?

    是,拆解时的单步操作。

    关于gel脚本,通过论坛阅读,我阅读了几个关于gel脚本的文章,但我没有找到一个解释在哪里打开它。

    你能引导我完成这项工作吗?

    谢谢

    分段

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

    您好Charles

    但是,调试器可以做什么作为额外的工作,使CPU处于一个运行相同代码的快乐位置?

    很难理解调试器为什么不显示问题。

    谢谢

    此致

    分段

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

    您好,

     您是否在将行移至 _c_int00中的第一行后说,如果您只单步执行一行,那么您将立即中止? 如果不是,哪一行导致了中止?

    请参见以下内容以打开Gel脚本。  

    1.在调试视图中的CCS中,转至“工具”->“ARM高级功能”,您应该首先看到下面的窗口。

    2.选择Gel Files

    3.双击凝胶文件。 我以tms570ls1224.gel为例。 您的将有所不同。  

    您也可以在 C:\ti\<您的CCS版本>\CCS\CCS_base\emulation \gel目录中找到相同的文件。

    尽管如此,如果您不熟悉凝胶,那么我怀疑您修改了凝胶,并且您很可能使用CCS提供的默认凝胶,这不会导致问题。 如果您有定制凝胶,为什么不将您的凝胶与我上面提到的目录中CCS提供的凝胶进行比较。  

    CPU在一个新的调试器上运行的时候会出现什么?

    在CCS中,如果您使用“CPU reset”,它只是将PC (程序计数器)设置为0x0。 它根本不会重置设备。  

    如果您使用"Restart"(重新启动),它会将PC移动到代码的入口点地址(_c_int00)。 根据调试器的设置,调试器可能会自动运行到main()。

    如果您使用"系统重置",则热重置将重置除调试逻辑之外的设备。  

    如果您使用“自由运行”,它将在调试器断开连接的情况下运行代码。  

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

    你(们)好

    感谢您的解释。

    这有助于了解不同的可能性。 我终于解决了这个问题 长话短说,从电源循环重新启动时,CPU不希望有不同于0x00的入口点。 在这 种情况下,调试器具有欺骗性,因为它可以处理此问题。  

    我解决了操作系统需要使用_c_int00函数从0x00开始的问题,调用操作系统函数以启用对协处理器的访问+浮点,然后返回到_c_Int00,但由于存在10nop指令间隔,OSEntry函数需要这样做。 然后执行从halcogen生成的_c_int00函数的其余部分,该函数继续使用 _coreInitRegister_.

    就是这样。 立即启动100 % of the Time。

    非常感谢您的支持

    此致

    分段