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.

[参考译文] RTOS/TM4C1294NCPDT:如何使用 MPU 调试内存问题

Guru**** 2455560 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/640732/rtos-tm4c1294ncpdt-how-to-use-mpu-to-debug-memory-issue

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

如果我怀疑我的应用程序中的某些代码修改了特定的 RAM 地址(或某个范围内的某个随机地址)、我可以使用 MPU 来调试这一点吗? 我的想法是:

  1. 放置一个无用的数组来覆盖地址范围。
  2. 为此区域设置 MPU。 我认为我可以使用"module ti.sysbios.family.arm.mpu"或 TivaC MPU 器件驱动程序。 问题是:当发生违规时、我是否知道触发违规的 PC? 默认情况下、在不启用 MPU 中断的情况下、将发生硬故障异常。
  3. 如何为 MPU 启用中断(driverlib 中的 MPUIntRegister 不能在 RTOS 工程中使用、并且"module ti.sysbios.family.arm.mpu"中没有处理中断的函数)? 我能否获得有关中断函数中错误的更多信息?

谢谢

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

    我认为 TI-RTOS 可能已经使用了 MPU。 我不知道 TI-RTOS 是否允许在操作系统上下文中进行单独的 MPU 管理。 在非操作系统环境中、您可以自行管理 MPU。 如果出现 MPU 故障、则会出现存储器管理异常、而不是中断。 您可以在故障状态寄存器中读取异常的原因、并在故障地址寄存器中读取违规地址。 请参阅数据表并查找 FAULTSTAT 和 MMADDR 寄存器。 另请参阅外设驱动程序库、了解如何使用 MPU API 函数来配置 MPU。

    BTW、放置一个无用的阵列来覆盖地址范围意味着什么。 我希望您不会真正声明地址范围的数组、对吧? 只需定义要保护的 MPU 区的基地址、以及该区的大小和保护属性即可。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Jianyi Bao">如果我怀疑我的应用程序中的某些代码修改了特定的 RAM 地址(或某个范围内的某个随机地址)、我是否可以使用 MPU 来调试这一点?使用 MPU 来捕获此类错误写入涉及更改代码。

    CCS 支持硬件观察点、可在写入特定 RAM 地址时停止目标。 请参阅 配置硬件观察点。 使用硬件观察点触发对特定 RAM 地址的写入、可能会在不修改程序的情况下捕获故障、调试器将显示执行写入的有问题的指令。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    我确实想分配一个无用的数组、因为我暂停了一些代码会意外地修改 RAM。 但 RAM 也在正常使用。 请访问 e2e.ti.com/.../636949
    因此,我无法用一个词来保护我的案例中的 BIOS_Module->threadType。 我必须在这个地址附近分配一个数组(当然、BIOS_Module 将被移动到其他位置)、并在这个数组上应用 MPU。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、 切斯特  

     为什么我无法在 CCS 中设置这样一个高级断点? 我的断点只能如下所示:

    我目前没有挂接我的目标。 我想知道,一旦附加对话,对话是否会有所不同。

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

    [引述用户="Jianyi Bao)]我目前没有附上我的目标。 我想知道、一旦附加对话框、对话框是否会不同。是的、在设置高级断点之前、确实需要附加目标。

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

    大家好、 切斯特  

     如何设置读取/写入掩码? 谢谢

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

    您好、Charles、

      我在这个芯片中使用 MPU 有困难。

    1。 在我的 RTOS 版本中找不到。 因此、我无法将 BIOS API 用于 MPU。
    然后我必须使用 driverlib。 但我发现"MPU_RGN_SIZE_32B"等定义在 driverlib/MPU.h 中不正确 根据数据表、SIZE 位应为 log2 (以字节为单位的大小)- 1。
    3.我使用以下代码来初始化 MPU (注意到目前为止只配置了一个区域)、并且在 BIOS_start 之前在 main 中调用 MpuInit。 但在 MPUEnable (MPU_CONFIG_NONE)之后、将发生异常。 请参阅下面的快照以查看有关异常的详细信息。

    #if 1
    
    
    #define NORMAL MPU_NUM 4
    #define NORMAL MPU_SIZE 2048
    #define NORMAL MPU_ADDR_BASE 0x30000
    #define RAM_TOTAL_BASE 0x20000000
    #define RAM_TOTAL_SIZE 0x40000
    #define NORMAL MPU_ADDR_STEP (((RAM_TOTAL_SIZE - NORMAL MPU_ADDR_BASE)#define MPU_ADDR_BASE)
    
    #define MPU_AMU_AMU_AMU_BASE) (RAM_TOTAL_BASE + NORMAL MPU_ADDR_BASE +(n)* NORMAL MPU_ADDR_STEP)
    
    #define MPU_ADDR_0 NORMAL MPU_ADDR (0)
    #define MPU_LEN_0 NORMAL MPU_ADDR_SIZE
    #define MPU_RAYU_MPU_0
    
    
    
    
    
    
    
    
    
    (1)#define MPU_RAYM300_AMU_AMU_RAY0
    (1)#define MPU_AMU_MPU_RAYR 2 (#define MPU_AMU_MPU_RAY0 (#define MPU_AMU_MPU_IN_AMR 2)#define MPU_RAYMPU_MPU_AMR 2 (#define MPU_MPU_AMU_MPU_RAY0)#define MPU_MPU_MPU_MPU_RAYMPU_RAYMPU_AMR (#define MPU_MPU_0 (#define MPU_MPU_RAYMPU_MPU_RAY0)#define MPU_MPU_MPU_RAYMPU_MPU_
    
    
    
    
    
    
    
    
    
    #include 
    
    typedef 结构
    体{
    uint addr;
    uint len;
    }MpudAddrLenT;
    
    静态 uint SingleBitLog2 (uint v)
    {
    uint count = 0;
    
    while (v)
    {
    if (v & 0x01)
    {
    返回计数;
    }
    
    count++;
    
    v >=1;
    }
    
    返回0;
    }
    
    静态 const MpuAddrLenT MpuAddrAndLen[]=
    {
    {MPU_ADDR_0、MPU_LEN_0}、
    //{MPU_ADDR_1、MPU_LEN_1}、
    //{MPU_ADDR_2、 MPU_LEN_2}、
    //{MPU_ADDR_3、MPU_LEN_3}、
    };
    
    静态空 MpuInit (void)
    {
    #if 0
    #else
    
    uint I;
    
    对于(i = 0;i < array_elements (MpuAddrAndLen);i++)
    {
    const uint addr = MpAddrAndLen[i]。addr;
    const uint len = MpudAndlen[i]。len;
    
    assert (0 =(addr % len));
    
    const uint sizeBits =(SingleBitLog2 (len)- 1)<<1;
    
    const uint flags = sizeBits
    | MPU_RGN_Perm_noexec
    | MPU_RGN_Perm_PRV_NO_USR_NO
    | MPU_RGN_ENABLE
    ;
    
    MPURegionSet (I、addr、flags);
    }
    
    //MPUEnable (MPU_CONFIG_HARDFLT_NMI);
    MPUEnable (MPU_CONFIG_NONE);
    #endif
    }
    
    #endif 

    还附加了.map。

    它看起来该错误与我所在的地区无关。 但我不知道是什么问题。

    e2e.ti.com/.../0027.map.zip

    非常感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Jianyi、
    我正在咨询 TI-RTOS 专家、以便在 TI-RTOS 上下文中对您的 MPU 问题发表评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Jianyi Bao"] 如何设置读/写掩码? 谢谢我认为  、包含"配置掩码值(将被忽略的位)"文本的 Stellaris / Tiva 器件 processors.wiki.ti.com/.../Watchpoints_for_Stellaris_in_CCS wiki 页面已被无意中从 C28x 器件的 processors.wiki.ti.com/.../Hardware_Breakpoints_and_Watchpoints_for_C28x_in_CCS wiki 页面复制。

    比较这两个 wiki 页面上观察点属性对话框的屏幕快照会显示:

    a) C28x 器件观察点有一个位置掩码选项。

    b) Stellaris / Tiva 器件观察点没有位置掩码选项。

    希望 TI 的某个人能够对此进行澄清。