提高系统移植性
《系统与软件可移植性》标准中可移植性定义的研究

万方数据万方数据万方数据万方数据万方数据《系统与软件可移植性》标准中可移植性定义的研究作者:张倩, 袁玉宇, 张旸旸作者单位:张倩,袁玉宇(北京邮电大学软件学院), 张旸旸(中国电子技术标准化研究所)刊名:信息技术与标准化英文刊名:INFORMATION TECHNOLOGY & STANDARDIZATION年,卷(期):2009,(10)引用次数:0次1.周明德,冯惠,王有志,等.GB/T 11457信息技术软件工程术语[S].北京:中国标准出版社,2006.2.乔丽萍,田军.软件可移植性的度量[J].微电子学与计算机,2003(增刊):51-54.3.Prof.Motoei AZUMA.ISO/IEC 9126 Software Engineering-Product Quality-Partl:QualityModel[S].Switzerland:International Organization for Standardization,2002.4.Prof.Motoei AZUMA.ISO/IEC FCD 25010 Systems and software engineering-Software product Quality Reauirements and Evaluation(SQuaRE)-Quality models for software product quality and system quality in use[S].Switzerland:International Organization for Standardization,2009.5.李娜娜,吴鹏.软件可移植性工程与度量[J].情报科学,2005,23(2):269-270.1.学位论文肖永刚基于软件的三维实时渲染算法测试平台的研究与开发2005随着实时计算机图形学的发展,其应用领域越来越广。
容器化设计:利用容器技术提高应用的可移植性和可扩展性

容器化设计:利用容器技术提高应用的可移植性和可扩展性引言:容器化技术近年来在软件开发和部署中得到了广泛应用。
通过将应用程序及其所有依赖项打包到一个独立的容器中,容器化设计能够提供更高的可移植性、可扩展性和效率。
本文将探讨容器化设计的基本原理和优势,并介绍如何利用容器技术提高应用的可移植性和可扩展性。
第一章:容器化技术概述1.1 容器化技术的定义和原理容器化技术是一种虚拟化技术,它通过在操作系统层面创建独立的、轻量级的运行环境来运行应用程序。
与传统的虚拟机相比,容器化技术更加轻量级,因此更加高效。
1.2 容器化技术的主要优势容器化技术具有以下几个主要优势:- 可移植性:容器化设计使得应用程序及其所有依赖项可以被打包成一个独立的容器,这意味着应用程序可以在不同的环境中运行,而不需要重新配置和安装依赖项。
- 可扩展性:通过将应用程序的各个组件打包成容器,可以方便地进行水平扩展,以满足不同的负载需求。
- 效率:容器化技术可以减少资源的浪费,提高资源的利用率。
第二章:提高应用的可移植性2.1 使用容器镜像容器镜像是容器化设计中的核心概念,它是一个只读的应用程序及其依赖项的文件系统。
通过使用容器镜像,可以将应用程序及其所有依赖项打包成一个独立的、可移植的单元。
2.2 容器编排工具容器编排工具可以帮助我们将应用程序及其所有依赖项在不同的环境中进行部署和管理。
例如,Kubernetes是一个广泛使用的容器编排工具,它可以自动进行应用程序的部署、伸缩和监控。
第三章:提高应用的可扩展性3.1 水平扩展容器化设计使得应用程序的各个组件可以独立打包成容器,从而方便地进行水平扩展。
通过增加容器的数量,可以快速地满足不同的负载需求。
3.2 自动伸缩容器编排工具可以自动监测应用程序的负载情况,并根据设定的策略进行自动伸缩。
这样可以最大程度地提高应用程序的性能和资源利用率。
第四章:容器化设计的最佳实践4.1 使用适合的容器镜像在进行容器化设计时,应选择适合的容器镜像。
软件系统的可维护与可移植性设计

