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.

[参考译文] TMS470MF03107:编译后程序所需的 RAM 空间为0x5178字节、大于单个 RAM 区域的大小0x08000000-0x08003FFF。 根据当前的存储器空间资源、如何处理它以满足存储器要求

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to

器件型号:TMS470MF03107

工具与软件:

您好、尊敬的 TI 工程师朋友们:

以下是我遇到的问题的说明:

我们的系统程序是基于 TMS470MF03107开发的。 集成此系统程序后、RAM 所需的总 RAM 空间为0x5178字节。 实际的芯片存储器资源如下图所示:

当前 sys_link.cmd 文件如下所示:

/*------------------ */
/* sys_link.cmd */
/**/
/*(c)德州仪器(TI) 2011、保留所有权利。 */
/**/

/*用户代码 begin (0)*/

/*用户代码结束*/


/*------------------ */
/*链接器设置*/

-l rtsv7M3_T_be_eabi.lib

--retain="*(.intvecs)"
--retain="*(.vim_table )"

/*用户代码结束*/

/*------------------ */
/*内存映射*/

小程序

VECTORS (X):origin=0x00004000 length=0x00000040
VIM_TABLE (X):origin=0x00004040 length=0x000000C0
//FLASH0 (RX):origin=0x00004100 length=0x0003BF00 //20130516
FLASH0 (RX): origin=0x00004200 length=0x0003BDFF //0x0003BE00//20140318
//FLASH1 (RX):origin=0x00080000 length=0x00007FFF
FLASH1 (RX): origin=0x00080000 length=0x0000BFFF //length=0x00007FFF
堆栈(RW):origin=0x08000000 length=0x00000A00 //800
RAM(RW): origin=0x08000A00 length=0x00005800// length=0x00003600//length=0x00005800//800-5800//20200409


/*用户代码 begin (1)*/
/*用户代码结束*/
}

/*用户代码 begin (2)*/
/*用户代码结束*/


/*------------------ */
/*段配置*/

//--------------- kwp.obj (.text)// ebd.obj (.text)--//-----

部分中)

.intvecs :{}>向量
.vim_table :{}>vim_table
.mysec:{
ebd.obj (.text)
can.obj (.text)
//dirver.obj (.text)
pi.obj (.text)
GT .obj (.text)
sci.obj (.text)
// kwp.obj (.text)
Gio.obj (.text)
spi.obj (.text)
VSO.obj (.text)
M301CAN.OBJ (.text)
diag.obj (.text)
alldriver.obj (.text)
}> FLASH1
.text :{}> FLASH0


.const :{}> FLASH0 | FLASH1.
.cinit :{}> FLASH0 | FLASH1.
.pinit :{}> FLASH0 | FLASH1.
.bss :{}>RAM.
.data :{}>RAM.
.sysmem :{}> RAM.

.stack:

. += 0x00000500;Stack_Table_Pointer =.;//400//20200409
. += 0x00000500;Stack_Handler_Pointer =.;//400//20200409
}>堆栈

}

/*用户代码 begin (3)*/
/*用户代码结束*/
//}

/*用户代码 begin (4)*/
/*用户代码结束*/


/*------------------ */
/*其他*/

/*用户代码 begin (5)*/
/*用户代码结束*/

/*------------------ */

问题 如下:

 

1) 1)可以看到 RAM 0x5800的长度超过了当前代码 Settings (设置)中单 RAM 长度0x3FFF、是否合理? 如果没有、如何在内存中对其进行配置?

 2) 2)系统程序分为两部分、一部分占用9000字节的 RAM (0x2328)、另一部分占用11856字节(0x2E50)。 考虑到程序需要产生一部分 RAM 占用来进行动态数据处理、结合上述芯片自己的 RAM 资源、如何解决静态存储器分配的问题? 以及如何保持动态运行程序稳定? 以下是系统程序部分动态操作的资源占用情况、请参阅:当车速数据输入超过100kph 时、将使用相应的缓冲区来存储时间戳数据、一个100ms 缓冲区和三个20ms 缓冲区、总共992个字节;

3)使用 RAM 存储器段0x08080000-0x08083FFF 来扩展 RAM 存储空间、主代码段如下:

...

RAM0    (RW): origin=0x08000A00 length=0x00003600//length=0x00005800 //800--5800//20200409

RAM1   (RW):origin=0x08080000 length=0x00003FFF

...

