电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区
论坛
开发板专区
【STM32F412-DISCO 开发板试用体验】简单内存管理实验
【STM32F412-DISCO 开发板试用体验】简单内存管理实验
donatello
LV6工程师
| 2017-05-31 20:50:44
浏览量 846
回复:1
发表新帖
在之前的报告中我已经成功从SD卡读取已知文件大小的BMP文件并显示,由于文件大
小已知,因此要给这个图片开辟多大的数组也是事先计算好确定好的,
但是!实际应用
中,事先知道要解码的BMP文件大小的情况极少发生,在早期的8位单片机进行文件解码
数据存放的实验(比如十几年前搭载8位单片机的MP3),由于8位单片机大都不支持硬件
动态内存分配,因此人们的解决方法是使用并行总线的外扩S(D)RAM芯片来开辟单片机解
码所需要的内存空间,使用软件模拟的方式进行动态内存分配,但是这样做的话,解码
速度就大打折扣,并且会产生许多不足一扇区大小而无法利用的碎片内存空间(产生碎
片空间的原因大多是因为分配算法存在漏洞以及S(D)RAM更新换代导致算法标准不统一)
,白白浪费了S(D)RAM的高速和大容量的优势,并且由于早期S(D)RAM的售价高,MP3等产
品都卖到很贵的价格(不过其实大部分中低档MP3并不带有S(D)RAM),不是一般家境的
学生可以接受的。
电子产品经历了多年来风风雨雨的洗礼,如今半导体技术已经发展得非常迅猛,32
位单片机拥有海量的内存和FLASH,外扩S(D)RAM价格虽然还是高昂,但是比起以前还是
便宜了许多。另外,现在的32位ARM内核单片机大多都支持动态内存分配,即可以像PC那
样使用类似于malloc的函数从内存池中划拨一块连续的内存空间来供char数组使用,
char指针指向的内存位置即为内存空间首地址。内存池可以是内部SRAM或者外部SRAM。
动态内存分配有许多好处:
1.可以按需分配内存,而不用在函数开始的时候划拨一块固定的足够大的内存,用不完
还造成内存浪费;
2.数组工作完毕后可以立即使用释放内存函数释放内存空间,防止“占着茅坑不拉屎”
即内存泄漏。
开始进行动态内存分配实验。malloc函数参考的是正点原子的例程,所有基于内存
的操作都要先选择所在内存池。实验内容为:
1.先定义一个uint8_t类型的指针,命名为p,不分配内存,也不分配所指内容;
2.使用myalloc函数给这个指针p分配100个uint8_t空间;
3.用1~110这110个数字填充这个指针所对应的数组,并在串口中观察结果;
4.把给这个指针p分配100个uint8_t空间这行语句注释掉,重复步骤3,并在串口中观察
结果;
5.使用myfree函数释放数组的空间,并在串口中观察结果;
从实验结果我们可以得出以下结论:
1.空uint8_t指针p必须分配内存才能正常装载并读取数值:
2.即使mymalloc函数只分配了100个空间给指针p,装载110个数值也正常;
3.myfree函数并不会影响指针p中的数据。
这份报告存在诸多不足之处,欢迎各路STM32大神指正。
上传一份工程文件+头文件。
在之前的报告中我已经成功从SD卡读取已知文件大小的BMP文件并显示,由于文件大
小已知,因此要给这个图片开辟多大的数组也是事先计算好确定好的,
但是!实际应用
中,事先知道要解码的BMP文件大小的情况极少发生,在早期的8位单片机进行文件解码
数据存放的实验(比如十几年前搭载8位单片机的MP3),由于8位单片机大都不支持硬件
动态内存分配,因此人们的解决方法是使用并行总线的外扩S(D)RAM芯片来开辟单片机解
码所需要的内存空间,使用软件模拟的方式进行动态内存分配,但是这样做的话,解码
速度就大打折扣,并且会产生许多不足一扇区大小而无法利用的碎片内存空间(产生碎
片空间的原因大多是因为分配算法存在漏洞以及S(D)RAM更新换代导致算法标准不统一)
,白白浪费了S(D)RAM的高速和大容量的优势,并且由于早期S(D)RAM的售价高,MP3等产
品都卖到很贵的价格(不过其实大部分中低档MP3并不带有S(D)RAM),不是一般家境的
学生可以接受的。
电子产品经历了多年来风风雨雨的洗礼,如今半导体技术已经发展得非常迅猛,32
位单片机拥有海量的内存和FLASH,外扩S(D)RAM价格虽然还是高昂,但是比起以前还是
便宜了许多。另外,现在的32位ARM内核单片机大多都支持动态内存分配,即可以像PC那
样使用类似于malloc的函数从内存池中划拨一块连续的内存空间来供char数组使用,
char指针指向的内存位置即为内存空间首地址。内存池可以是内部SRAM或者外部SRAM。
动态内存分配有许多好处:
1.可以按需分配内存,而不用在函数开始的时候划拨一块固定的足够大的内存,用不完
还造成内存浪费;
2.数组工作完毕后可以立即使用释放内存函数释放内存空间,防止“占着茅坑不拉屎”
即内存泄漏。
开始进行动态内存分配实验。malloc函数参考的是正点原子的例程,所有基于内存
的操作都要先选择所在内存池。实验内容为:
1.先定义一个uint8_t类型的指针,命名为p,不分配内存,也不分配所指内容;
2.使用myalloc函数给这个指针p分配100个uint8_t空间;
3.用1~110这110个数字填充这个指针所对应的数组,并在串口中观察结果;
4.把给这个指针p分配100个uint8_t空间这行语句注释掉,重复步骤3,并在串口中观察
结果;
5.使用myfree函数释放数组的空间,并在串口中观察结果;
从实验结果我们可以得出以下结论:
1.空uint8_t指针p必须分配内存才能正常装载并读取数值:
2.即使mymalloc函数只分配了100个空间给指针p,装载110个数值也正常;
3.myfree函数并不会影响指针p中的数据。
这份报告存在诸多不足之处,欢迎各路STM32大神指正。
上传一份工程文件+头文件。
0
收藏
举报
分享
×
微信分享
扫描二维码分享
qq分享
QQ空间分享
微博分享
我来回复
登录后可评论,请
登录
或
注册
所有回答
数量:
1
heaton426
2017-05-31
棒棒哒
0
回复
举报
发布
×
举报
举报人:
被举报人:donatello
*
类型:
请选择类型
问题质量差
垃圾广告信息
偏离社区主题
违规内容
不友善内容
与社区已有问题重复
以上选项都不是
*
详细原因:
取消
提交
x
收藏成功!点击
我的收藏
查看收藏的全部帖子