软件系统的可维护与可移植性设计在当今快速发展的科技时代中,软件系统已经成为了各行各业不可或缺的一部分。
不同的软件系统虽然具有不同的功能和应用场景,但是它们之间都有一个共同的特点——需要进行维护和升级。
因此,软件系统的可维护性和可移植性设计是非常重要的一环。
软件系统的可维护性设计需要从多个维度进行考虑。
首先,要保证软件系统的代码质量。
代码质量的好坏直接影响到软件系统的可维护性。
高质量的代码能够提高软件的可扩展性,使得开发者在维护和升级过程中更加容易进行修改。
代码中要注意规范化和注释,避免出现冗余代码和重复性工作。
其次,软件系统的架构也需要符合可维护性设计。
良好的架构可以让软件系统具有一定的弹性,随着需求的变化和技术的进步可以有效的进行升级和维护。
最后,软件系统的文档也需要详细、清晰地描述系统的功能、模块、接口、参数等信息。
这样一来,可以帮助开发者更好地了解系统的整体架构和维护需要。
除了软件系统的可维护性设计,软件系统的可移植性设计同样重要。
所谓可移植性,指的是软件系统在不同的平台、环境下运行时的稳定性和兼容性。
为了实现软件系统的可移植性设计,需要从以下几个方面进行考虑。
首先,要遵循标准化的开发规范,尽可能使用公认的标准软件库和代码编写规范。
这样可以保证软件代码在不同系统上的兼容性。
其次,需要在系统架构设计阶段就考虑到不同平台和环境的差异和限制。
对于常规操作系统,如Windows、Linux、Mac OS等,软件系统的移植性问题可以通过使用跨平台的编程语言、框架和中间件来解决。
对于嵌入式设备等特殊场景,需要根据不同硬件平台的特点进行定制化开发。
在实际开发中,软件系统的可维护性和可移植性设计需要与软件系统的功能需求、性能需求、安全需求等其他方面的设计相互协调。
例如,在进行软件系统的功能需求分析时,应该考虑到这些功能对软件系统的可维护性和可移植性的影响。
在进行软件系统的性能优化时,也要综合考虑到软件系统的可维护性和可移植性问题。
技术规范的可移植性要求

技术规范的可移植性要求随着科技的快速发展和全球化的加强,技术规范的可移植性要求日益受到关注。
可移植性是指软件、硬件或系统能够在不同的环境中进行迁移和重用的能力。
在这篇文章中,我们将探讨技术规范中的可移植性要求以及其重要性。
一、可移植性的定义与分类可移植性是指技术规范能够在不同的平台、操作系统或设备上运行的能力。
它可以分为以下几种类型:1. 软件可移植性:软件可移植性是指软件应用程序能够在不同的操作系统、编程语言或硬件平台上运行的能力。
这要求软件开发人员采用标准化的接口和协议,以确保应用程序能够在各个平台上无缝运行。
2. 硬件可移植性:硬件可移植性是指硬件设备能够在不同的操作系统或平台上实现互操作性的能力。
这要求硬件制造商遵循标准化的接口规范,以提供兼容性和可替代性。
3. 数据可移植性:数据可移植性是指数据能够在不同的应用程序、数据库或系统之间迁移和共享的能力。
这要求数据格式和结构的一致性,以便不同的系统能够正确地解读和处理数据。
二、技术规范的可移植性要求技术规范的可移植性要求是指在制定技术规范时要考虑和定义的可移植性需求。
以下是技术规范中常见的可移植性要求:1. 平台依赖性要求:技术规范应尽量避免对特定平台或操作系统的依赖,以确保规范的跨平台和跨系统兼容性。
2. 标准接口要求:技术规范应定义标准接口和协议,以便不同的系统或设备能够通过这些接口进行通信和交互。
这样,即使在不同的环境中,系统之间也能够实现无缝的集成和互操作性。
3. 数据格式要求:技术规范应定义标准的数据格式和结构,以便不同的系统能够正确地解析、处理和共享数据。
这样可以避免数据的丢失或错误,保证数据在不同系统之间的流动和共享。
4. 可扩展性要求:技术规范应具备良好的可扩展性,能够适应技术发展和需求变化。
规范应允许新技术的集成和新功能的添加,以便在未来的环境中能够保持兼容性和可移植性。
三、可移植性的重要性技术规范的可移植性对于推动技术发展和促进跨平台合作具有重要意义。
嵌入式练习题附部分答案