.bss :{

        *(.bss*)

        *(.bss_ram1)

        . = ALIGN (4);

    }> RAM0 | RAM1

 

    .data :{

        *(.data*)

        *(.data_ram1)

        . = ALIGN (4);

    }> RAM0 | RAM1

 

    .sysmem :{

        *(.sysmem*)

        . = ALIGN (4);

    }> RAM0 | RAM1

 

    .bss :{

        *(.bss*)

        iTPMS_G101_NEW_1101.lib (.bss)

        . = ALIGN (4);

    }> RAM1

 

    .data :{

        *(.data*)

        iTPMS_G101_NEW_1101.lib (.data)

        . = ALIGN (4);

    }> RAM1

 

    .sysmem :{

        *(.sysmem*)

        iTPMS_G101_NEW_1101.lib (.sysmem)

        . = ALIGN (4);

    }> RAM1

...

它编译时不会出现错误、但程序运行不正确(系统的某些部分无法正常工作)。 那么我在芯片手册中看到了这个细节:

4) 这是否意味着 RAM-CLR Space 和 RAM-SET Space 不能用作程序运行的常规随机存储区域? 两个区域 RAM-CLR Space 和 RAM-SET Space 的用途是什么? 根据该系统程序的资源要求、如何应用此芯片的 RAM 发行版 TMS470MF03107?

 5) 目前、编译后静态占用的 RAM 空间为0x5180、linkCMD 文件的配置大小为0x5800、超出了芯片手册中所指定的0x3FFF。 为什么仍有 CAN 消息?  从理论上讲、它不应该是内存不足吗? 如何直观地确定程序是否溢出? 我已经使用了 Sentinel 值、但它们不能很好地工作。

 

