硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2728|回复: 13
收起左侧

[RL-RTX] 【问】RTX内存管理rt_Memory,自已实现realloc函数出现HardFault

[复制链接]

36

主题

142

回帖

255

积分

高级会员

积分
255
发表于 2019-12-13 10:41:36 | 显示全部楼层 |阅读模式
RTX内存管理缺少realloc函数,自已实现realloc函数出现HardFault,在V6上调试的
代码如下
uint64_t AppMallocCCM[64*1024/8] __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;       
}


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

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 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;       
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2019-12-13 11:19:42 | 显示全部楼层
注意,用OS开头的是在SVC中断里面调用执行的,方便用户多任务,用户自己无需做多任务处理。

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

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2019-12-13 11:25:14 | 显示全部楼层
我现在是在RTX OS使用,就会出现HardFault,使用前后作了关任务调度器,求指点
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2019-12-13 11:29:44 | 显示全部楼层
你的realloc的实现可以再专业些
这个是littleLV的
  1. /**
  2. * Reallocate a memory with a new size. The old content will be kept.
  3. * @param data pointer to an allocated memory.
  4. * Its content will be copied to the new memory block and freed
  5. * @param new_size the desired new size in byte
  6. * @return pointer to the new memory
  7. */
  8. void * dm_realloc(void * data_p, uint32_t new_size)
  9. {

  10.     uint32_t old_size = dm_get_size(data_p);
  11.     if(old_size == new_size) return data_p;

  12.     void * new_p;
  13.     new_p = dm_alloc(new_size);
  14.    
  15.     if(new_p != NULL && data_p != NULL) {
  16.         /*Copy the old data to the new. Use the smaller size*/
  17.         if(old_size != 0) {
  18.             memcpy(new_p, data_p, MATH_MIN(new_size, old_size));
  19.             dm_free(data_p);
  20.         }
  21.     }
  22.    
  23.     return new_p;   
  24. }
复制代码


回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2019-12-13 11:46:14 | 显示全部楼层
还是未解决问题,用了OS就出现问题,你上面函数  dm_get_size没有啊,如何获取旧内存大小?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2019-12-13 11:51:34 | 显示全部楼层
takent 发表于 2019-12-13 11:46
还是未解决问题,用了OS就出现问题,你上面函数  dm_get_size没有啊,如何获取旧内存大小?

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

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-12-13 12:40:20 | 显示全部楼层
按理说,你做的完全没问题啊
回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2019-12-13 15:17:54 | 显示全部楼层
eric2013 发表于 2019-12-13 11:51
直接在OS下调用你二楼的函数测试。

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

不行的话,晚上我试试。
回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2019-12-13 15:50:58 | 显示全部楼层
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106754
QQ
发表于 2019-12-13 16:34:50 | 显示全部楼层
takent 发表于 2019-12-13 15:50
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?

无此要求。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-12-18 20:09:55 | 显示全部楼层
takent 发表于 2019-12-13 15:50
用OS开头的是在SVC中断里面调用执行的,那以要不要求在非特权模式?

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

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
 楼主| 发表于 2019-12-19 09:12:38 | 显示全部楼层
myxiaonia 发表于 2019-12-18 20:09
非特权模式有个问题是,不能再用全局开关中断了,所以这个非特权模式还是有点问题的,建议不要用

谢谢你的回复,我还是用特权模式。使用了lua,加载ua的包运行非常耗任务堆栈和内存,任务栈8K,动态内存CCM64K只能给它用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 10:04 , Processed in 0.201987 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表