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:TMS570LC4357:EMIF 中多个应用的矢量表重定向实现

Guru**** 2826855 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/1592792/tms570lc4357-tms570lc4357-implementation-of-vector-table-redirection-for-multiple-applications-in-emif

器件型号: TMS570LC4357

尊敬的 TI 专家:

我正在上开发自定义引导加载程序 TMS570LC4357 (定制板)。 目标是从引导加载程序(内部闪存@ 0x00000000)跳转到存储在中的多个应用程序 外部存储器 (EMIF MRAM) 0x60000000(应用 1)或其他偏移开始。

当前实施和问题:

目前、我已0x60000000通过修改引导加载程序sys_intvecs.asmsvcEntry将直接转发到应用程序vPortSWI处理程序 (FreeRTOS)、成功跳转到的单个应用程序。 这样可以正常工作、但它会在引导加载程序和特定应用程序地址之间建立很强的依赖关系。

我的要求是支持 多个应用程序 在 EMIF 中(例如,App A at、App B at)0x600000000x60100000。 因此、对引导加载程序矢量表中的跳转地址进行硬编码并不是一种可行的解决方案。

目标:

我需要一种方法、在跳转后使应用程序完全独立于引导加载程序的矢量表。 具体来说、我希望应用使用它HL_sys_intvecs.asm位于 EMIF 中的自己、以便中断(尤其是 FreeRTOS 的 SVC)直接由活动应用的矢量表处理。

问题:

  1. VBAR 重定向: 正在修改 VBAR(矢量基址寄存器) 在应用程序的启动代码 (_c_int00) 中、在 Cortex-R5 上实现此目的的建议方法是什么?

    • 我尝试使用_MCR内在函数写入 CP15 C12 (VBAR)、但遇到Undefined Instruction异常或系统挂起。 将 VBAR 指向 EMIF 时、我是否可能缺少特定的约束(例如 MPU 设置,特权模式)?

  2. 多个应用程序的最佳实践: TI 是否有引导加载程序的参考设计或示例、该引导加载程序支持跳转到外部存储器中的多个应用程序映像、其中每个应用程序都管理自己的中断矢量?

