主题中讨论的其他器件: HALCOGEN
您好!
我们在 TMS570LC4357上运行的软件有时会出现预取/数据中止异常、分支到 HL_SYS_intvecs.asm 处的中断矢量。 但由于权限错误、它不会分支到函数_prefetch 或_dabort 函数。
resetEntry b _c_int00 b _undef b vPortSWI b 预取(_P) b _dabort b 相位中断 LDR PC、[PC、#-0x1b0] LDR PC、[PC、#-0x1b0]
经过一些调试后、我们认为这是由 MPU 配置问题引起的、因为 MPU 区基地址寄存器= 0x00000000总是会发生此问题、而 MPU 区大小和使能寄存 器以及 MPU 区访问控制寄存器是其他任务的动态 MPU 配置值。
根据 TI 的 MPU 配置应用报告、应先禁用 MPU 区域、然后再更改配置、但在 HALCoGen 生成的 FreeRTOS 代码中找不到任何禁用可配置 MPU 区域的代码。
因此、我们在函数 portSAVE_Context 中添加了以下片段、以便在 portRESTORE_Context 更改 MPU 配置之前禁用可配置的 MPU 区域。 然后我们对其进行了测试、软件在没有预取/数据中止的情况下运行了一天。
;禁用所有可配置的 MPU 区 mov r0、#12 mcr P15、#0、r0、C6、C2、 0 ;选择区域 mov r0、#0 mcr P15、#0、r0、C6、C1、 2 ;禁用 MPU mov r0,#13 mcr P15、#0、r0、C6、C2、 0 ;选择区域 mov r0、#0 mcr P15、#0、r0、C6、C1、 2 ;禁用 MPU mov r0,#14 mcr P15、#0、r0、C6、C2、 0 ;选择区域 mov r0、#0 mcr P15、#0、r0、C6、C1、 2 ;禁用 MPU mov r0,#15 mcr P15、#0、r0、C6、C2、 0 ;选择区域 mov r0、#0 mcr P15、#0、r0、C6、C1、 2 ;禁用 MPU
因此,我们要问:
- 这是 HALCoGen 中的问题还是我们错误配置了 HALCoGen?
- 添加的代码片段是否足以涵盖上下文切换期间动态 MPU 配置的边缘情况?
- 是否有更好的方法来解决该问题?
我们使用了 HALCoGen 版本=04.07.01、项目器件=TMS570LC4357ZWT_FreeRTOS。 MPU 的 HALCoGen 配置如下所示:
谢谢
贾志。