OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4315|回复: 4

FreeRTOS 内存 内存复制,内存重新分配问题

[复制链接]

4

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-9-4
在线时间
31 小时
发表于 2020-6-16 15:05:08 | 显示全部楼层 |阅读模式
20金钱
用的是heap_4。一共有三个问题。前提是 用pvPortMalloc申请一个指针 *pvReturn1 。 问题如下:
1)假设我不太清楚程序中是怎么申请这个指针的,请问我怎么根据这个指针  *pvReturn1 得到我当初申请的长度呢?


2)我现在又重新申请了一个指针 *pvReturn2 ,我怎么把 *pvReturn1 的内容复制到   *pvReturn2中呢?


3)有没有一个函数可以给申请的 *pvReturn1 清零。

最佳答案

查看完整内容[请看2#楼]

忘记了,代码中的 p1_size 是包含了BlockLink_t本身大小了。 还要减掉结构体本身大小:
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2018-9-1
在线时间
177 小时
发表于 2020-6-16 15:05:09 | 显示全部楼层
ultraelec 发表于 2020-6-17 03:33
明白你的意思,但是不要这么说。不是malloc了一个指针,而是malloc申请了一块内存,赋值给了一个指针。而且 ...

忘记了,代码中的 p1_size 是包含了BlockLink_t本身大小了。
还要减掉结构体本身大小:
  1. unsigned int p1_size = (((BlockLink_t *)( (uint8_t*)p1 - xHeapStructSize ))->xBlockSize) &~xBlockAllocatedBit;
  2. p1_size -= xHeapStructSize;
复制代码
uevip#126.com
回复

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2660
金钱
2660
注册时间
2019-8-14
在线时间
411 小时
发表于 2020-6-16 20:17:27 | 显示全部楼层
帮顶~~
回复

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
743
金钱
743
注册时间
2018-9-1
在线时间
177 小时
发表于 2020-6-17 03:33:43 | 显示全部楼层
明白你的意思,但是不要这么说。不是malloc了一个指针,而是malloc申请了一块内存,赋值给了一个指针。而且说指针p1,不要说指针*p1。
通过动态内存分配的内存的地址来求分配内存大小,通常情况下没有办法,因为不知道具体分配方案,也没有C库函数做这个事。
但是能够具体到malloc源码,你的部分需求是能做的。
从heap4_.c 源码中可以看到动态内存是通过 BlockLink_t 结构来保存分配内存信息的
那么参考源码则可得到p1指向的动态内存大小:

  1. unsigned int p1_size = (((BlockLink_t *)( (uint8_t*)p1 - xHeapStructSize ))->xBlockSize) &~xBlockAllocatedBit;
复制代码


因为BlockLink_t 结构体或变量都是heap4_.c中的变量,外部不可见,所以你的用户源码中不能直接用。要么在heap4_.c定义一个函数返回大小,要么把这些变量/类型定义拷贝到你自己的函数中。
(注意xBlockAllocatedBit变量在初始化时会被赋值为其它值)

通过这个方法,得到的并不是申请内存时的大小,而是按内存方案中的字节对齐后的实际大小。
简而言之就是得到p1_size大于等于申请的size,小于(size+8-(size&7))。
如果原来通过p1初始化/修改过所有内容为非0值,那么很容易判断出分配时的大小,因为可能的多余的内容始终为0,
如果没有的话就不知道精确大小了。

那么使用p1_size可解决部分需求:
单纯清零:用memset/for循环赋值,也不会有啥问题。
复制:用memcpy 将p1 复制给p2
uevip#126.com
回复

使用道具 举报

4

主题

18

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-9-4
在线时间
31 小时
 楼主| 发表于 2020-6-17 14:41:50 | 显示全部楼层
ultraelec 发表于 2020-6-17 11:22
忘记了,代码中的 p1_size 是包含了BlockLink_t本身大小了。
还要减掉结构体本身大小:

多谢指点,我验证了一下,确实这样就能得到内存大小,且实际的内存大小会比申请的内存大小要大
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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