【C语言教程】嵌入式内存管理

零 C语言教程评论120字数 1123阅读3分44秒阅读模式

所需工具:

C++

聪明的大脑文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

勤劳的双手文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

 文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究。文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

 文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

前言:文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

本篇文章就简单介绍一下嵌入式端的一个内存管理;文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

一、Linux内核系统结构

主要分为五大模块:文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

在这里插入图片描述文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

本次主要讲解内存管理模块,其他模块不做介绍;文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/9655.html

二、查看Linux内存

在Linux环境下,可通过free -m查看内存使用情况;

下图是一台rk3326机器的内存情况:

在这里插入图片描述

Mem:表示物理内存统计;
total:表示物理内存总量(used + free);
used:表示总计分配给缓存(包含buffers与cache)使用的内存数量,但其中部分缓存并未实际使用;
free:未被分配的内存;
shared:内存共享;
buffers:系统分配但未被使用的buffers数量;
cached:系统分配但未被使用的cache数量;
-/+ buffers/cache:表示物理内存的缓存统计;
Swap:表示硬盘上交换分区的使用情况;

1.cache

cache的作用不同于buffer,它的速度极快,当进行底层优化的时,可能要编写基于cache的内存管理程序;它是直接与CPU交互的,不用走DDR;

思考以下哪种循环效率高:

[php]
// 第一种循环
int arr[10][100];

for (i = 0;, i < 10; i++)
for (j = 0; j < 100; j++)
arr[i][j] = 8;

// 第二种循环
for (i = 0; i <100; i++)
for (j = 0; j < 10; j++)
arr[j][i] = 8;

[/php]

从硬件层面来看,第二种的效率最高,因为内存的跳转相对少了很多,所以我们需要注意在嵌套循环中,尽量把大的循环写在内层;

2.buffer

buffer是缓冲区,作用是开辟一块地址空间,可以将程序需要用到的内存空间先开辟好,有了buffer可以避免在快速读写时候的问题;

cache和buffer的一个区别:

cache:把读取过来的数据保存起来,重新读取时若命中,则不需要再去硬盘读取;其中的数据会根据读取频率进行筛选,把频繁读取的数据放在最容易找到的位置,把不在读取的数据往后排,直到删除,这也是LRU缓存算法的原理;
buffer:是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能;

三、内存补齐

在很多嵌入式板子上都有内存对齐的处理;

思考下以下结构占用的内存:

[php]
struct A{
char a; // 1
char b; // 1
int c; // 4
}

[/php]

根据CPU的分配机制,在64位机器上占用8个字节,这也是做了一些对齐处理;

不仅仅是内存,一些板子(例如昇腾310)会对图像数据进行对齐,图像的分辨率要满足硬件支持的倍数,这样才能做到高效处理;

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/cyyjc/9655.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论