你好,
我用DA14683设备与实际eval-board SDK和工具。
看起来,内存布局,我有一个问题,编译器告诉我耗尽内存,当需要更多32 kb RAM。以下将显示:
App.elf节“RETENTION_RAM0”不会适应地区“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千字节的RAM。
即使玩的数字,我无法解决这个问题。
我有什么配置马克斯。RAM大小在QSPI BLE运行的应用程序缓存模式?我想要完整的RAM保留。
顺便说一下,这是正确使用以下配置在项目设置:
dg_configBLACK_ORCA_IC_REV = BLACK_ORCA_IC_REV_B dg_configBLACK_ORCA_IC_STEP = BLACK_ORCA_IC_STEP_B
致以最亲切的问候
迪特尔
关键词:
设备:
你好,
我承认,这是有关调整FreeRTOS堆
所以当我increas这个数字,然后我得到这个问题。
它不发生,当我increas其他缓冲区如耐火RTT(只是为了测试):
然后编译器和链接器输出似乎好了:
这有助于回答我的问题吗?
致以最亲切的问候
迪特尔
你好
内存映射的DA14683相当复杂。
请在地图上我发现一个小的awk脚本使用文件被编译器来定位各个部分产生
{
开始= 0;
= 1;
total_size = 0;
first_address = 2 ^ 32 - 1;
last_address = 0;
printf(";开始;规模;结束;规模;\ n”);
{做
如果(0 ~ /内存映射/美元)
开始= 1;
如果(0 ~ / ^输出/美元)
再次= 0;
如果(开始= = 1 & & $ 0 ~ / ^ [[:alnum:] \] /) {
地址= strtonum(2美元);
大小= strtonum(3美元);
#如果(地址= 0 & &大小! = 0){
如果(大小! = 0){
如果(地址< first_address)
first_address =地址;
如果(地址> last_address)
last_address =地址;
printf (" % s; 0 X % 0 X %; 0 X %; % u; \ n”, 1美元,地址、规模、地址+大小,大小);
total_size + =大小;
}
}
如果(getline < = 0)
再次= 0;
}(再次> 0);
printf("总和;;0 X %;; % u; \ n”, total_size, total_size);
printf("范围;0 X % X; 0 X %; 0 X %; % u; \ n”, first_address, last_address——first_address last_address, last_address - first_address);
退出;
}
写这个脚本。awk文件,然后运行
#呆呆- f脚本。awk yoursoftware.map
目的是分析二进制文件的总体结构,识别哪些部分占用太多空间,应减少。
然后下一步是确定堆/堆栈,所以你有机会调整大小的。
在我身边我custom_config_qspi使用以下配置。h文件
#定义dg_configRAM_RETRAM_0_SIZE_BB(64 * 1024) / /保留内存块8 k, 24 k或32 k。包含os_heap
#定义dg_configRAM_RAM_SIZE_BB(64 * 1024) / /笔.bss .heap .stack
#定义__HEAP_SIZE (24 * 1024)
#定义__STACK_SIZE (16 * 1024)
和
#定义configTOTAL_HEAP_SIZE(48 * 1024) / *这是FreeRTOS总堆大小* /
记住,物理RAM的大小是144 k其中保留内存是64 k。
关于Flash部分,固件分区0 x7f000大小(~ 500 kb)所以你二进制不得超过这一点。
好运(我花了几个小时来适应软件到内存中!)
你好,非常感谢你详细的回答。
我将尝试尽快您的脚本。
与此同时,你能告诉我在哪个部分freeRTOS堆会吗?
另一个问题是关于内存部分:
——这是正确的,64年千字节是马克斯。保留
——什么是最好的策略使用的剩余内存空间?
致以最亲切的问候
迪特尔
嗨,迪特尔•福尔克
我的道歉为我的迟回复。你能请注明如果增加堆后问题已经解决了吗?这是你的错误吗?你在调试模式下运行它了吗?
谢谢,PM_Dialog
你好,
您当前的内存配置是这样的:
这工作,我的链接器的输出是:
当我增加configTOTAL_HEAP_SIZE(16 * 1024)然后链接失败我我落的输出:
同样的问题发生在调试和发布构建(DA14683-00-Debug_QSPI DA14683-00-Release_QSPI)
致以最亲切的问候
迪特尔
你好
现在小勘误表dg_config我使用(custom_config_qspi.h)
#定义dg_configQSPI_CACHED_RETRAM_0_SIZE(96 * 1024) / /包含ucHeap[]又名.os_heap FreeRTOS堆。
#定义dg_configQSPI_CACHED_RETRAM_1_SIZE(0 * 1024) / /部分没有数据。
#定义dg_configQSPI_CACHED_RAM_SIZE (32 * 1024) / / .bss, .heap .stack。(128 k - RETRAM0 BLERET)
#定义configTOTAL_HEAP_SIZE(47 * 1024) / /这是FreeRTOS总堆大小,ucHeap .os_heap节[]。看到xMinimumEverFreeBytesRemaining象征知道从未使用多少内存。
#定义__HEAP_SIZE (15 * 1024) / / 15 ko看到heapend象征在调试工具——__HeapBase . map文件。使用港口堆溢出验证检查大小。所需newlib (printf, strtok很高的消费者)
#定义__STACK_SIZE(1 * 1024) / / 1柯:__StackTop . map文件- MSP Cortex-M0注册。只使用在启动时不能为空。
我也使用
#定义dg_configSHUFFLING_MODE (0 x0) / / 0 x0自然秩序。保留内存块8 k, 24 k或32 k。
#定义dg_configMEM_RETENTION_MODE (0 x1f) / /保留所有内存块
为了避免内存执行期间关掉。
我建议在你的情况中
——提高RETRAM_0_SIZE
——提高RAM_SIZE同样的阿蒙山崖
——反大小的堆和栈,因为栈是只在启动时使用,然后FreeRTOS设置每个任务的专用栈。堆被“不freertos”代码newlib所以你应该保留一些如果你使用printf或strtok ~ 15 kb。我假设您使用heap_4。c FreeRTOS分配策略。您可以使用heap_6。从最新版本的c FreeRTOS撤回os_heap和分享.heap newlib。
致以最亲切的问候
嗨,迪特尔•福尔克
你运行我们的SDK项目吗?你能帮我复制在我的身边吗?是你的设置BUFFER_SIZE_UP宏45000后问题解决了吗?
谢谢,PM_Dialog
你好,
我试图配置“pxp_reporter”在“custom_config_qspi_suota。h”和改变:
#定义configTOTAL_HEAP_SIZE 16800
并得到以下错误:
…pxp_reporter。精灵部分“RETENTION_RAM0”不会适应地区“RetRAM0”
…由256个字节的RetRAM0溢出
我也把BUFFER_SIZE_UP宏,但这不会改变任何事情。
这将是伟大的如果你可以rerpoduce这一边,为这个问题提供一个解决方案。谢谢你!
致以最亲切的问候
迪特尔
嗨,迪特尔•福尔克
可以共享custom_config_qspi_suota。h文件,您使用的是在你的设置吗?
此外,什么是配置工作和不工作吗?
你做了任何其他修改pxp_reporter项目吗?
在你最初的帖子,我发现您正在使用最优配置。在这个配置中,freeRTOS堆将被放置在RETRAM_0利用RETRAM_1,将放在这里。
如果你增加总堆大小(configTOTAL_HEAP_S