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.

[参考译文] CC1352R:应用在使用 osal 堆时运行正常、但在遇到 heapmem 时崩溃

Guru**** 2392105 points
Other Parts Discussed in Thread: SYSBIOS, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1303767/cc1352r-application-works-fine-with-osal-heap-but-crashes-with-heapmem

器件型号:CC1352R
Thread 中讨论的其他器件:SysBiosSysConfig

大家好!

我最近将我们在一个市场中使用的 SDK 从4.10.0.78更新到5.20.0.52。  

我使用了 simple_peripheral_oad_offchip_CC13X2R1_LAUNCHXL_tirtos_ccs 项目进行定向。  

其中使用了堆配置 OSAL、就像我到目前为止见过的任何其他示例工程中一样。  

更新后的应用程序运行稳定、这是我能知道的、但只有在使用 OSAL 配置时才运行。 在 SDK 4.10中、我们使用了 heapmem 配置。

使用 SDK 5.20和 Heapmem 时、一旦我尝试连接、应用程序就会崩溃。 似乎断言处理程序随硬件错误被调用。

有趣的是、我们的应用调试编译仍然以 heaptrack 配置运行。  

我的理解是,heapmem 只是提供了一些调试的可能性 ROV,而 OSAL 是"基本的"?  

然而,如果应用程序正在粉碎与 heapmem 我担心,这是一些错误的配置的结果,其他地方。

