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.

[参考译文] TMS570LC4357:跳转到应用程序后调用 systemInit() 时出现问题

Guru**** 2747405 points

Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1607543/tms570lc4357-issue-with-calling-systeminit-after-jumping-to-application

器件型号: TMS570LC4357

你好,我又来了!

所以我有一段时间的应用程序工作了、但随着在引导中添加了 saftey-lib 自测功能、启动要复杂得多。 我发现当跳转到应用程序时,我在 systemInit() 中得到一个数据中止,具体地在 periphInit() 中。

在执行期间调用该函数两次是否存在问题? 在引导启动期间、再次在应用中(当然是不同的)?

我以不同的方式解决了这个问题 — 在引导中,而不是跳过:

((void (*)(void))entryPointAddress)();  

我将入口点地址存储在特定的存储器位置、然后执行软件复位。  

然后在_c_int00 () 中、用 SW_RESET 表示:我检查该地址并直接跳转到应用程序。 然后它将执行所有常用的_c_int00 () 数据。

这意味着所有的启动工作只执行一次。 它似乎更可靠、但可能不太直观/合乎逻辑。

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

    您好、Paul:

    我从来没有这样做过,我的意思 是,我从来没有调用 systemInit 两次。

    但是、我从内部 AI 得到了一些有用的提示、请验证一次此回复:

    是的、systemInit()在执行期间调用两次时存在问题。 当您使用如所示的函数指针直接从引导加载程序跳转到应用程序时((void (*)(void))entryPointAddress)()、硬件外设已通过引导加载程序的systemInit()调用进行初始化。 当应用程序随后systemInit()periphInit()再次调用→μ s 时、它会尝试重新初始化已配置的外设、这可能会导致:

    1. 数据中止异常 -尝试写入处于意外状态的外设寄存器
    2. 外设冲突 -某些外设可能无法正常地处理重新初始化
    3. 安全机制冲突 -在引导加载程序中运行安全库自检,系统状态变得更加复杂

    这在 TMS570LC4357 等 Hercules 安全器件上尤其出现问题、其中:

    • 安全功能(锁步 CPU、ECC、BIST)处于活动状态
    • 对外设状态的控制更为严格
    • 自检库可修改系统配置

    您的软件重置解决方案有效

    您的方法 执行软件复位和跳入 _c_int00()实际上是一个 建议的模式 进行引导加载程序到应用程序的转换、尤其是在安全关键型应用中。 这就是它的优势所在:

    优势:

    1. 清洁系统状态 -复位可确保所有外设在应用程序初始化之前返回其复位状态
    2. 正确的启动顺序 -应用程序完成了完整的_c_int00()初始化,包括:
      • 内存初始化 () _memInit_()
      • 电池组设置
      • C/C++运行时初始化
      • 正确systemInit()执行
    3. 安全库兼容性 -自检在引导加载程序中运行一次,然后干净地过渡到应用程序
    4. 更可靠 -消除外围设备状态冲突和初始化顺序问题

    --
    此致、
    Jagadish。

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

    尊敬的 Jagadish:

    这是很好的确认。 根据我的经验、我怀疑在引导映像和应用程序映像之间进行转换的方法是正常的。

    值得强调的是,此处提供的引导加载程序和应用程序示例只是函数调用方法,因此 systemInit() 将被调用两次。