你好,
我正在eval-board上使用DA14683设备和实际的SDK和工具。
似乎我的内存布局有问题,编译器告诉我用完内存,当需要超过32 KByte RAM。以下将会显示:
App.elf section ' RETENTION_RAM0'不适用于region ' RetRAM0'
RetRAM0溢出了32字节
下面是我的实际配置(来自custom_config_qspi.h)
#定义dg_configOPTIMAL_RETRAM (0) # define dg_configMEM_RETENTION_MODE (0 x1f) # define dg_configQSPI_CACHED_RAM_SIZE_AE (61 * 1024) # define dg_configQSPI_CACHED_RETRAM_0_SIZE_AE (67 * 1024) # define dg_configQSPI_CACHED_RAM_SIZE_BB (62 * 1024) # define dg_configQSPI_CACHED_RETRAM_0_SIZE_BB (66 * 1024)
我从一个示例中使用了这个,我希望至少有64 KByte RAM。
即使玩弄数字,我也不能解决这个问题。
我要怎么配置才能得到最大值。运行在QSPI缓存模式下的BLE应用程序的RAM大小?我想保留完整的RAM。
顺便问一下,在项目设置中使用以下配置是否正确:
dg_configBLACK_ORCA_IC_REV = BLACK_ORCA_IC_REV_B dg_configBLACK_ORCA_IC_STEP = BLACK_ORCA_IC_STEP_B
致以最亲切的问候
迪特尔
关键词:
设备:
你好,
我刚刚意识到,它与FreeRTOS堆的调整有关
当我增加这个数时,就会得到这个问题。
它不会发生,当我增加一些其他缓冲区,例如Segger RTT(仅用于测试):
然后编译器/链接器输出似乎是OK:
这有助于回答我的问题吗?
致以最亲切的问候
迪特尔
你好
DA14683的内存映射相当复杂。
请找到我在地图文件中使用的一个小awk脚本,该文件由编译器生成,用于定位各个部分
{
开始= 0;
= 1;
total_size = 0;
First_address = (2^32) - 1;
last_address = 0;
printf(";开始;规模;结束;规模;\ n”);
{做
If ($0 ~ /memory map/)
开始= 1;
如果(0 ~ / ^输出/美元)
再次= 0;
If (started == 1 && $0 ~ /^[[:alnum:]\.]/){
地址= strtonum(2美元);
大小= strtonum(3美元);
# if(address != 0 && size != 0){
如果(大小! = 0){
如果(地址< first_address)
first_address =地址;
如果(地址> last_address)
last_address =地址;
printf (" % s; 0 X % 0 X %; 0 X %; % u; \ n”,1美元,地址、规模、地址+大小,大小);
total_size + =大小;
}
}
If (getline <= 0)
再次= 0;
} while(再次> 0);
printf("总和;;0 X %;; % u; \ n”,total_size, total_size);
printf("range;0x%X;0x%X; %u; % n", last_address - first_address, last_address - first_address, last_address - first_address);
退出;
}
把这个写进一个脚本。Awk文件,然后运行
#呆呆- f脚本。awk yoursoftware.map
目的是分析二进制文件的整体结构,以确定哪个部分占用太多的空间,应减少。
然后下一步是确定哪个堆/堆栈在哪里,这样您就有机会设置每个堆/堆栈的大小。
在我这边,我在custom_config_qspi.h文件中使用以下配置
#define dg_configRAM_RETRAM_0_SIZE_BB(64 * 1024) //保留ram块是8k, 24k或32k。包含os_heap
#define dg_configRAM_RAM_SIZE_BB(64 * 1024) //定义。bss, .heap, .stack的和
#define __HEAP_SIZE (24 * 1024)
#define __STACK_SIZE (16 * 1024)
和
#define configTOTAL_HEAP_SIZE(48* 1024) /*这是FreeRTOS的总堆大小*/
请记住,物理RAM大小是144k,其中保留RAM是64k。
关于Flash部分,固件分区的大小是0x7F000 (~500kB),所以你的二进制文件不能超过这个大小。
祝你好运(我花了好几个小时才把软件装进内存!)
您好,非常感谢您的详细回答。
我会尽快尝试你的脚本。
同时,你能告诉我freeRTOS堆会放在哪个部分吗?
另一个问题是关于RAM部分的:
-最大64kbyte对吗?保留
使用剩余RAM空间的最佳策略是什么?
致以最亲切的问候
迪特尔
嗨,迪特尔•福尔克
很抱歉回复晚了。能否说明在增加堆后问题是否得到解决?你得到的错误是什么?你在调试模式下运行它了吗?
谢谢,PM_Dialog
你好,
我当前的内存配置是这样的:
这工作,我的链接器输出是:
当我增加configTOTAL_HEAP_SIZE(16 * 1024),然后链接器失败,我得到以下输出:
同样的问题发生在调试和发布构建(DA14683-00-Debug_QSPI, DA14683-00-Release_QSPI)
致以最亲切的问候
迪特尔
你好
带有我现在使用的dg_config(用于custom_config_qspi.h)的小勘误表
#define dg_configQSPI_CACHED_RETRAM_0_SIZE(96 * 1024) //包含ucHeap[] aka .os_heap aka FreeRTOS Heap。
#define dg_configQSPI_CACHED_RETRAM_1_SIZE(0 * 1024) //该section没有数据
#define dg_configQSPI_CACHED_RAM_SIZE(32 * 1024) //定义。bss, .heap, .stack的总和。(128k - RETRAM0 - BLERET)
#define configTOTAL_HEAP_SIZE(47 * 1024) //这是FreeRTOS的总堆大小,在.os_heap部分的ucHeap[]。请参阅xMinimumEverFreeBytesRemaining符号,以了解有多少内存从未被使用。
#define __HEAP_SIZE (15 * 1024) // 15ko参见调试工具中的heapend symbol - __HeapBase in .map文件。使用端口堆溢出验证检查大小。newlib需要(printf, strtok是高消耗)
#define __STACK_SIZE (1 * 1024) // 1ko: __StackTop in .map文件- MSP寄存器的Cortex-M0。仅在启动时使用,不能为空。
我也使用
#define dg_configSHUFFLING_MODE (0x0) // 0x0自然顺序。保留ram块是8k, 24k或32k。
#define dg_configMEM_RETENTION_MODE (0x1F) //所有内存块保留
避免在执行过程中关闭内存。
鉴于你的情况,我建议你
-提升RETRAM_0_SIZE
-降低RAM_SIZE相同的量
-反转HEAP和STACK的大小,因为堆栈只在启动时使用,然后FreeRTOS为每个任务设置专用的堆栈。heap被newlib之类的“not freertos”代码使用,所以如果你使用printf或strtok,你应该保留一些~15kB。我假设你使用FreeRTOS的heap_4.c分配策略。你可以使用FreeRTOS最新版本中的heap_6.c来撤销os_heap并与newlib共享.heap。
致以最亲切的问候
嗨,迪特尔•福尔克
你在运行我们的SDK项目吗?你能帮我在我这边复制一下吗?设置BUFFER_SIZE_UP宏为45000后你的问题解决了吗?
谢谢,PM_Dialog
你好,
我尝试在“custom_config_qspi_suota.h”中配置“pxp_reporter”,并在那里更改:
#定义configTOTAL_HEAP_SIZE 16800
得到以下错误:
...pxp_reporter。elf节' RETENTION_RAM0'将不适合区域' RetRAM0'
...' RetRAM0'溢出256字节
我还在其中添加了BUFFER_SIZE_UP宏,但这不会改变任何东西。
如果你能在你这边重新制作这个,并为这个问题提供一个解决方案,那就太好了。谢谢你!
致以最亲切的问候
迪特尔
嗨,迪特尔•福尔克
是否可以共享您在设置中使用的custom_config_qspi_suota.h文件?
另外,哪些配置是有效的,哪些是无效的?
你在pxp_reporter项目中做了其他的修改吗?
在你最初的帖子中,我看到你使用了非最佳配置。在此配置期间,freeRTOS堆将被放置在RETRAM_0中,当使用RETRAM_1时,将被放置在这里。
如果您将总堆大小(configTOTAL_HEAP_SIZE)增加到22000,这是否有任何影响?
谢谢,PM_Dialog
你好,
关于“pxp_reporter”项目,我刚刚检查了我使用的原始项目从“DA1468x_DA15xxx_SDK_1.0.14.1081”。
唯一需要改变的(得到错误)是增加行的
#定义configTOTAL_HEAP_SIZE
用16800代替了最初的定义。
我将修改后的custom_config_qspi_suota.h文件放在这个回复中,因此通常您应该能够在您的站点上复制该文件。我期待着你的结果。
致以最亲切的问候
迪特尔
嗨Detier,
我在SDk的pxp_reporter示例中使用了相同的custom_config_qspi_sutta .h头文件,但我无法复制这个错误。另外,我为SUOTA配置构建了项目,除了从您自己的custom_config_qspi_suota.h复制这个错误,我是否应该执行其他步骤?
谢谢,PM_Dialog
能否提供一下这个测试使用的是哪个SmartSnippet版本,以及哪个SDK ?
如果使用完全相同的开发环境和原始示例,我不知道会有什么不同。
我可以尝试在另一台计算机上进行安装,并在我这边再次检查。对于这个行动,我需要你的反馈,你正在使用的版本。
致以最亲切的问候
迪特尔
嗨,迪特尔•福尔克
我使用SDK_1.0.14和SmartSnippets Studio v.1.6.3。该版本可以在DA14682/683产品页面的“开发工具”部分获得。
//www.wsdof.com/雷电竞官网登录products/connectivity/bluetooth-low-energy/smartbond-da14682-and-da14683
你能在一个新的SDK目录中尝试一下吗?
谢谢,PM_Dialog