takent 发表于 2019-12-13 10:41:36

【问】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;       
}


用原子内存管理是可以用的

takent 发表于 2019-12-13 11:03:00

裸机下,直接调用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;       
}

eric2013 发表于 2019-12-13 11:19:42

注意,用OS开头的是在SVC中断里面调用执行的,方便用户多任务,用户自己无需做多任务处理。

那个rt开头是原始API,注意多任务互斥问题。

takent 发表于 2019-12-13 11:25:14

我现在是在RTX OS使用,就会出现HardFault,使用前后作了关任务调度器,求指点

eric2013 发表于 2019-12-13 11:29:44

你的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;   
}

takent 发表于 2019-12-13 11:46:14

还是未解决问题,用了OS就出现问题,你上面函数dm_get_size没有啊,如何获取旧内存大小?

eric2013 发表于 2019-12-13 11:51:34

takent 发表于 2019-12-13 11:46
还是未解决问题,用了OS就出现问题,你上面函数dm_get_size没有啊,如何获取旧内存大小?

直接在OS下调用你二楼的函数测试。

myxiaonia 发表于 2019-12-13 12:40:20

按理说,你做的完全没问题啊

takent 发表于 2019-12-13 15:17:54

eric2013 发表于 2019-12-13 11:51
直接在OS下调用你二楼的函数测试。

解决了!
1.OS下调用二楼的函数,要求任务堆栈7K以上,不然就进入HardFault,OS调试界面也不提示溢出。
2.OS下调用一楼的函数,要求OS在非特权模式,不然就进入HardFault,原理再研究下

eric2013 发表于 2019-12-13 15:31:04

takent 发表于 2019-12-13 15:17
解决了!
1.OS下调用二楼的函数,要求任务堆栈7K以上,不然就进入HardFault,OS调试界面也不提示溢出。
...

你的工程设计应该有问题,任意使用一个V6的配套例子添加rt_memory试试。

不行的话,晚上我试试。

takent 发表于 2019-12-13 15:50:58

用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?

eric2013 发表于 2019-12-13 16:34:50

takent 发表于 2019-12-13 15:50
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?

无此要求。

myxiaonia 发表于 2019-12-18 20:09:55

takent 发表于 2019-12-13 15:50
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?

非特权模式有个问题是,不能再用全局开关中断了,所以这个非特权模式还是有点问题的,建议不要用

takent 发表于 2019-12-19 09:12:38

myxiaonia 发表于 2019-12-18 20:09
非特权模式有个问题是,不能再用全局开关中断了,所以这个非特权模式还是有点问题的,建议不要用

谢谢你的回复,我还是用特权模式。使用了lua,加载ua的包运行非常耗任务堆栈和内存,任务栈8K,动态内存CCM64K只能给它用
页: [1]
查看完整版本: 【问】RTX内存管理rt_Memory,自已实现realloc函数出现HardFault