感谢您的帮助。

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

    您好!

    感谢您与我们联系。 您能否验证在最新的 SDK 中是否观察到了该行为? 4.10和5.20 SDK 版本都是相当早的时候发布的、并且添加了许多改进和错误修复、可能会影响这种行为。

    此致、

    1月

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

    您好、Jan、

    感谢您的回复。

    我们去年尝试升级到较新的 SDK 版本。 您可以在这里看到我的同事所做的努力:

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1128189/cc1352r-device-suddenly-stopps-ble-communication

    这不起作用、好像我们的应用程序与 RTOS7不兼容。

    这 就是我想要更新到 使用旧 RTOS 的最后一个版本的原因。

    在我从4.10更新到5.20之前、我阅读了 SDK 的更改日志、但看不到任何与堆配置有关的内容。

    此致

    米里亚姆

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

    您好、Miriam:

    我想您在调研过程中已经阅读了以下内容: https://software-dl.ti.com/simplelink/esd/simplelink_cc13x2_26x2_sdk/5.20.00.52/exports/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/debugging-index.html

    据我所知、Debug 和 Release build 之间有区别。 这些变量不会在 Release 构建中自动初始化。

    您是否能够布置您的 HeapMem 配置?

    此致、

    亚瑟

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

    您好 Arthur、

    感谢链接。  

    我尝试了示例项目"simple_peripheral_oad_offchip_CC13X2R1_LAUNCHXL_tirtos_ccs"来发现我在这里遇到了相同的问题。

    可以使用连接的标准配置:

    仅更改该值、它会在使用 nrfConnect 应用程序进行 BLE 连接时崩溃:

    我使用了所提供链接中的调试代码并将其放入 assert 处理程序:

    要找出它是什么类型的错误:

    #define hw_fail_unexpected_rf_status           0x85

    至于我自己的项目:我与调试配置文件一起构建发布版本、以查看是否有区别。  

    调试编译在每个堆版本中都有效、但 当 使用 heapmem 的调试配置文件时、该发布编译也会崩溃。  

    因为示例项目也显示了这种 行为、所以我想知道它是否来自 SDK?  

    祝您新年快乐!

    米里亚姆

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

    这是发布版构建配置文件中的堆配置、但我不确定它是否有用。

    /*
    堆配置定义要用于系统的堆的类型(应用程序+堆栈)
    *只会分配一个堆缓冲区。 该堆将由系统和堆栈通过堆栈
    *一个经理(HeapMem、HeapMem+HeapTrack 或 OSAL)
    *如果需要,你仍然可以决定创建几个堆,但至少需要创建一个堆。
    *堆栈必须有一个堆来运行。
    *不同的堆管理器可用是:
    * OSAL 堆:随所有 BLE SDK 提供的旧版堆管理器。 默认情况下使用此堆管理器。
    * HeapMem: TI-RTOS 提供的堆管理器(参见 TI-RTOS 用户指南了解属性)
    * HeapTrack :位于 HeapMem 顶部的模块,允许对通过 HeapMem 分配的内存进行轻松调试。
    *
    *通过将 HEAPMGR_CONFIG 设置为相应的值来选择要使用的堆管理器(如下所示)
    * 0 = osal 堆管理器、大小是静态的。
    * 0x80 = osal 堆管理器、使用 auto-size:剩余的 RAM (不被系统使用)将被完全分配给堆。
    * 1 =静态大小的 HeapMem
    * 0x81 =自动调整大小的 HeapMem。 剩余的 RAM (未被系统使用)将被完全分配给堆。
    * 2 =具有固定大小的 HeapTrack (带 HeapMem)
    * 0x82 =具有自动大小功能的 HeapTrack (带 HeapMem):剩余的 RAM (不被系统使用)将被完全分配给堆。
    *
    *如果未定义 HEAPMGR_CONFIG、但使用了配置文件 ble_stack_heap.cfg、则该值
    *假定 HEAPMGR_CONFIG = 0x80。
    *如果没有定义 HEAPMGR_CONFIG、且没有使用文件 ble_stack_heap.cfg、则该值
    *假定 HEAPMGR_CONFIG = 0x80、默认堆大小将为3072
    *除非您在项目选项中将 HEAPMGR_SIZE 定义为不同的值(0表示自动大小)。
    *
    *从下面的配置中,将创建两个#define ,应用程序将使用它来设置堆:
    *#define HEAPMGR_SIZE
    *#define HEAPMGR_CONFIG
    *为了使用这些定义,需要添加以下 include 行:#include
    *
    *为了使自动大小堆正常工作、链接器需要创建以下符号:
    *头开始
    *头段
    */

    /*
    *免责声明: ROM 中的 HeapMem 模块只能使用 GateMutex 模块。 这意味着 malloc()
    *函数不能在 HWI/Swi 中使用。
    *这也意味着对堆的其他访问、例如使用 iCall_alloc、可能会中断堆...
    *因此、当 TI-RTOS 位于闪存中时、该解决方案最有效、从而可以使用 GateHwi。
    *如果您尝试在 ROM 中使用它,则使用 HeapCallback 的权变措施,这将降低性能。
    */
    VAR 内存= xdc.useModule('xdc.runtime.Memory');
    VAR HEAPMGR_CONFIG = 0x81;
    VAR HEAPMGR_SIZE = 30000;//仅在使用静态大小时有效。 这是为堆分配的缓冲区的大小。

    if (typeof HEAPMGR_config ==='未定义')
    {
    VAR HEAPMGR_CONFIG = 0x80;

    //以下命令将创建#define HEAPMGR_CONFIG。 然后、INCLUDE 可用于
    program.global.HEAPMGR_CONFIG = HEAPMGR_CONFIG;

    如果(HEAPMGR_CONFIG ==1 || HEAPMGR_CONFIG ==0x81)
    {
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    var heapMemParams =新 HeapMem.Params ();

    如果(HEAPMGR_CONFIG === 0x1)
    {
    heapMemParams.size = HEAPMGR_SIZE;
    program.global.HEAPMGR_SIZE = HEAPMGR_SIZE;

    否则
    {
    //如果您收到以下符号的未定义错误,则表示 AUTOHEAPSIZE 已在应用程序中定义。
    program.global.HEAPMGR_SIZE = 0;
    heapMemParams.usePrimaryHeap =真;
    HeapMem.primaryHeapBaseAddr ="&heapStart";
    HeapMem.primaryHeapEndAddr ="&heapEnd";

    program.global.stackHeap = HeapMem.create (heapMemParams);

    VAR HeapCallback = xdc.useModule('ti.sysbios.heaps.HeapCallback');
    var params = new HeapCallback.Params ();
    params.arg = 1;
    program.global.heap0 = HeapCallback.create (params);
    HeapCallback.initInstFxn ='&myHeapMemInitFxn';//在 BIOS 引导时首先调用。 初始化堆管理器。
    HeapCallback.allocInstFxn ='&myHeapMemAllocFxn';//调用分配缓冲区
    HeapCallback.freeInstFxn ='&myHeapMemFreeFxn';//调用释放缓冲区
    HeapCallback.getStatsInstFxn ='&myHeapMemGetStatsFxn';//返回堆上的统计信息。
    HeapCallback.isBlockingInstFxn ='&myHeapMemIsBlockingFxn';//返回 true:此堆始终处于阻塞状态(类似'Hwi Gate')
    Memory.defaultHeapInstance = Program.global.heap0;

    否则、如果(HEAPMGR_CONFIG == 2 || HEAPMGR_CONFIG == 0x82)
    {
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    var heapMemParams =新 HeapMem.Params ();
    如果(HEAPMGR_CONFIG == 2)
    {
    heapMemParams.size = HEAPMGR_SIZE;
    program.global.HEAPMGR_SIZE = HEAPMGR_SIZE;

    否则
    {
    //如果您收到以下符号的未定义错误,则表示 AUTOHEAPSIZE 已在应用程序中定义。
    //
    heapMemParams.usePrimaryHeap =真;
    HeapMem.primaryHeapBaseAddr ="&heapStart";
    HeapMem.primaryHeapEndAddr ="&heapEnd";
    program.global.HEAPMGR_SIZE = 0;

    var tempHeap = HeapMem.create (heapMemParams);


    VAR HeapCallback = xdc.useModule('ti.sysbios.heaps.HeapCallback');
    var params = new HeapCallback.Params ();
    params.arg = 1;
    program.global.heap0 = HeapCallback.create (params);
    HeapCallback.initInstFxn ='&myHeapTrackInitFxn';//在 BIOS 引导时首先调用。 初始化堆管理器。
    HeapCallback.allocInstFxn ='&myHeapTrackAllocFxn';//调用分配缓冲区
    HeapCallback.freeInstFxn ='&myHeapTrackFreeFxn';//调用释放缓冲区
    HeapCallback.getStatsInstFxn ='&myHeapTrackGetStatsFxn';//返回堆上的统计信息。
    HeapCallback.isBlockingInstFxn ='&myHeapTrackIsBlockingFxn';//返回 true:此堆始终处于阻塞状态(类似'Hwi Gate')
    Memory.defaultHeapInstance = Program.global.heap0;

    否则、如果(HEAPMGR_CONFIG == 0 || HEAPMGR_CONFIG == 0x80)
    {

    VAR HeapCallback = xdc.useModule('ti.sysbios.heaps.HeapCallback');
    var params = new HeapCallback.Params ();
    params.arg = 1;
    program.global.heap0 = HeapCallback.create (params);
    HeapCallback.initInstFxn ='&osalHeapInitFxn';//在 BIOS 引导时首先调用。 初始化堆管理器。
    HeapCallback.allocInstFxn ='&osalHeapAllocFxn';//调用分配缓冲区
    HeapCallback.freeInstFxn ='&osalHeapFreeFxn';//调用释放缓冲区
    HeapCallback.getStatsInstFxn ='&osalHeapGetStatsFxn';//返回堆上的统计信息。
    HeapCallback.isBlockingInstFxn ='&osalHeapIsBlockingFxn';//返回 true:此堆始终处于阻塞状态(类似'Hwi Gate')
    // HeapCallback.createInstFxn ='&osalHeapCreateFxn';//不受支持
    // HeapCallback.deleteInstFxn ='&osalHeapDeleteFxn';//不受支持
    Memory.defaultHeapInstance = Program.global.heap0;

    如果(HEAPMGR_CONFIG === 0)
    {
    //以下定义将创建#define HEAPMGR_SIZE,
    //栈用来获取有关堆管理器大小的信息。
    //如果设置为0,则表示自动调整堆大小
    program.global.HEAPMGR_SIZE = HEAPMGR_SIZE;

    否则
    {
    //以下定义将创建#define HEAPMGR_SIZE,
    //栈使用它来获取有关堆管理器大小的信息。
    //如果设置为0,则表示自动调整堆大小
    //堆缓冲区将通过使用构建/链接结束时可用的所有剩余 RAM 来自动创建。
    //为此,需要通过链接器文件创建2个符号:heapStart 和 heapEnd
    program.global.HEAPMGR_SIZE = 0;

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

    您好、Miriam:

    我已使用7.10.2.23 SDK 在 SysConfig 中启用 HeapMem、建立连接时没有看到任何错误。

    但是、我认为这似乎是一个已知问题、但到今天为止尚未解决: https://sir.ext.ti.com/jira/browse/EXT_EP-10529

    现在、如果 HeapCallback 能够在您的5.20版本 SDK 中正常工作、为什么您需要 HeapMem 呢?

    请告诉我、

    此致、

    亚瑟

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

    您好!

    我只是担心配置中的某个位置可能出现错误、仅在这种情况下显示症状、但随后会导致更多问题。
    在我看来、使用 OSAL 是很好的、我当时正在试图理解为什么是准确的。  

    报告的问题与  CC26X2R1有关、这就是我未考虑该问题的原因。  

    感谢您的回复!  

    此致、

    米里亚姆