由于嵌入式技术的发展 ,嵌入式 web 服务器软件越来越大 ,对硬件的要求也相应地提高 ,但在工业现场的底层控制中 ,一般嵌入式系统的硬件配置都不是很高 ,导致了软件和硬件的冲突。本文就是对实际应用过程中 ,偶尔出现的 web 页面访问出错问题进行深入的研究。
1 嵌入式 web 在系统中的应用
多支点触发系统包括以下几个模块 : 控制台模块、网络触发源模块、被触发设备模块。其中 ,网络触发源和被触发设备都是挂载在总线上的 通过现场总线可以将系统各个节点相互连接起来以方便管理。嵌入式 web 就是应用于网络触发源模块中 ,它负责控制台和被触发设备之间的通信。控制台通过浏览器访问网络触发源 ,在 web 页面上完成相应控制操作后 ,由网络触发源把操作命令发送到总线上 ,被触发设备从总线上接收到命令后 ,完成相应操作。在网络触发源模块中 ,web 服务器采用的是 boa ,嵌入式操作系统采用的是 uclinux ,处理器采用的是 sam2sung 公司的 s3c44b0。多支点触发系统结构如图 1 所示。
2 boa 的运行流程及出现的问题
boa 是单任务的 http 服务器 ,源码开放 ,性能高。与传统的 web 服务器不同 ,它并不对每个进入服务器的连接开辟新的进程 ,所有活动的 http 连接都在内部进行处理 ,而只为每个 cgi 连接启动新进程。在已进行的测试中 ,boa服务器比其他的 web 服务器要快 ,所以它应用在嵌入式系统中是具有良好前景的。图 2 是 boa 基本的运行流程 。
在 boa 运行过程中 ,用户请求初始 lo2gin 页面时 ,系统能正常响应操作。当用户输入正确的 login 信息 , 要实 现页 面跳 转时 , pc 机上的浏览器里面不能正确浏览 ,提示错误“: 502 bad gate2way the cgi was notcgi/ 1. 1 compliant ”。由于运行的是 cgi 程序 ,通过调试和查看错误日志 ,发现系统停留在步骤 ⑤~ ⑦间。在排除 cgi 程序错误后 ,通过串口调试终端打印出的错误信息发现 :在执行 cgi 程序时 ,内核申请内存时出错 ,提示申请的内存块不能得到 ,即内存丢失。
3 系统内存丢失分析
3. 1 uclinux 的内存管理
uclinux 不能使用处理器的虚拟内存管理技术 ,它仍然采用存储器的分页管理。系统启动时对存储器分页 ,加载应用程序对程序分页加载。由于没有 mmu 管理 ,所以uclinux 采用实存储器管理。uclinux 系统对内存的访问是直接的(它对地址的访问不经 mmu ,而是直接送到地址线上输出) ,所有程序访问的地址是物理地址。那些比物理内存还大的程序将无法执行[2 ] 。
uclinux 将整个物理内存划分成为 4 kb 的页面。由数据结构 page 管理 ,有多少页面就有多少 page 结构 ,它们又作为元素组成数组 men_map 。物理页面可作为进程代码、数据和堆栈的一部分 ,还可存储装入的文件 ,也可作缓冲区。
3. 2 内存丢失原因
由于 uclinux 提供了跟普通 linux 一样的内存分配器 ,普通 linux 中缺省的内存分配器是使用“2 的幂”的分配方法 ,这样可以快速找到符合要求的内存区域。
在系统开发过程初期 ,采用的就是“2 的幂”的分配方法。如果一个应用程序要求( x) kb 内存空间进行装载 ,则实际使用占用的内存空间大小为 y = 2m( y ≥x) 。试想一个 65 kb 应用程序 ,如果按照“2 的幂”的分配方法 ,就必须分配 128 kb (2 的 7 次方) 的内存空间 ,这样就有63 kb的内存空间不能被利用上。这对于小内存的嵌入式系统来说是相当大的浪费。
多支点触发系统运行时 ,嵌入式操作系统 uclinux 使用“2 的幂”的内存分配方法 ,大多数情况下都能正常工作。但在不断反复测试中 ,偶尔会出现上述页面出错问题。错误的原因是不能获得足够的内存加载程序。通过调试终端 ,用free 命令查看系统内存分配情况如表 1 所列。
由表 1 可以看出 ,空闲的内存空间还有 1560 kb ,而应用程序所需的内存空间为 400 多 kb ,但是内核认为并没有足够的内存空间用来加载程序。例如一个系统内存大小为1 mb ,有 400 kb 的空闲内存 ,为了装载一个应用程序需要分配 100 kb 的空间。大家可能觉得这个需要肯定能得到满足 ,然而 ,由于 uclinux 必须给应用程序分配连续内存空间的特性 ,所以必须有 100 kb 连续的内存空间才能满足这个需要。而当系统内存分配如图 3 所示时 ,最大的连续内存块的大小只有 80 kb ,这样是没有办法分配给这个应用程序的。这就是系统中页面访问出错的问题所在 ,虽然有足够的空闲内存空间 ,但是没有应用程序所需的连续内存空间。
这就是内存丢失问题。虽然系统会显示大量的可用内存 ,但是应用程序却不能得到。
4 内存丢失问题的解决
由于系统的内存管理默认采用“2 的幂”的分配方法 ,这就造成了内存空间的巨大浪费 ,当某些应用程序要申请较大的连续空间时 ,却不能满足。为了解决这个问题 ,专门为 uclinux 内核设计了可选的内存分配器。不同的内核版本 ,这个可选的内存分配器不同 ,一般是 page_alloc2和 kmalloc2。
page_alloc2 能解决缺省的分配方法造成的浪费问题。虽然它也是使用“2 的幂”的分配方法 ,但它是按页(每页4 096b ,即 4 kb) 分配的 ,分配的内存大小如果已经满足了要求 ,则只是将当前的一页分配出去 ,其他的就不再分配。还是一个 65 kb 的应用程序 ,如果使用这种方法 ,就只是分配 68 kb( ≥65 kb ,且为整页) 即可 ,这样就能节省60 kb 的空间。
page_alloc2 还采取了一些避免内存碎片的方法。它将所有的两页(8 kb) 或更少的内存需求从空闲内存开始部分向上分配 ,所有大的内存需求从剩余内存的末尾部分开始向下分配。这样防止了网络缓存等的临时分配 ,避免了内存碎片的出现。同时 ,它支持一次申请超过 1 mb 的内存空间 ,这对一些大的应用程序是很好的支持。
采用此方法后 ,在系统运行过程中 ,并未出现过页面访问出错问题。通过 free 命令查看内存分配如表 2 所列。
结语
在嵌入式系统应用日益广泛的情况下 ,本文结合嵌入式 web 在多支点触发系统中的应用 ,介绍了 web 访问出现的问题以及它的解决方法。在实际应用中 ,新的内存分配方法能让系统稳定地工作 ,但是从表 2 可以发现 :采用“page_alloc2”的内存分配方法时 ,系统的 cache 较小 ,这就造成了页面访问有一定的延时。而“2 的幂”的分配方法 ,系统的 cache 较大 ,访问速度较快。从这个对比得知 ,在反应时间要求不是很高的情况下“, page_alloc2”的内存分配方法更适合小内存的嵌入式系统 ;而“2 的幂”的分配方法更合适那些内存足够大的嵌入式系统。系统开发者可以根据实际情况采用不同的方案。
安博会首日:海康威视终揭神秘面纱
Maxim推出电池反接及过压保护控制器MAX16914/MA
【大神课堂】如何完美避过嵌入式的深坑
区块链技术的特征及应用前景分析
“梦之墨杯”第七届全国大学生工程训练综合能力竞赛黑龙江省选拔暨国赛测试赛圆满落幕
嵌入式Web访问时的内存丢失问题解析
Telit提供LTE Cat. M1组合模块,让物联网应用能够实现更好的节能
银行为什么会对加密货币、比特币深恶痛绝?
博世CAN XL协议解决方案应用
腾讯阿里云市场争夺升级 全球化竞争比拼生态
电话机器人有什么用,它主要有哪些优点
FPC企业奈电的运营和产品转型逐步向好发展
为低压便携设备背光应用选择适合的LED驱动器方案
双麦定向拾音束回音消除及远场拾音降噪模块 A-68
6A 小封装直流有刷马达驱动 | TMI8270,助力全自动智能锁:推门即入,省力首选!
智能控制系统迎来黄金增长期
FLIR携众多新品亮相2023慕尼黑上海光博会
通过与英特尔技术相结合 FPGA可以更好地充分释放数据的巨大潜能
TI音频创新日:PCM186x与转换器的特点应用介绍
存储价格最快明年下半年将全面上涨