【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大神指正。 上传一份工程文件+头文件。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:1
heaton426 2017-05-31
棒棒哒
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子