【问】RTX内存管理rt_Memory,自已实现realloc函数出现HardFault
RTX内存管理缺少realloc函数,自已实现realloc函数出现HardFault,在V6上调试的代码如下
uint64_t AppMallocCCM __attribute__((at(0x10000000)));
os_init_mem(AppMallocCCM, 1024*64);
void *ReallocMem(void *p, size_t size)
{
void *pnew;
//Allocate a memory block
pnew = os_alloc_mem(AppMallocCCM, size);//malloc(size);
//copy oldmemory block
memmove(pnew, p, size);
//Free memory block
os_free_mem(AppMallocCCM, p);//free(p);
//Return a pointer to the newly allocated memory block
return pnew;
}
用原子内存管理是可以用的
裸机下,直接调用rt_init_mem,rt_alloc_mem,rt_free_mem实现realloc是可以用,不用OS开头的
void *ReallocMem(void *p, size_t size)
{
void *pnew;
//Allocate a memory block
pnew = rt_alloc_mem(AppMallocCCM, size);//malloc(size);
//copy oldmemory block
memcpy(pnew, p, size);
//Free memory block
rt_free_mem(AppMallocCCM, p);//free(p);
//Return a pointer to the newly allocated memory block
return pnew;
}
注意,用OS开头的是在SVC中断里面调用执行的,方便用户多任务,用户自己无需做多任务处理。
那个rt开头是原始API,注意多任务互斥问题。 我现在是在RTX OS使用,就会出现HardFault,使用前后作了关任务调度器,求指点 你的realloc的实现可以再专业些
这个是littleLV的
/**
* Reallocate a memory with a new size. The old content will be kept.
* @param data pointer to an allocated memory.
* Its content will be copied to the new memory block and freed
* @param new_size the desired new size in byte
* @return pointer to the new memory
*/
void * dm_realloc(void * data_p, uint32_t new_size)
{
uint32_t old_size = dm_get_size(data_p);
if(old_size == new_size) return data_p;
void * new_p;
new_p = dm_alloc(new_size);
if(new_p != NULL && data_p != NULL) {
/*Copy the old data to the new. Use the smaller size*/
if(old_size != 0) {
memcpy(new_p, data_p, MATH_MIN(new_size, old_size));
dm_free(data_p);
}
}
return new_p;
}
还是未解决问题,用了OS就出现问题,你上面函数dm_get_size没有啊,如何获取旧内存大小? takent 发表于 2019-12-13 11:46
还是未解决问题,用了OS就出现问题,你上面函数dm_get_size没有啊,如何获取旧内存大小?
直接在OS下调用你二楼的函数测试。 按理说,你做的完全没问题啊 eric2013 发表于 2019-12-13 11:51
直接在OS下调用你二楼的函数测试。
解决了!
1.OS下调用二楼的函数,要求任务堆栈7K以上,不然就进入HardFault,OS调试界面也不提示溢出。
2.OS下调用一楼的函数,要求OS在非特权模式,不然就进入HardFault,原理再研究下 takent 发表于 2019-12-13 15:17
解决了!
1.OS下调用二楼的函数,要求任务堆栈7K以上,不然就进入HardFault,OS调试界面也不提示溢出。
...
你的工程设计应该有问题,任意使用一个V6的配套例子添加rt_memory试试。
不行的话,晚上我试试。 用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式? takent 发表于 2019-12-13 15:50
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?
无此要求。 takent 发表于 2019-12-13 15:50
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?
非特权模式有个问题是,不能再用全局开关中断了,所以这个非特权模式还是有点问题的,建议不要用 myxiaonia 发表于 2019-12-18 20:09
非特权模式有个问题是,不能再用全局开关中断了,所以这个非特权模式还是有点问题的,建议不要用
谢谢你的回复,我还是用特权模式。使用了lua,加载ua的包运行非常耗任务堆栈和内存,任务栈8K,动态内存CCM64K只能给它用
页:
[1]