因为它是紧急的,我希望从您或贵公司的相关人员得到准确的回答,谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    1)您可以看到当前代码设置中 RAM 0x5800的长度超过单 RAM 长度0x3FFF、是否合理? 如果没有、如何在内存中配置它?[/QUOT]

    您好!

     程序所需的 RAM 空间大于 MCU 上的物理可用空间。 唯一可以做的就是减少 RAM 的使用。  

     1)[报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to "] 2)系统程序分为两部分、一部分占用9000字节的 RAM (0x2328)、另一部分占用11856字节(0x2E50)。 考虑到程序需要结合上述芯片自身的 RAM 资源来产生部分 RAM 占用以进行动态数据处理、[/QUOT]

    重申一下、9000+11856=20856字节。 这多于芯片上可用的16kB RAM。 还有一个堆栈需要驻留在 RAM 上。  这些都是必须保存在 RAM 上的动态数据吗? 我不知道您的应用、但您必须找到一种减少 RAM 使用量的方法。  除了减少 RAM 使用量、我几乎无能为力。

    [报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to "]

    3)使用 RAM 存储器段0x08080000-0x08083FFF 来扩展 RAM 存储空间、主代码段如下:

    ...

    RAM0    (RW): origin=0x08000A00 length=0x00003600//length=0x00005800 //800--5800//20200409

    RAM1   (RW):origin=0x08080000 length=0x00003FFF

    [报价]

    不、您不能这样做。  0x08080000-0x08083FFF 是一个用于 RAM 的别名地址范围、它作为一个"设置"空间。 当您写入此空间时、它只会从0变为1。 无论值是1、都不能更改为0。 这是一个别名空间、可减轻程序执行读取-修改-写入操作以节省周期的情况。 此空间类似于寄存器、在这些寄存器中、您可以写入1来在"设置"别名上设置一个位、写入1来清除"清除"别名地址上的一个位。 如  

    Unknown 说:
    4) 这是否意味着 RAM-CLR Space 和 RAM-Set Space 不能用作程序运行的常规随机存储区域? 两个区域 RAM-CLR Space 和 RAM-SET Space 的用途是什么? 根据该系统程序的资源要求、如何应用此芯片的 RAM 发行版 TMS470MF03107?[/QUOT]

    参见上述说明。  

     5) 目前、编译后静态占用的 RAM 空间为0x5180、linkCMD 文件的配置大小为0x5800、超出了芯片手册中所指定的0x3FFF~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to。 为什么仍有 CAN 消息?  从理论上讲、它不应该是内存不足吗? 如何直观地确定程序是否溢出? 我已经使用了 Sentinel 值、但它们不能很好地工作。

    什么是  iTPMS_G101_NEW_1101.lib? 为什么它映射到 RAM、而不是闪存?  

    您可以查看映射文件以了解每个符号/函数在存储器中的分配位置;

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

    谢谢你的早回复!  也许我需要进一步的帮助。

     2) 2)系统程序分为两部分、一部分占用9000字节的 RAM (0x2328)、另一部分占用11856字节(0x2E50)。 考虑到该程序需要结合上述芯片自身的 RAM 资源来生成部分 RAM 占用以进行动态数据处理、

    蔡少芬 说:

    重申一下、9000+11856=20856字节。 这多于芯片上可用的16kB RAM。 还有一个堆栈需要驻留在 RAM 上。  这些都是必须保存在 RAM 上的动态数据吗? 我不知道您的应用、但您必须找到一种减少 RAM 使用量的方法。  除了减少 RAM 使用量、我几乎无能为力。

    Chenyuefeng 说:

    编译出程序后(对于 ABS 应用程序与 TPMS 功能)、内存分配如下,我认为是 静态内存占用 . 您可以在 parent "RAM" is .bss and .data 下看到子项、在此期间、动态 RAM 占用尚未包括在内。 在静态分配的基础上添加动态 RAM 后、 实时 RAM 占用比下图所显示的 RAM 多得多。 我的正确理解是编译后、程序运行后对 RAM 占用的理解、即静态和动态 RAM 占用?

    或者您是说程序运行所用的总 RAM 存储器仅是0x08000000-0x08003FFF 之间的空间?

    Chenyuefeng 说:

    3)使用 RAM 存储器段0x08080000-0x08083FFF 来扩展 RAM 存储空间、主代码段如下:

    ...

    RAM0    (RW): origin=0x08000A00 length=0x00003600//length=0x00005800 //800--5800//20200409

    RAM1   (RW):origin=0x08080000 length=0x00003FFF

    不、您不能这样做。  0x08080000-0x08083FFF 是一个用于 RAM 的别名地址范围、它作为一个"设置"空间。 当您写入此空间时、它只会从0变为1。 无论值是1、都不能更改为0。 这是一个别名空间、可减轻程序执行读取-修改-写入操作以节省周期的情况。 此空间类似于寄存器、在这些寄存器中、您可以写入1来在"设置"别名上设置一个位、写入1来清除"清除"别名地址上的一个位。 如  

    Chenyuefeng 说:

    很抱歉、我在"as"后面没有看到您的回答内容。 您的回答还有其他问题吗?

     

    Chenyuefeng 说:

     5) 目前、编译后静态占用的 RAM 空间为0x5180、linkCMD 文件的配置大小为0x5800、超出了芯片手册中所指定的0x3FFF。 为什么仍有 CAN 消息?  从理论上讲、它不应该是内存不足吗? 如何直观地确定程序是否溢出? 我已经使用了 Sentinel 值、但它们不能很好地工作。

    什么是  iTPMS_G101_NEW_1101.lib? 为什么它映射到 RAM、而不是闪存?  

     您可以查看映射文件以了解每个符号/函数在存储器中的分配位置;

    Chenyuefeng 说:

    "iTPMS_G101_NEW_1101.lib"是一个.lib 文件、其中包含一些用于我们的带有 TPMS 应用的 ABS 中的函数 API。

    它不仅 映射到闪存、还映射到 RAM、您可以在上面看到:

    另外、根据上面的存储器分配方法、无论在 linkCMD (22528字节)中为 RAM 定义的总空间还是 RAM 的实际占用空间(20853字节)、 这两个都大于总空间0x3FFF (从0x08000000到0x08003FFF 的地址)、芯片都能提供、、这表明 RAM 在程序运行前已超出范围。 这意味着、一旦程序运行开始、就 需要额外的 RAM 空间?  

    但是用于程序占用的 RAM 空间不超过0x3FFF。 那么、您能告诉我芯片的工作原理、为什么程序在没有任何其他可用 RAM 空间的情况下仍然可以运行、同时 程序运行前已经溢出了 RAM 占用?   

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

    此处表明、您对堆栈使用了2560个字节、对.bss 和.data 使用了20853个字节。 您的.bss 为19448字节。 此.bss 段用于 已声明但尚未分配值的静态分配变量。 据我所知、这不是动态分配。 动态内存分配是使用时的堆内存  malloc(). 

    您是否真的需要在 RAM 中保留19448字节的空间? 这正是您的应用、只有您能够判断是否确实需要它。 您似乎要创建一个全局变量、如下所示。  

    uint8_t My_Array [19448];

    通常、如果转到 CCS 工作区中的 Debug 目录、则会找到.map 文件和.out 文件。 您可以读取.map 文件、其中提供了有关如何分配符号的更多信息。  

    [报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to/5515128 #5515128"]

    很抱歉、我在"as"后面没有看到您的回答内容。 您的回答还有其他问题吗?

    [报价]

    这之后什么也没有。 我错了。  

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

    感谢您对.bss 的解释!   我认为附带 linkcmd 文件的"内存分配"窗口显示与您提到的.map 文件类似。对吧?

    1 μ、A 请您进一步解释我在上一次答复中提出的其他问题吗? 例如,由于内存分配中存在一些问题,为什么程序会在点火时运行,一旦输入轮速为4通道, CAN 消息就会停止,这意味着程序停止运行或芯片停止工作,以实现自我保护?   (我用森特尼尔检验了它。 堆栈未溢出(因为 sentinelvalue 在开始和结束 addr 时没有改变)、但 RAM 的 起始和 结束地址 Sentinel 值已改变)

    2、您提到 .bss 在 RAM 中有19448字节的空格。  我想说,这是基于当前程序编译的结果,链接命令设置如下,在 RAM 重新分配到 RAM0和 RAM1之前提到:

    ...

    .bss :{}>RAM.

    ...

    这一行代码的设置有什么问题吗? 对于.bss 和.data 有多少 RAM 空间的灵活设置、有任何优化建议吗?

    程序的存储器分配方面可能存在一些缺点。 由于我们缺乏这方面的经验、您是否有一些详细的建议?

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1、 请您进一步解释我在上一次答复中提出的其他问题吗? 例如,由于内存分配中存在一些问题,为什么程序会在点火时运行,一旦输入轮速为4通道, CAN 消息就会停止,这意味着程序停止运行或芯片停止工作,以实现自我保护?   (我用森特尼尔检验了它。 堆栈未溢出(因为 sentinelvalue 在开始和结束 addr 时未更改)、但 RAM 的 起始和 结束地址 Sentinel 值已更改)[/QUOT]

    我不清楚您的问题。 您是否说您可以加载程序、该程序将在开始时正常运行、之后将崩溃? 硬件不知道您是如何构建项目的。 如果程序适用于闪存、则它将在最初运行。 之后、当程序尝试访问超出 RAM 物理范围的变量时、则没有此类地址、程序很可能只是崩溃。  

    [报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to/5517350 #5517350"]

    2、您提到 .bss 在 RAM 中有19448字节的空格。  我想说,这是基于当前程序编译的结果,链接命令设置如下,在 RAM 重新分配到 RAM0和 RAM1之前提到:

    ...

    .bss :{}>RAM.

    [报价]

    正如我提到过的、RAM0和 RAM1只是用于设置和清除的别名地址。 片上 RAM 的物理尺寸只有16kB。 如果您超过此限值、则不会匹配。 您可以在链接器文件中声明等于100MB 或任何所需值的 RAM。 您只是促使链接器认为有很多 RAM、它会顺利构建。 但是、一旦您运行程序、物理 RAM 仅为16kB、程序将立即崩溃。  

    [报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to/5517350 #5517350"]

    这一行代码的设置有什么问题吗? 对于.bss 和.data 有多少 RAM 空间的灵活设置、有任何优化建议吗?

    程序的存储器分配方面可能存在一些缺点。 由于我们缺乏这方面的经验、您是否有一些详细的建议?

    [报价]

    我真的没有其他东西可以提供给你看你的程序,并确定如何减少 RAM 的使用。 您的代码的哪个部分保留了很大的 RAM 区域? 您可以展示吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复!
    1 μ、A 请您进一步解释我在上一次答复中提出的其他问题吗?  例如,由于内存分配中存在一些问题,为什么程序会在点火时运行,一旦输入轮速为4通道, CAN 消息就会停止,这意味着程序停止运行或芯片停止工作,以实现自我保护?   (我用森特尼尔检验了它。 堆栈未溢出(因为 sentinelvalue 在开始和结束 addr 时没有改变)、但 RAM 的 起始和 结束地址 Sentinel 值已改变)

    我不清楚您的问题。 您是否说您可以加载程序、该程序将在开始时正常运行、之后将崩溃? 硬件不知道您是如何构建项目的。 如果程序适用于闪存、则它将在最初运行。 之后、当程序尝试访问超出 RAM 物理范围的变量时、则没有此类地址、程序很可能只是崩溃。  

    chenyuefeng:

    是的、我可以加载 程序、程序开始时运行良好 、没有其他输入信号(此处为4轮速)。 但是、一旦输入车轮转速信号(速度值高达100kph 或更高)、ECU 就会停止处理 CAN 消息、停止传输。 只有在点火开关关闭然后打开的同时停止车轮转速信号输入后、CAN 消息才能恢复。 一旦点火和程序开始再次运行、如果车轮转速再次达到约100公里/小时或以上、则问题再次出现(意味着程序崩溃、如您所说)。

    3、那么此代码行的设置有什么问题吗? 对于.bss 和.data 有多少 RAM 空间的灵活设置、有任何优化建议吗?

    程序的存储器分配方面可能存在一些缺点。 由于我们缺乏这方面的经验、您是否有一些详细的建议?

    蔡嘉玲:

    我真的没有其他东西可以提供给你看你的程序,并确定如何减少 RAM 的使用。 您的代码的哪个部分保留了很大的 RAM 区域? 您可以展示吗?

    这是的.map 文件主要内容 MEMORY CONFIGURATION、段分配映射、RAM  部分分配映射、您可能会看到代码的哪个部分保留了很大的 RAM 区域

    在上面可以看到、 大部分.data 区域已超出范围。  

    下面还有其他问题:

    4、B UT 如前所述、为什么在点火开关打开后程序会开始运行、但当车轮转速达到100公里/小时左右(基本上是车轮脉冲)输入到 ECU 时、CAN 消息会在 ECU 停止工作的同时停止传输?  

     5、由于.data 的 RAM 超出 RAM 物理范围、为什么 ECU 最初还能工作?   ECU 不应该初始启动失败吗? 原理是什么?

    6、我知道。当前程序 可能很难减少 RAM 的使用,如果可能从您的经验,有任何其他方法减少 RAM 的使用?

    7、总之,  根据当前的存储器分配方法、目标硬件资源要求、实际硬件 RAM 资源(16K 字节)的组合,您对我们的程序集成优化有什么建议吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to/5527800 #5527800"]

    4、B UT 如前所述、为什么在点火开关打开后程序会开始运行、但当车轮转速达到100公里/小时左右(基本上是车轮脉冲)输入到 ECU 时、CAN 消息会在 ECU 停止工作的同时停止传输?  

     5、由于.data 的 RAM 超出 RAM 物理范围、为什么 ECU 最初还能工作?   ECU 不应该初始启动失败吗? 原理是什么?

    6、我知道。当前程序 可能很难减少 RAM 的使用,如果可能从您的经验,有任何其他方法减少 RAM 的使用?

    7、总之,  根据当前的存储器分配方法、目标硬件资源要求、实际硬件 RAM 资源(16K 字节)的组合,您对我们的程序集成优化有什么建议吗?

    [报价]

    您好!

     正如我已经解释过的、代码可能会在程序加载后开始运行、因为它尚未使用某些超出范围的变量。 在运行时、当程序尝试访问超出范围的位置时、它可能是在获取镜像/绕回地址、甚至陷入故障异常中。 例如、运行时期间的程序尝试访问16k+0x100处的位置。 程序可能基于此位置上的数据跳转到程序的不同区域、或根据程序意图执行任何操作。 由于16k+0x100处没有物理存储器、因此返回的值可能是无用的数据、也可能是位置0x100处的数据(这是一个环绕地址)。 解码器可能忽略大于16kB 的高地址位。 地址解码器也有可能生成一个总线故障、这是因为它是一个无效的地址。 您需要检查程序何时崩溃、CPU 程序计数器在哪里。 程序计数器将让您了解 CPU 会发生什么情况。 您也可以查看连接寄存器来回溯导致异常的代码。

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

    再次感谢、先生!

    " CPU 程序计数器"和"链接寄存器"是什么意思

    您是否会通过数据表、用户手册或其他方式介绍这些内容?

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

    您好!

     每个 CPU 都有一个 PC (程序计数器)和 LR (链接寄存器)。 您可以在注册浏览器中找到它们。

    如果您发现代码由于故障异常而崩溃、还请参阅该应用手册来诊断故障。 本应用手册是为其他 MCU 编写的。 但是、它们使用非常相似的 CPU 架构。 这两个模块都基于 Cortex-M3/M4F。  

    StellarisRegistered微控制器软件故障诊断

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

    您好、

       我已经尝试了您关于在程序崩溃时获取 LR 和 PC 值的建议、如下图所示。 您能解释一下所显示值的含义吗?

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

    您好!

     正如预期的那样、地址解码器会产生总线错误。 这就是为什么您被困在_ISR () Bus_Fault 中的原因。 屏幕截图上的 SP 寄存器显示0x7FFFFFFA8。 这是非法地址。 正如我多次提到的、您的程序正在尝试访问物理上不可用的 RAM。 您还可以参考 Cortex-M3 TRM 并查找总线故障地址寄存器、故障状态寄存器以及各种其他故障相关寄存器。 这些寄存器将提供导致故障异常的地址信息。 正如我上次提供的、本应用手册也很有帮助。  StellarisRegistered微控制器软件故障诊断最终、您需要确保使用的 RAM 不会超过实际解决问题所需的 RAM。  

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

    抱歉、先生、我在文档"TMS470M 系列 技术参考手册(TRM)"和文档中的"总线故障地址寄存器"及其地址"0xEEE0ED38" 中找不到、位于您共享的下载链接下 我也找不到第8-32页 您在发布的屏幕截图中提到的。 下面是您在 Stellaris 微控制器和  Cortex -M3修订版 r2p0 技术参考手册中分享的软件故障诊断文档的屏幕截图:

    您可以展示吗?

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

    您好!

    [报价 userid="584244" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1437601/tms470mf03107-the-ram-space-required-by-the-program-after-compilation-is-0x5178-bytes-which-is-larger-than-the-size-of-a-single-ram-area-0x08000000-0x08003fff-based-on-the-current-memory-space-resources-how-to-deal-with-it-to/5531954 #5531954"]抱歉、先生、我在文档"TMS470M 系列 技术参考手册(TRM)"和文档中找不到"总线故障地址寄存器"及其地址"0xEEE0ED38"。  

     TMS470M TRM 未涵盖 Arm Cortex-M3内核的细节。 Arm 提供了 Arm Cortex-M3 TRM、我曾将链接称为。 我使用较旧版本的 Arm Cortex-M3 TRM、而 Arm 网站上有最新版本。 不清楚为什么最新的 Arm Cortex-M3 TRM 没有总线故障地址寄存器的详细信息。 不过、有关详细信息、 请参阅 ARMv7-M 架构参考手册。  

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

    你(们)好  

    我已经尝试检测到寄存器 总线故障地址寄存器

    那么、这个问题是否表明故障能够识别地址? 但我  在调试窗口中看不到 BFSR 寄存器、您可以显示吗?

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

    您好!

     看看 CFSR (可配置故障状态寄存器)、它由三个子寄存器组成、即 MMFSR、BFSR 和 UFSR。 请参阅  我上次发送的 ARMv7-M 架构参考手册、也可 参阅下文。 BFSR 驻留在 CFSR 寄存器的第15:8位。  

    您可以检查故障是精确的还是不精确的。 如果故障的不精确、那么你不能依赖总线故障地址寄存器的值。 模糊故障通常由写入操作引起。 通常、地址解码逻辑电路具有一个写入缓冲器以改进 CPU 性能。 利用写入缓冲区、CPU 不必等到写入操作完成再执行下一条指令。 换句话说、CPU 可以在写入操作并行进行的同时执行几条指令。 然而、如果存在由写入操作导致的故障(例如、写入一个非法地址)、故障就变得不准确并且 CPU 不记得哪个指令导致了写入故障、因为它已经进入了新指令的指令流水线。  

    正如我前面提到的、我强烈建议您先解决程序映像问题、因为它需要的 RAM 比可用的 RAM 多。 如果你可以解决这个问题,那么我希望你现在有什么巴士故障问题,或道路上的其他问题将自行解决。 针对当前问题、我还建议您增加堆栈大小。 我在屏幕截图中看到、SP 位于0x7FFFFFFa8。 您的堆栈应位于0x08000000至0x08000A00范围内。 当我看到 0x7FFFFFA8时、这是非法地址。 由于器件的存储器映射中不存在该地址、这可能会导致总线故障。  

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

    像往常一样再次感谢先生!

    在调试过程中、我注意到 您提到的寄存器 CFSR、其中位15-8为总线故障状态。 我看到 CFSR 的位值全部为零。   与 BFAR 的值相比、很奇怪、为什么它们在寄存器 CFSR 中都是0。  我相信我在上一次答复时提到的以下的登记册:

    因此、它们似乎显示了在程序崩溃或 CAN 消息停止运行的同时发生了什么情况、即一些存储器访问事件意外发生在非法地址超出物理地址范围??

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    某些内存访问事件意外发生在非法地址超出物理?????

    我认为是这样。 正如我刚才提到的、增加堆栈大小、看看这是否会改变行为。