分散加载文件如下
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
main.o (+RW +ZI)
screen_read.o (+RW +ZI)
screen_write.o (+RW +ZI)
;startup_stm32f407xx.o (+RW +ZI)
;drv_usart.o (+RW +ZI)
;myiic.o (+RW +ZI)
}
}
其中具体的是
当前用了2个串口,一个buf是256,另一个是4096,只要开串口,就报这个断言错误
(rx_fifo != RT_NULL) assertion failed at function:rt_serial_open, line number:629
注释掉一个串口,另一个串口也会报错,我把这3个放在了那个64KB的位置,计算一下,加起来也没有65536个字节啊,为什么总报错呢?
堆栈空间截图
谢谢
更新,发现缩小串口的buf,程序可以跑起来,这里4096改成10可以运行
但是我对比了正常和不正常的map文件,差别非常小,没有发现哪个特别大,我应该怎么调呢
这个。。。断点进去调试一下看看啦。
既然是在 rt_serial_open
函数出现的断言,那么就在这个函数开头打个断点。然后在 rt_device_open
调用的地方打个断点。
先观察这俩函数的调用顺序,是否是 rt_device_open
调用 rt_serial_open
后出现断言的。
然后就是单步 rt_serial_open
函数看看代码执行流程和变量变化情况, rx_info
申请内存是否成功
等等等等…
因为是rx fifo失败,申请空间的函数是
rx_fifo = (struct rt_serial_rx_fifo*) rt_malloc (sizeof(struct rt_serial_rx_fifo) +
serial->config.bufsz);
RT_ASSERT(rx_fifo != RT_NULL);
调用这个函数
RT_WEAK void *rt_malloc(rt_size_t size)
{
rt_base_t level;
void *ptr;
/* Enter critical zone */
level = _heap_lock();
/* allocate memory block from system heap */
ptr = _MEM_MALLOC(size);
/* Exit critical zone */
_heap_unlock(level);
/* call 'rt_malloc' hook */
RT_OBJECT_HOOK_CALL(rt_malloc_hook, (ptr, size));
return ptr;
}
然后这个宏定义在这,相当于初始化之后,有一个systemheap
#define _MEM_INIT(_name, _start, _size) \
system_heap = rt_smem_init(_name, _start, _size)
#define _MEM_MALLOC(_size) \
rt_smem_alloc(system_heap, _size)
这里调用了rt_system_heap_init函数
出现heapbegin heapend,找到board.h
#define STM32_SRAM_SIZE (128)
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
#if defined(__ARMCC_VERSION)
extern int Image$$RW_IRAM1$$ZI$$Limit;
#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit)
#elif __ICCARM__
#pragma section="CSTACK"
#define HEAP_BEGIN (__segment_end("CSTACK"))
#else
extern int __bss_end;
#define HEAP_BEGIN (&__bss_end)
#endif
#define HEAP_END STM32_SRAM_END
调整一下 rtt内存管理算法, RTT支持双内存片。
LR_IROM1 0x08000000 0x00080000 { ; load region size_region
ER_IROM1 0x08000000 0x00080000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 {; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (+RW +ZI)
}
}
将ram2初始化为内存堆
static struct rt_memheap ram2;
static int ram2_heap_init(void)
{
return rt_memheap_init(&ram2,
"ram",
(void *)0x10000000,
0x10000);
}
INIT_BOARD_EXPORT(ram2_heap_init);
RTT内存管理配置
/* Memory Management */
#define RT_USING_MEMPOOL
#define RT_USING_MEMHEAP
#define RT_USING_MEMHEAP_AUTO_BINDING
#define RT_USING_MEMHEAP_AS_HEAP
#define RT_USING_MEMTRACE
#define RT_USING_HEAP
@梅江松子](https://oss-club.rt-thread.org/uploads/20220929/da39a3ee5e6b4b0d3255bfef95601890afd80709.png
我没有添加代码,也正常了。我不理解为什么要初始化内存堆,直接ram也能用啊。我的map文件里显示 IRAM1里有内容
申请不成功啊,现在是想怎么调整分散加载文件,留出空间,我不知道到底是哪里空间不够。