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.

[参考译文] CC2651R3:为 CC2651R3 将多角色任务栈分配到 GPRAM 部分会导致启动问题

Guru**** 2648445 points

Other Parts Discussed in Thread: CC2651R3, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1580908/cc2651r3-assignment-of-multirole-task-stack-to-gpram-section-for-cc2651r3-leads-to-boot-problems

器件型号: CC2651R3
主题: SysConfig 中讨论的其他器件

您好、  

 

我们的应用是围绕 TI simplelink BLE SDK v7.10.2.23 中的多角色应用进行定制的。

我想将 CC2651R3 的高速缓存重新配置为 GPRAM 以释放一些 SRAM。

我已经按照必要的步骤操作、可以在内存分配窗口中看到 Configured GPRAM 部分。 但是、我不能将多角色任务栈缓冲区分配给 GPRAM 块。

static ___attribute__((section(“.taskStacks")“)) uint8_t mrTaskStack[mr_task_stack_size];

如果我这样做、应用程序在冷复位(首先批量擦除和启动)后成功启动、并按预期广播。 对于所有后续热复位、应用程序不会启动、基本上我没有看到广播。

 

我附加了供您参考的链接器命令文件和.map 文件。

 

/*******************************************************************************
 * CCS Linker configuration
 */

/* Retain interrupt vector table variable                                    */
--retain=g_pfnVectors
/* Override default entry point.                                             */
--entry_point ResetISR
/* Suppress warnings and errors:                                             */
/* - 10063: Warning about entry point not being _c_int00                     */
/* - 16011, 16012: 8-byte alignment errors. Observed when linking in object  */
/*   files compiled using Keil (ARM compiler)                                */
--diag_suppress=10063,16011,16012

/* The following command line options are set as part of the CCS project.    */
/* If you are building using the command line, or for some reason want to    */
/* define them here, you can uncomment and modify these lines as needed.     */
/* If you are using CCS for building, it is probably better to make any such */
/* modifications in your CCS project and leave this file alone.              */
/*                                                                           */
/* --heap_size=0                                                             */
--stack_size=1024
/* --library=rtsv7M3_T_le_eabi.lib                                           */

/* The starting address of the application.  Normally the interrupt vectors  */
/* must be located at the beginning of the application. Flash is 128KB, with */
/* sector length of 4KB                                                      */
/*******************************************************************************
 * Memory Sizes
 */
#define FLASH_BASE   0x00000000
#define GPRAM_BASE   0x11000000
#define RAM_BASE     0x20000000

#define FLASH_SIZE   0x00058000
#define GPRAM_SIZE   0x00002000
#define RAM_SIZE     0x00008000

#define RTOS_RAM_SIZE           0x0000012C

/*******************************************************************************
 * Memory Definitions
 ******************************************************************************/

/*******************************************************************************
 * RAM
 */

#define RAM_START      RAM_BASE

#ifdef ICALL_RAM0_START
  #define RAM_END      (ICALL_RAM0_START - 1)
#else
  #define RAM_END      (RAM_BASE + RAM_SIZE - 1)
#endif /* ICALL_RAM0_START */

/* For ROM 2 devices, the following section needs to be allocated and reserved */
#define RTOS_RAM_START RAM_BASE
#define RTOS_RAM_END   (RAM_BASE + RTOS_RAM_SIZE - 1)

/*******************************************************************************
 * Flash
 */

#define FLASH_START                FLASH_BASE
#define WORD_SIZE                  4

#define PAGE_SIZE                  0x2000

#ifdef PAGE_ALIGN
  #define FLASH_MEM_ALIGN          PAGE_SIZE
#else
  #define FLASH_MEM_ALIGN          WORD_SIZE
#endif /* PAGE_ALIGN */

#define PAGE_MASK                  0xFFFFE000

/* The last Flash page is reserved for the application. */
#define NUM_RESERVED_FLASH_PAGES   1
#define RESERVED_FLASH_SIZE        (NUM_RESERVED_FLASH_PAGES * PAGE_SIZE)

/* Check if page alingment with the Stack image is required.  If so, do not link
 * into a page shared by the Stack.
 */
#ifdef ICALL_STACK0_START
  #ifdef PAGE_ALIGN
    #define ADJ_ICALL_STACK0_START (ICALL_STACK0_START * PAGE_MASK)
  #else
    #define ADJ_ICALL_STACK0_START ICALL_STACK0_START
  #endif /* PAGE_ALIGN */

  #define FLASH_END                (ADJ_ICALL_STACK0_START - 1)
#else
  #define FLASH_END                (FLASH_BASE + FLASH_SIZE - RESERVED_FLASH_SIZE - 1)
#endif /* ICALL_STACK0_START */

#define FLASH_LAST_PAGE_START      (FLASH_SIZE - PAGE_SIZE)

/*******************************************************************************
 * Stack
 */

/* Create global constant that points to top of stack */
/* CCS: Change stack size under Project Properties    */
__STACK_TOP = __stack + __STACK_SIZE;

/*******************************************************************************
 * GPRAM
 */

#ifdef CACHE_AS_RAM
  #define GPRAM_START GPRAM_BASE
  #define GPRAM_END   (GPRAM_START + GPRAM_SIZE - 1)
#endif /* CACHE_AS_RAM */

/*******************************************************************************
 * ROV
 * These symbols are used by ROV2 to extend the valid memory regions on device.
 * Without these defines, ROV will encounter a Java exception when using an
 * autosized heap. This is a posted workaround for a known limitation of
 * RTSC/rta. See: bugs.eclipse.org/.../show_bug.cgi
 *
 * Note: these do not affect placement in RAM or FLASH, they are only used
 * by ROV2, see the BLE Stack User's Guide for more info on a workaround
 * for ROV Classic
 *
 */
__UNUSED_SRAM_start__ = RAM_BASE;
__UNUSED_SRAM_end__ = RAM_BASE + RAM_SIZE;

__UNUSED_FLASH_start__ = FLASH_BASE;
__UNUSED_FLASH_end__ = FLASH_BASE + FLASH_SIZE;

/*******************************************************************************
 * Main arguments
 */

/* Allow main() to take args */
/* --args 0x8 */

/*******************************************************************************
 * System Memory Map
 ******************************************************************************/
MEMORY
{
  /* EDITOR'S NOTE:
   * the FLASH and SRAM lengths can be changed by defining
   * ICALL_STACK0_START or ICALL_RAM0_START in
   * Properties->ARM Linker->Advanced Options->Command File Preprocessing.
   */

  /* Application stored in and executes from internal flash */
  FLASH (RX) : origin = FLASH_START, length = (FLASH_END - FLASH_START + 1)

  /* CCFG Page, contains .ccfg code section and some application code. */
  FLASH_LAST_PAGE (RX) :  origin = FLASH_LAST_PAGE_START, length = PAGE_SIZE

  /* Application uses internal RAM for data */
#if (defined(FLASH_ROM_BUILD) && (FLASH_ROM_BUILD == 2))
  RTOS_SRAM (RWX) : origin = RTOS_RAM_START, length = (RTOS_RAM_END - RTOS_RAM_START + 1)
#endif
  SRAM (RWX) : origin = RAM_START, length = (RAM_END - RAM_START + 1)

  #ifdef CACHE_AS_RAM
      GPRAM(RWX) : origin = GPRAM_START, length = GPRAM_SIZE
  #endif /* CACHE_AS_RAM */
}

/*******************************************************************************
 * Section Allocation in Memory
 ******************************************************************************/
SECTIONS
{
  .intvecs        :   >  FLASH_START
  .text           :   >> FLASH | FLASH_LAST_PAGE
  .const          :   >> FLASH | FLASH_LAST_PAGE
  .constdata      :   >> FLASH | FLASH_LAST_PAGE
  .rodata         :   >> FLASH | FLASH_LAST_PAGE
  .cinit          :   >  FLASH | FLASH_LAST_PAGE
  .pinit          :   >> FLASH | FLASH_LAST_PAGE
  .init_array     :   >  FLASH | FLASH_LAST_PAGE
  .emb_text       :   >> FLASH | FLASH_LAST_PAGE
  .ccfg           :   >  FLASH_LAST_PAGE (HIGH)

  GROUP > SRAM
  {
    .data
    .bss
    .vtable
    .vtable_ram
    vtable_ram
    .sysmem
    .nonretenvar
    /*This keeps ll.o objects out of GPRAM, if no ll.o would be placed here
      the warning #10068 is supressed.*/
    #ifdef CACHE_AS_RAM
    ll_bss
    {
      --library=*ll_*.a<ll.o> (.bss)
      --library=*ll_*.a<ll_ae.o> (.bss)
    }
    #endif /* CACHE_AS_RAM */
    .ramVecs
  } LOAD_END(heapStart)

  .stack            :   >  SRAM (HIGH) LOAD_START(heapEnd)
  .TaskStacks : > GPRAM
 
}
--symbol_map __TI_STACK_SIZE=__STACK_SIZE
--symbol_map __TI_STACK_BASE=__stack

-u_c_int00
--retain "*(.resetVecs)"
--retain "*(.vecs)"

SECTIONS
{
    .resetVecs: load > 0
    .vecs: load > 0x20000000, type = NOLOAD
}

 

如何解决此问题?

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

    在“Memory Allocation“(内存分配)窗口中、可以看到 GPRAM 部分、其中包含将多角色任务栈分配给 GPRAM 的内容

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

    您好、Kaiwalya、

    感谢您的联系。 在此期间、我将查看该文件、请确认您已执行以下步骤: https://software-dl.ti.com/simplelink/esd/simplelink_cc13xx_cc26xx_sdk/7.40.00.77/exports/docs/ble5stack/ble_user_guide/html/ble-stack-common/ram_allocation-cc13xx_cc26xx.html?highlight=gpram#configure-the-cache-as-gpram

    BR、

    David。

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

    你好,大卫,我已经遵循了指南。

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

    您好、Kaiwalya、

    如果对设备进行下电上电、您是否会在重新启动后看到广播? 热复位可能无法正确重置 BLE 栈使用的栈参数、因此可能会破坏其功能。 在哪里调用 静态__attribute__((section(“.taskStacks")“)) uint8_t mrTaskStack[mr_task_stack_size];初始化? 您能否明确地将其设置为 0?

    BR、

    David。

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

    您好 David、如果我在此执行如图所示的初始化、那么我 看不到模块 广播:不仅在第一次启动时、而且在所有热重置时

    static void multi_role_taskFxn(UArg a0, UArg a1)
    #endif
    {
      memset(mrTaskStack, 0x00, sizeof(mrTaskStack));
    
      // Initialize application
      multi_role_init();
    
      // Application main loop
      for (;;)
      {
        uint32_t events;

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

    您好、Kaiwalya、

    感谢您的确认。 我现在正在研究这件事并重现你的问题。 请允许我到明天再回答。

    首先、我认为问题可能与在与任务栈不同的存储器段中放置 BLE 堆栈对象(即 BSS OneLib)有关

    此致、

    David。

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

    您好、 Kaiwalya、

    简单问题、我们是否可以将 GPRAM 空间用于 BLE 相关任务之外的其他任务?

    BR、

    David。

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

    您好、David、我们的大部分暂存缓冲区已分配给 GPRAM(这些可能是需要重新分配的候选项)。 但是、我必须告诉您、我们的应用现在处于堆极其紧凑的阶段、因此我们需要释放更多 SRAM。 因此、任务栈必须分配给 GPRAM。 如果这是不可能的,那么我至少想知道的原因和一个可能的解决办法补丁.

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

    您好、 Kaiwalya、

    我正在努力工作、请耐心听我说。 我想确保我们遇到同样的情况。 在我的场景中、由于 sysbio 检测到“栈溢出“、程序会进入异常 (ERROR_SPIN)。 此条件正在 Task.c(函数 TasksSupport_checkStatck)中进行评估、其中它检查栈顶是否有“0xbe"值“值(栈 Cookie)。 即使在开始时初始化为该值,它最终会被 NVSCC26XX_READ() 修改,然后在检查状态评估后产生异常。 不过、如您在寄存器映像中所见、VIMS 和 CCFG 已正确设置。

    您是否有类似的症状?

    BR、

    David。

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

    您好、David、是的、我的系统结果完全相同。 在调试过程中、我还发现、即使在任务双关之前清除 mrTaskStack、也会得到 Error_raiseX()中的结果 Task_checkStack().

    代码更改:

    *in main.c
    
    int main()
    {
      /* Register Application callback to trap asserts raised in the Stack */
      halAssertCback = AssertHandler;
    
      Board_initGeneral();
    
      multi_role_initVar();
    ...
    
    
    *in multirole.c
    void multi_role_initVar(void)
    {
      memset(mrTaskStack, 0xDD, sizeof(mrTaskStack));
    }
    

    在这里、我可以看到 mrTaskStack 在初始化之后保存值 0xDD、但之后系统进入 错误状态。 使用高速缓存作为 GPRAM 的 VIMS 配置似乎正确、因为我们看到数据正在写入 GPRAM 记录(请参阅下面调用图屏幕截图中的内存浏览器输出)。  

     请参阅任务栈调用图以供参考:

    • ...
    • sal_run_system()

    • ll_Processevent()-库代码

    • task_checkStacks()

    鉴于此、我尚未验证如果 禁用 SysConfig 中的“Check Stack Flag“会发生什么情况? 有什么想法,这是否有副作用在这个应用背景下?

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

    您好、 Kaiwalya、

    我认为我看到的问题是暗示 GPRAM 的存储器空间仍被用作缓存、这是正确禁用该功能的问题。 例如、如果我运行程序而不重新利用 GPRAM、因此使应用程序正常运行、我会看到存储器空间 (GPRAM 指向的位置)的值与覆盖堆栈并导致本例中出现问题的值相同(通过 NVS 调用 — 闪存读取)。 在 调用 osal_start_system()(都在  osal_iCall_ble.c 中)之前、在 osal_init_system() 中发生了这种情况、在这种情况下、我之前提到的“堆栈溢出“的评估正在发生。

    GPRAM 存储器空间(无重新利用)

    GPRAM 存储器空间(重新利用)

    我会尽快更新您的信息。

    BR、

    David。

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

    David 大家好、我尝试将 mrTaskStack 放置在 GPRAM 中 、保护大小为 1K 字节(请参阅下面的链接器文件更改)、以避免其他外设写入 mrTaskStack 缓冲区的可能性。

    *in cc13x1_cc26x1_app_tirtos7.cmd
    
    #define FLASH_BASE   0x00000000
    #define GPRAM_BASE   0x11000400
    #define RAM_BASE     0x20000000
    
    #define FLASH_SIZE   0x00058000
    #define GPRAM_SIZE   0x00001C00
    #define RAM_SIZE     0x00008000
    
    #define RTOS_RAM_SIZE           0x0000012C

    但是、我仍然在错误状态下运行、请参阅下面使用内存浏览器和 ROV 的屏幕截图、但我可以在 HWI 上下文中隔离该错误。 另外、请注意、mrTaskStack 位于更新后的地址 0x11000400 处、这似乎是正确的!

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

    您好、 Kaiwalya

    GPRAM 的整个块正在被覆盖、因此我担心警卫不会产生影响(也在我这边测试过它)。 我已将情况缩小到 osal_SNV_init () 覆盖 GPRAM 空间,我已请求堆栈团队提供额外的帮助,以找出这种情况可能发生的原因。 我明天会尽快更新您。

    BR、

    David。

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

    您好、 Kaiwalya、

    我发现 GPRAM 空间用作 NV 压缩机制的一部分。 您可以 在 nvocmp.c 中搜索 NVOCMP_GPRAM、可以看到 GPRAM_BASE 被分配给本地缓冲区、以便在 NVOCMP_COMPACT () 中进行压缩。 通过禁用 NVOCMP_GPRAM、GPRAM 存储器空间可供使用、因此不会覆盖堆栈。 然而,这最终在 iCall_abort () 我目前正在努力弄清楚。

    BR、

    David。

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

    甚至我以前也尝试过这种方法,它导致了我记得的一个错误。

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

    您好、Kaiwalya、

    NVOCMP_FINdOffset() 函数将 获取 GPRAM 缓冲区地址、然后计算指定页面中下一个可用空空间的偏移量。 通过 NVOCMP_READ() 函数、GPRAM 8KB 空间显然完全被 覆盖。 您甚至可以看到在此操作之间禁用和启用了缓存功能、因为 NVS compaction 共享了我之前提到的空间。 但是、这对我们来说并不重要、因为我们已经默认禁用了它。 为了避免该问题、请将 PAGE_SIZE_Lshift 定义设置为 12、而不是 13、这应该会将闪存页大小 (FLASH_PAGE_SIZE) 限制为 4KB、从而计算正确的偏移量。 我已经测试过、即使在复位后、多角色应用程序也可以在我的器件上运行。  

    无需禁用 NVOCMP_GPRAM 或修改 NVOCMP_NVPAGES 

    BR、

    David。

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

    您好、David、我测试了补丁、并可以确认我的应用程序在所有热复位时也能按预期启动。 但是、如果  FLASH_PAGE_SIZE 现在设置为 4KB、这是否会影响其他功能(OAD?) 还是其他?

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

    您好、Kaiwalya、

    很高兴听到这个消息。 我目前正在研究此修改的影响。 到目前为止、绑定没有问题、但我使用的设备数量有限。 我尚未测试 OAD。

    我会尽快回来、更好地了解情况。

    BR、

    David。

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

    您好、Kaiwalya、

    有一种更好的解决方法、同时避免用于压缩的闪存页面大小(与实际的大小)之间出现差异。 在主 RAM 中分配另一个空间以进行压缩。  具体指该缓冲区: uint32_t tBuffer[]。 为此、您只需 在 nvocmp.c 文件中定义#define NVOCMP_RAM_OPTIMIZATION。 这仍需要 RAM 中的空间、因此不能确定该选项的可行性、但 删除未使用的项目需要压缩。

    BR、

    David。

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

    您好、David、我们在内部测试了此修补程序、发现配对和绑定不能按预期工作。 此外、在另一种设置中、我们尝试将 UART 任务栈放入 GPRAM 中、这也会导致不良行为。

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

    您好、 Kaiwalya、

    我能够进行配对和绑定、然后继续 GATT 操作。 这是一个帮助很大的项目。 可能不包含的内容(您需要在 nvocmp.c 中修改的是 其内部#define NVOCMP_RAM_OPTIONING。

    e2e.ti.com/.../multi_5F00_role_5F00_LP_5F00_CC2651R3SIPA_5F00_tirtos7_5F00_ticlang.zip

    BR、

    David。

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

    您好、David、您使用了哪种方法? 定义  NVOCMP_RAM_OPTIMIZATION 或上一个?

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

    您好、 Kaiwalya、

    我使用了 NVOCMP_RAM_OPTIMIZATION 选项、对于该选项、您可能需要将其添加到 nvocmp.c 文件中、因为它是 SDK 文件的一部分。

    BR、

    David。