B.协作图
C.类图
D.状态图
35.RS-232(串行通信总线的电气特性要求总线信号采用
A.正逻辑
B.负逻辑
C.高电平
D.低电平
##
36.编译程序对高级语言进行编译时,需要该程序的地址空间中为变
量指定地址,这种地址成为。
A.逻辑地址
B.物理地址
C.接口地址
D.线性地址
##
37.的做法不利于嵌入式应用软件的移植。
存在的整体/部分形式的关联关系。
A.依赖关系
B.聚合关系
C.泛化关系
D.实现关系
##
27.下面不是操作系统中调度程序所采用的调度算法。
A.先来先服务(FCFS)
B.先进先出(FIFO)
C.时间片轮转调度
D.优先级调度
##
28执行C程序代码int a=1,b=0,c=0;int d=(++a)*(c=1);后,a,b,c,d的 值分别为。
C.形参变量所占用的内存单元位于堆中
D.如果形参是数组名,则传递的是每个数组元素的值
56.以下关于硬件抽象层的论述,不合适的是(
A.采用硬件抽象层可以大大提高系统的移植性
B.采用硬件抽象层可以大大提高系统的运行效率
C.采用硬件抽象层可以缩短系统的测试周期
D.采用硬件抽象层有助于提高系统的可靠性
##B
B.提供描述文件抽象的程序接口
C.文件存储在磁盘或其他不易失的存储介质上
41.在过程式程序设计(①)、数据抽象程序设计(②)、面向对象程
序设计(③)、泛型(通用)程序设计(④)中,C++语言支持
A.①
B.②③
C.③④
如何使用软件系统运维技术提高系统更新效率

如何使用软件系统运维技术提高系统更新效率在当今信息技术高速发展的时代,软件系统运维技术的不断提升变得尤为重要。
随着软件的快速更新迭代和用户对系统稳定性和性能的要求不断提高,如何提高系统更新效率成为众多企业和组织关注的焦点。
本文将从软件系统运维技术的角度出发,介绍如何利用现代化的技术手段来提高系统更新效率。
首先,要提高系统更新效率,我们需要借用持续集成与持续交付技术(CI/CD)。
持续集成是指开发人员在软件代码的日常开发过程中,将代码频繁地合并到共享存储库中,自动构建并运行测试来检查更新。
持续交付则是指将通过持续集成阶段的软件成功提交到预发布环境中,为发布做好准备。
通过CI/CD技术,可以有效地管理软件开发的版本控制,实现自动化构建、测试和发布,大大加快系统更新的速度。
其次,优化系统更新的策略也是提高系统更新效率的关键。
系统更新需要考虑到用户的需求、系统的稳定性和性能,并且需要合理安排更新的时间和频率。
一方面,可以根据用户反馈和数据分析来确定更新的重点和优先级,确保系统更新能够满足用户的需求。
另一方面,可以通过灰度发布的方式来降低系统更新对稳定性的影响,先将更新应用于少量用户中进行测试,再逐渐扩大范围,确保系统稳定性和性能不受影响。
此外,使用自动化运维工具也是提高系统更新效率的重要手段之一。
自动化运维工具可以帮助我们实现对系统更新的自动化管理和操作,减少人为的操作失误和重复工作。
通过自动化运维工具,我们可以快速地部署、配置和监控系统更新,提高运维效率和稳定性。
例如,可以使用自动化配置管理工具,如Ansible和Puppet,来实现服务器的自动化部署和配置;可以使用自动化测试工具,如Selenium和Jenkins,来实现系统更新的自动化测试和验收。
此外,利用云计算和容器化技术也可以提高系统更新效率。
云计算可以提供弹性的计算资源,能够帮助我们快速地扩展系统性能和容量,实现系统的高可用和高性能。
容器化技术可以将应用程序和其依赖项打包到一个独立的容器中,并在不同的环境中运行,从而提高系统的可移植性和部署效率。
嵌入式操作系统的可移植性和安全性研究
嵌入式操作系统的可移植性和安全性研究随着嵌入式设备越来越多,嵌入式操作系统所占据的市场份额也逐渐加大。
嵌入式操作系统是一种高度集成的操作系统,它们旨在为嵌入式设备提供完美的软件环境,以满足各种不同的应用需求。
然而,由于硬件平台,软件驱动程序,应用程序和网络协议等方面的不同,嵌入式操作系统的可移植性变得至关重要。
同时,对于嵌入式设备领域,安全问题也愈加引人关注。
因此,研究嵌入式操作系统的可移植性和安全性对于这个行业至关重要。
一、可移植性可移植性是指嵌入式操作系统在不同硬件平台之间以及不同开发环境之间的能力。
高度可移植的嵌入式操作系统必须在各种硬件平台上得到广泛的测试和验证,包括各种处理器架构和处理器类型,不同类型的存储器,输入/输出设备和网络接口控制器等等。
此外,它们必须能够在不同的开发平台上进行构建和运行,如编译器和调试工具。
为了解决嵌入式操作系统的可移植性问题,人们提出了很多的解决方案。
例如,间接层或虚拟机技术可以将嵌入式操作系统与硬件平台分离,以便更容易地移植到其他硬件平台上。
这种方法可以帮助维护同一代码库,从而使代码简洁,易于维护。
此外,模块化系统和结构化设计也可以帮助提高嵌入式操作系统的可移植性。
另外,也有一些开源的嵌入式操作系统,如FreeRTOS、uC/OS、Linux嵌入式和Contiki,这些操作系统都具有高度的可移植性。
这些操作系统具有强大的社区支持,可以提供广泛的硬件平台支持,同时还提供各种工具和示例代码,方便开发人员在不同的平台上方便地移植代码。
二、安全性安全是嵌入式设备设计中最为关键的问题之一。
因为这些设备往往被用作网络交互,存储及处理重要数据,一旦这些设备被攻击,后果很严重,比如数据泄露、信息黑客等。
同时,高度集成的嵌入式操作系统和硬件架构也使它们更容易受到攻击。
因此,嵌入式操作系统必须有强大的安全机制来防止各种攻击。
一般来说,嵌入式操作系统的安全机制包括几个方面,如数据加密、网络安全、系统审计和访问控制。
彩票系统技术升级方案
彩票系统技术升级方案引言随着科技的发展和用户需求的不断增长,彩票系统的技术升级变得越来越重要。
通过技术升级,可以提升彩票系统的性能、安全性和用户体验,并且为未来的功能扩展提供支持。
本文将介绍彩票系统技术升级方案,包括系统架构改进、数据库优化、性能优化、安全性提升等方面。
系统架构改进为了适应彩票系统的增长和扩展,需要进行系统架构的改进。
以下是几个改进方向:1.微服务架构:将彩票系统拆分为多个微服务,每个微服务负责一个特定的功能模块。
微服务架构可以使系统更加灵活、可扩展,并且方便团队并行开发和持续交付。
2.异步通信:使用消息队列等技术来改进系统内部的通信方式。
通过异步通信,可以降低系统之间的耦合度,提高系统的可靠性和可伸缩性,并且优化用户体验。
3.容器化部署:将彩票系统中的各个组件打包为容器,并使用容器编排工具进行部署和管理,如Docker和Kubernetes。
容器化部署可以提高系统的可移植性、可复用性和弹性。
数据库优化彩票系统的数据库是存储重要数据的关键组成部分,需要进行优化以提高系统性能和可靠性。
1.数据分区:根据数据的访问模式,将数据库分区为多个逻辑分区。
数据分区可以提高查询性能,并且可以更好地应对不同数据访问模式的需求。
2.索引优化:通过评估查询操作并优化索引设计,可以提高数据库查询的性能。
可以考虑使用复合索引、覆盖索引等技术来优化查询操作。
3.缓存:使用缓存来减少数据库访问的次数,提高系统性能。
可以使用内存数据库或者分布式缓存系统来实现缓存功能。
性能优化提升彩票系统的性能是用户体验的关键要素之一,下面是几个性能优化的方向:1.并发处理:通过引入并发处理机制,可以提高系统的并发处理能力。
可以使用线程池、异步处理等技术来实现并发处理。
2.延迟优化:分析系统中的瓶颈和性能瓶颈,并通过优化算法、减少IO等方式来降低系统的延迟。
可以使用性能测试工具来评估和分析系统性能。
3.负载均衡:通过引入负载均衡器,并合理分配系统资源,可以平衡系统压力,提高系统的可用性和性能。
系统验收标准
系统验收标准系统验收标准是指在软件开发过程中,对系统进行验收时所需要满足的标准和要求。
通过对系统验收标准的制定和执行,可以确保软件系统的质量和稳定性,提高系统的可靠性和安全性,保证系统能够正常运行和满足用户需求。
下面将从功能性、性能、安全性、可维护性和可移植性等方面对系统验收标准进行详细介绍。
一、功能性。
系统验收标准首先要求系统能够完整地实现所有的功能需求。
在验收过程中,需要对系统的功能进行全面的测试和验证,确保系统能够按照需求规格说明书中的要求进行操作和输出结果。
同时,还需要对系统的界面友好性和易用性进行评估,确保用户能够方便地使用系统,并且能够顺利完成各项操作。
二、性能。
除了功能性之外,系统验收标准还要求系统具有良好的性能表现。
在验收过程中,需要对系统的响应时间、吞吐量、并发性能等方面进行测试,确保系统在各种情况下都能够保持稳定的性能表现。
同时,还需要对系统的负载能力进行评估,确保系统能够在高负载情况下依然能够正常运行,不会出现系统崩溃或性能下降的情况。
三、安全性。
系统验收标准还要求系统具有良好的安全性能。
在验收过程中,需要对系统的数据安全、用户权限管理、系统漏洞等方面进行测试,确保系统能够有效地保护用户的数据安全,并且能够防范各种安全威胁和攻击。
同时,还需要对系统的备份和恢复能力进行评估,确保系统能够在发生意外情况下快速恢复,并且不会丢失重要数据。
四、可维护性。
系统验收标准还要求系统具有良好的可维护性。
在验收过程中,需要对系统的代码结构、注释规范、模块化程度等方面进行评估,确保系统的代码易于理解和维护。
同时,还需要对系统的修改和扩展能力进行测试,确保系统能够在需求变化时快速进行修改和扩展,不会影响系统的稳定性和性能。
五、可移植性。
最后,系统验收标准还要求系统具有良好的可移植性。
在验收过程中,需要对系统在不同平台和环境下的运行情况进行测试,确保系统能够在不同的操作系统、数据库和硬件平台上正常运行,并且不会出现兼容性问题。
基于框架理论的防误系统可移植性提高方法
W ANG Yo u ・ z h a o , H UAN G Do ng
( I n s t i t u t e o f A d v a n c e d D i g i t a l T e c h n o l o g y a n d I n s t r u me n t a t i o n , Z h @a n g U n i v e r s i t y , H a n g z h o u 3 1 0 0 2 7 , C h i n a ) [ A b s t r a c t ]T h e i m p o r t a b i l i t y o f o n l i n e mi c r o c o m p u t e r a n t i — d i s o p e r a t i o n s y s t e m ma k e s i t d i ic f u l t t o p r o p a g a t e i n d o m e s t i c e l e c t r i c p o w e r
c o mb i n a t i o n o f l f a m e t h e o r y a n d o b j e c t — o r i e n t e d l a n g u a g e V i s u a l c + + . i t b u i l d s t h e s o t f wa r e b a s e d o n t h i s s t r u c t u r e . T h e o u t c o m e o f t e s t s
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统程序可移植性设计及性能优化之三――函数设计――――函数设计【摘要】本章介绍了函数设计的一些基本规则。
合理对各种参数进行封装,不但有利于模块的交互,更能够减少参数提高函数调用性能。
其次介绍了模块划分的原则,如何减少模块间的耦合度。
接着分析了宏函数中参数的基本规则、多宏语句的基本规则、宏和内联的区别以及如何防止宏参数宏语句扩展后的异常效应。
最后介绍了如何利用const来进行输入参数的修饰及如何提高程序的可靠性。
【关键词】嵌入式,可移植性,函数设计,模块划分,耦合度,内聚性,内联,宏参数,const,输入参数,可靠性3 函数设计... - 15 -3.1 避免过多函数参数,提高调用性能... - 15 -3.2 合理设计模块,减小耦合度... - 16 -3.3 用宏函数提高时间效率... - 18 -3.3.1 宏参数的基本规则... - 18 -3.3.2 宏语句的基本规则... - 18 -3.3.3 宏的副作用... - 20 -3.4 Const修饰输入指针参数... - 21 -1 函数设计1.1 避免过多函数参数,提高调用性能在函数设计时通常需要传递参数,为了提供函数调用的性能,某些处理器如ARM会利用寄存器来传递参数,这样不需要访问内存,其访问效率更高。
但寄存器传递的参数数目有限,对于ARM体系是四个,当多于四个时,剩余的参数需要用栈传递,参数的出栈入栈都需要时间,调用性能下降。
当参数之间紧密相连且通常需要在多个模块中联合使用时,应对参数进行封装,这样便于参数的传递和变量的管理。
如:SYS_STATUS DCCM_SetSfnTsn(u16 u16SfnPeriod, u16 u16TsnPeriod, u16 u16Sfn, u16 u16Tsn, u32 u32TodPart1, u32 u32TodPart2)函数六个参数,对这些参数的解析在函数内部又要定义六个变量与之对应,这给变量的定义个管理带来了不便,如下:u16 g_u16DCCMSfn;u16 g_u16DCCMTsn;u16 g_u16DCCMSfnPeriod;u16 g_u16DCCMTsnPeriod;STRU_DD_TOD_INFO g_struDCCMTod;因此应将相关联的变量封装为结构体,优势在于:a) 便于管理、定义、声明,避免零散的变量;b) 意义明确,结构清晰;c) 函数调用时避免传递过多参数,提高函数调用性能,参数少不易出错;不足在于对于结构体的访问效率不如单独的变量,但此性能影响很小;为了代码更好的可读性、可移植可维护性性和可靠性,此处结构体的形式更合适。
MAT、CCM及MCP都需要用到此类信息,因此应单独提炼出结构体便于各模块的交互;模块间进行通信时要遵循一定的协议,即数据交互时要按照一定的数据格式进行传输,为防止各模块对格式的认识不统一,最好的方式是提供统一的数据结构的定义来进行数据收发BPP端封装为STRU_BPP_TOD_SFN_TSN_PARAMtypedef struct tag_STRU_BPP_TOD_SFN_TSN_PARAM{STRU_DD_TOD_INFO struTod;u16 u16SfnPeriod;u16 u16TsnPeriod;u16 u16Sfn;u16 u16Tsn;} STRU_BPP_TOD_SFN_TSN_PARAM;而MCP端对此结构的定义为typedef struct tag_STRU_DD_MCPBPP_TODTSNSFN_INFO{u32 u32TodPart1;u32 u32TodPart2;u16 u16SfnPrd;u16 u16TsnPrd;u16 u16SfnNum;u16 u16TsnNum;} STRU_DD_MCPBPP_TODTSNSFN_INFO;可以发现,原来BPP和MCP的MAT模块对时隙、子帧、TOD信息的处理并没有采取统一的方式,这样在交互时容易出现问题。
并且二者分别定义,有重复劳动。
1.2 合理设计模块,减小耦合度软件模块设计时需要合理划分模块的层次结构,提高内聚性,降低耦合度,引用全局变量会增强模块之间的耦合度。
如:DCCM模块定义了g_u16DCCMTsn、g_u16DCCMSfn等全局变量,调用DBSP模块实现的时隙回调函数DBSP_TslotCb();DBSP模块中DBSP_TslotCb()声明外部变量,通过全局变量引用g_u16DCCMTsn、g_u16DCCMSfn 等变量,并且在DBSP_TslotCb()内部只是读取了g_u16DCCMTsn、g_u16DCCMSfn的值。
因此更改函数形式,传递参数,而非引用全局变量;不更改参数值,采用值传递void DBSP_TslotCb (u16 u16Sfn, u16 u16Tsn)若DBSP_TslotCb不是由定义g_u16DCCMTsn、g_u16DCCMSfn等变量的DCCM模块调用,则必须声明外部变量然后引用,这种耦合是无法避免的。
另一个典型例子是资源的申请和释放。
在具备操作系统的嵌入式系统中,因为嵌入式系统的内存空间往往是十分有限的,定义过多的全局变量将导致系统内存大量减少,因为全局变量在程序的整个运行期间都占据着同块内存;另外栈空间也是有限的,若在函数内部定义大容量的数据结构时,很可能导致栈溢出。
上述两种情况都需要动态内存申请释放来解决,但不经意的内存泄露会很快导致系统的崩溃。
所以一定要保证你的malloc 和free 成对出现,如果你写出这样的一段程序:u8 * function(void){u8 *p;p = (u8 *)malloc(…);if(p==NULL)…;… /* 一系列针对p 的操作*/return p;}在某处调用function() ,用完function 中动态申请的内存后将其free ,如下:u8 *q = function();…free(q);上述代码明显是不合理的,因为违反了malloc 和free 成对出现的原则,即"谁申请,就由谁释放"原则。
不满足这个原则,会导致代码的耦合度增大,因为用户在调用function 函数时需要知道其内部细节!正确的做法是在调用处申请内存,并传入function 函数,如下:u8 *p=malloc(…);if(p==NULL)…;function(p);…free(p);p=NULL;而函数function 则接收参数p,如下:void function(u8 *p){… /* 一系列针对p 的操作*/}另外一些公用处理模块,为了满足各种不同的调用需要,往往在内部采用了大量的if-then-else结构,这样很不好,判断语句如果太复杂,会消耗大量的时间的,应该尽量减少公用代码块的使用,避免控制耦合。
1.3 用宏函数提高时间效率在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的实时性能,嵌入代码经常是必须的方法。
但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM空间。
使用这种优化在宏函数频繁调用并且只包含几行代码的时候,对提高运行效率是最有效的。
函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。
这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。
同时函数调用是要使用系统的栈来保存数据的。
因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。
而宏函数不存在这个问题,其只是在预处理的地方将预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,不需要额外时间方面的开销。
所以调用一个宏比调用一个函数更有时间效率,在频繁调用同一个宏函数的时候,该现象尤其突出。
1.3.1 宏参数的基本规则a) 在引用宏参数时必须括起来,如参数为A,则引用时(A);b) 若是宏表达式,则整个表达式必须括起来,如((A)+3);采用上述规则定义一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个,如下:#define MIN(A,B) ((A)<= (B) ? (A) : (B))参数和表达式都必须括起来是为了防止在宏参数替换后由于运算符优先级导致的问题,因为宏参数本身可以是表达式,而且当宏在表达式中展开时,你不知道表达式里还有没级别更高的运算1.3.2 宏语句的基本规则a) 对于多个语句一起构成的宏函数,必须保证在宏函数替换后其为一个完整的执行序列,即任何时候都是全部顺序执行完毕。
b) 宏语句的最后一句没有语句结束符“;”,而是在引用宏函数时添加。
如:#define MacroA if(conditon); \Sentence1#define MacroB sentence2; \Sentence3If(condition1)MacroA;ElseMacroB;则宏函数替换扩展后,如下:If(condition1)if(conditon)Sentence1;Elsesentence2;Sentence3;If(condition1){if(conditon)Sentence1;elsesentence2;}Sentence3;可以看出扩展后的结果和设计情况相差很远,最简单的解决情况是:任何if…else下面的语句都用“{}”括起来。
这样可以保证在宏函数扩展后不会出现异常。
If(condition1){MacroA;}else{MacroB;}If(condition1){if(conditon)Sentence1;}else{sentence2;Sentence3;}但顾客是上帝,我们不能要求使用我们的宏函数的用户任何时候都用“{}”来构造if…else语句,我们要本着“严于律己,宽以待人”的原则来设计我们的宏函数,这样就可以保证无论用户是否操作规范,我们总能达到他们的要求。
可有以下两种方式:1) Do….while(0)结构这是宏函数最常见的方式,如:#define DD_INIT_ISR_TIME_STATS(pstruIsrTime) do \{ \(pstruIsrTime)->u32IsrStartTestFlag = 0; \(pstruIsrTime)->u32IsrMinGapTime = C_DD_WORD_VAL_MAX; \ }while(0)本质上“{}”来保证多条语句为一个执行序列的,那么下列方式可以么?#define DD_INIT_ISR_TIME_STATS(pstruIsrTime) { \(pstruIsrTime)->u32IsrStartTestFlag = 0; \(pstruIsrTime)->u32IsrMinGapTime = C_DD_WORD_VAL_MAX; \}看似可以,实则不然,因为宏函数的规则是调用时将添加“;”,那么上述宏函数扩展后即为{(pstruIsrTime)->u32IsrStartTestFlag = 0;(pstruIsrTime)->u32IsrMinGapTime = C_DD_WORD_VAL_MAX;};最后一个“;”就是多余的,不能编译通过。