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.

[参考译文] RM48L952:从 FreeRTOS 任务内调用 pvPortMalloc()时的预取中止

Guru**** 2466550 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/667319/rm48l952-prefetch-abort-when-calling-pvportmalloc-from-within-a-freertos-task

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

您好!

我有一个 Hercules RM48 HDK 开发板。  我为它创建了 HALCoGen FreeRTOS 项目。  我没有更改任何 HALCoGen 默认设置。  然后、我添加了用于创建1个任务的代码、后跟用于启用调度程序(vTaskStartScheduler)的代码。  任务代码只是实现一个每秒切换 LED 的 while (1)循环。  此代码正常工作、LED 以预期的速率闪烁。   

然后、在任务代码中、我在进入 while (1)循环之前添加了对 pvPortMalloc (20字节)的调用。  当代码运行时、它会中止并出现预取错误。  一旦我使用调试器进入 pvPortMalloc(),就会发生预取。

请注意,从启动代码调用 pvPortmalloc()时(在任务之外,调用 xTaskCreate 之前),调用会成功。

有人能不能对此有所了解?  我为 inspection.e2e.ti.com/.../4380.halcogen_5F00_48L952.zip 压缩了整个 CCS 项目、包括我的更改(请参阅 apptest.c)

谢谢、

Keith

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

    您好、Keith、

    当发生预取中止时、CPU 会将预取指令标记为无效、并且所有的 p-aborts 都是精确的中止。 请检查链接寄存器(r14_pabt)中的值以确定哪个指令生成了中止。

    您还可以使用 CP15_Instruction _Fault_address 寄存器(CCS->Registers ->CP15)来确定哪个指令导致了中止:

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

    QJ、

    预取中止显示:

    R14_PABT = 0x4EA0

    CP15 INST 故障状态= 0xD

    CP15 AUX INST 故障状态= 0x00400000

    CP15 INST 故障地址= 0x4E9C。  这是 pvPortMalloc()的地址,一个有效的地址。

    在调试器中,我为 vTestTask()设置了一个 BP。  然后我 ASM 进入 pvPortMalloc。  它会立即生成中止。  

    是否可以尝试使用我提供的 zip 文件进行复制?  我完全卡在这一点上。

    请注意、我的 os_portmacro.h 定义了 portUSING_MPU_wrappers = 1、并且 xTaskCreate 正在调用 MPU_xTaskCreate。  xTaskCreate 能够成功调用 pvPortmalloc。  

    我还注意到、在我的启动代码(apptest.c)中、当我的任务被创建时、在调用 prvRaisePrivileged Privilege 之前、在 MPU_xTaskCreate 中、xRunning= 15。  IE、swiraisePrivilege 显示调用 xTaskCreate 之前调用方未处于用户模式。  我认为这是预期的吗?

    谢谢、

    Keith

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

    pvPortMalloc():
    00004e9c:E92D4000 stmdb SP!、{LR}
    00004ea0:E24DD014 子部分 SP、sp、#0x14
    00004ea4:E58D0000 结构 R0、[sp]
    149. void *pvReturn=NULL;
    00004ea8:E3A0C000 MOV R12、#0
    00004eac:E58DC010 结构 R12、[sp、#0x10

    就在进入 pvPortMalloc 之前、SP = 0x08001218、这是一个有效的堆栈地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    QJ、
    另一个数据点:当我在 Supervisor 模式下创建任务(任务优先级= 0..15| portPRIVILEGE_BIT)时、pvPortMalloc 代码在任务内运行正常、并且任务可以 malloc 内存正常。 这提出了一个新问题:如果用户模式任务不能调用 pvPortMalloc,应该使用什么内存分配例程? 我还尝试调用了 malloc(),它在 rtsv7R4_T_le_v3D16_eabi.lib 中定义,但该函数会导致数据中止,不会返回。

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

    您好、Keith、

    故障状态为0x0D、这意味着它是权限故障:

    在用户模式下、任务的存储器区域(xMemory Region)不能被访问。