非常感谢有关将向量表切换到 EMIF 的正确序列的任何建议或代码片段。

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

    您好、

    专家是 OOO 直至 12 月 2 日。 请预计响应会延迟

    此致、
    Aswin

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

    尊敬的 Aswin:

    只是一个快速的跟进,以检查是否有任何进展,现在专家回到办公室.

    此致、

    底特律

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

    您好、底特律、

    对延迟的回复表示歉意!

    我们有一个内部 AI 工具、可以分析我们过去所有与此控制器相关的 e2e 主题以及此控制器的所有文档。 当我反馈你的要求,我得到了一些好的建议。 您能否对其进行一次验证?

    Arm Cortex-R4 和 Cortex-R5 内核不支持 VBAR(矢量基址寄存器)

    要点:

    • TMS570 Hercules 器件上的异常矢量表是 修复在地址 0x00000000 处
    • 与 Cortex-M3/M4(具有用于重定位的 vtable 寄存器)不同、Cortex-R4/R5 不提供基于硬件的矢量表重定位
    • CP15 R1 寄存器中的 VE(矢量使能)位可启用硬件矢量中断、但不会重定位矢量表

    推荐解决方案:使用 VIM(矢量中断管理器)+引导加载程序蹦床函数

    由于 VBAR 不可用、下面是支持多个应用的推荐方法:

    架构概述:

    Bootloader @ 0x00000000 (Internal Flash)
    ├── Exception Vectors @ 0x00-0x3C (Fixed)
    │   ├── Reset, Undefined, SVC, Prefetch Abort, Data Abort, IRQ, FIQ
    │   └── Each contains branch/load instruction to bootloader handlers
    ├── Bootloader Code
    └── Jump Logic to Select Application
    
    Application A @ 0x60000000 (EMIF MRAM)
    ├── Application Vector Table (not used by CPU directly)
    ├── Application Code
    └── VIM RAM Configuration
    
    Application B @ 0x60100000 (EMIF MRAM)
    ├── Application Vector Table
    ├── Application Code
    └── VIM RAM Configuration

    实施战略:

    引导加载程序异常矢量处理 (sys_intvecs.asm):

    请使用、而不是硬编码应用程序地址 间接跳过基于 RAM 的函数指针

    ; In bootloader sys_intvecs.asm @ 0x00000000
    _reset:     b   _c_int00_bootloader
    _undefined: ldr pc, [pc, #-0x1b0]  ; Load from RAM pointer
    _svc:       ldr pc, [pc, #-0x1b0]  ; Load from RAM pointer  
    _prefetch:  ldr pc, [pc, #-0x1b0]  ; Load from RAM pointer
    _abort:     ldr pc, [pc, #-0x1b0]  ; Load from RAM pointer
    _irq:       b   _irq_handler        ; Jump to VIM handler
    _fiq:       b   _fiq_handler        ; Jump to VIM handler

    2.使用 VIM RAM 进行外设中断:

    TMS570LC4357 具有一个 矢量中断管理器 (VIM) 和基于 RAM 的中断向量表一起创建的 0xFFF82000 (0)。 这是实现应用程序独立性的关键:

    • VIM RAM 存储 127 个中断通道的 ISR 地址
    • VIM 支持硬件矢量中断(自动向 ISR 派单)
    • 每个应用都可以使用自己的 ISR 地址初始化 VIM RAM

    3.应用程序跳转顺序:

    // In bootloader before jumping to application
    void jump_to_application(uint32_t app_base_addr) {
        // 1. Initialize EMIF for MRAM access
        emif_init();
        
        // 2. Copy application's VIM table to VIM RAM
        uint32_t *app_vim_table = (uint32_t *)(app_base_addr + VIM_TABLE_OFFSET);
        uint32_t *vim_ram = (uint32_t *)0xFFF82000;
        for(int i = 0; i < 128; i++) {
            vim_ram[i] = app_vim_table[i];
        }
        
        // 3. Set up exception handler pointers in RAM
        //    (for SVC, undefined, etc.)
        exception_handler_ptrs[SVC_INDEX] = app_base_addr + SVC_HANDLER_OFFSET;
        
        // 4. Initialize application stack pointer
        __asm(" mov sp, %0" : : "r"(app_stack_pointer));
        
        // 5. Jump to application entry point
        void (*app_entry)(void) = (void (*)(void))(app_base_addr + ENTRY_OFFSET);
        app_entry();
    }

    4. FreeRTOS SVC 处理程序:

    对于 FreeRTOS、SVC 异常至关重要。 以下是两种方法:

    选项 A:引导加载程序 SVC 蹦床函数

    ; In bootloader @ 0x08 (SVC vector)
    _svc:
        ldr pc, =svc_handler_ptr  ; Load application's SVC handler address
        
    ; In RAM
    svc_handler_ptr:  .word 0x60000000 + SVC_OFFSET  ; Set by bootloader before jump

    选项 B:直接 VIM 配置 配置应用以使用不同的中断进行上下文切换而不是 SVC(例如,通过 VIM 实现的软件中断)。

    问题 2:TI 参考设计

    我在外部 EMIF 存储器中找不到适用于 TMS570 多应用程序引导加载程序的特定 TI 参考设计。 不过、本文介绍了引导加载程序的一般原则:

    • 程序的概念 :应用程序可以从引导加载程序跳转到应用程序代码
    • EMIF 就地执行 : TMS570LC4357 支持从 EMIF 执行代码
    • 基于 VIM 的中断管理 :用于 Hercules 器件的标准方法

    其他注意事项:

    MPU 配置:

    • 为 EMIF 存储器配置 MPU 区域 (0x600000-0x6FFFFFFF)
    • 确保为 EMIF 区域启用了执行权限
    • 为外部内存设置适当的高速缓存策略

    EMIF 时序:

    • MRAM 访问时间比内部闪存慢
    • 适当地配置 EMIF 时序寄存器
    • 考虑启用指令缓存以提高性能

    安全注意事项:

    • 在跳转到应用程序之前实施 CRC/校验和验证
    • 对 VIM RAM 使用 ECC 保护
    • 验证应用程序标头/签名

    --
    此致、
    Jagadish。

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

    尊敬的 Jagadish:

    非常感谢您的详细解释!

    您对硬件限制(特别是此器件上的 Cortex-R4/R5 内核不支持 VBAR 寄存器)的澄清是解决我问题的关键。 这解释了为什么我写入 CP15 C12 的尝试一直触发未定义指令异常。

    现在、我已按照您的建议实现了基于 RAM 的蹦床函数方法、我很高兴地确认它运行良好。

    以下是我所实施的解决方案的简要总结、以造福未来的社区成员:

    1. 引导加载程序矢量表(在 0x00000000 )sys_intvecs.asm:我不跳转到固定地址,而是修改了矢量(SVC、UNDEF,预取,数据中止)0x08000000,通过存储在固定 RAM 区域中的指针(例如)间接跳转。 (注意:IRQ 和 FIQ 仍使用标准 VIM 派送机制)ldr pc, [pc, #-0x1b0]

    2. RAM 指针初始化:

      • 在 Bootloader: main 中、我将这些 RAM 指针初始化以指向引导加载程序自己的默认处理程序。

      • 在应用程序:在 main 中、应用程序使用其自身处理程序的地址(例如,用于 FreeRTOS SVC)覆盖这些 RAM 指针vPortSWI

    3. 结果:这允许引导加载程序跳转到存储在 EMIF 中的任何应用程序、并且活动的应用程序可以成功处理中断/异常、而无需依赖引导加载程序中的硬编码地址。

    再次感谢您为我指明正确的方向!

    此致、Detrodis