C语言写程序注意,单片机C语言编程应注意的若干问题

作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对用编程者来说具有十分重要的意义。本文引用地址:http://www.eepw.com.cn/article/171801.htm

1 单片机C语言主要特点

用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能[1],这样可使整个应用系统程序结构清晰,易于调试和维护。不同的功能模块,分别指定相应的入口参数和出口参数,对于一些要重复调用的程序一般把其编成函数,这样可以减少程序代码的长度,又便于整个程序的管理,还可增强可读性和移植性。

在实际单片机程序设计中,程序结构一般均采用如下结构:

#includereg51.h> /*头文件说明部份*/

unsigned char x1,x2; /*全局变量声明部份*/

…Function1(… ){ /*功能函数定义部份*/

……     }

main() {

inti,j; /* 整型变量声明部份*/

Function1(…); /* 功能函数说明部份*/

……}

2 单片机C语言与标准C语言的区别

由于现在越来越多的产品都采用单片机开发,所完成的计算和控制工作也日趋复杂,但是单片机系统是一种资源十分有限的系统,这主要表现在程序存储器资源的不足,因此在程序设计时如何使用好这些有限的资源就显得十分重要。用C语言编程虽然具有许多的优点,但是生成的代码相对要长,要是编程技术不好,生成的代码甚至有可能比汇编语言生成的代码长几倍,因此对编程者来说,应该注意到单片机C语言和一般意义上的标准C语言的区别,对程序进行适当的优化。

2.1 数据类型的选用

单片机C语言编程不同于一般的C语言编程的显著的一个特点,就是要和程序存储器资源结合起来,虽然其提供的数据据类型十分丰富,但是只有bit和char 等数据类型是是机器语言直接支持的数据类型,用此类数据类型的语句所生成的代码较短;而其它的数据类型如整型、浮点型等数据要有一定的内部程序或内部函数的支持,相对来说用该类数据类型的语句生成的代码要长。有些C语言程序表面上看起来十分的简单,但在在实际编译时,生成的代码却相当长。因此我们要按照实际需要,合理地选用数据,可以大大的减少所生成的代码长度。例如在C51中每种数据类型变量所占用存储器字节数和经编译后生成的代码长度如表1所示:

23a5b538400e57bff33a838f688f4ba3.png

表1 不同数据类型占用存储器字节数和代码长度对比

通过表1我们知道,不同的数据类型所生成的机器代码长度相差很多,相同类型的数据类型有无符号对机器代码长度也有影响。在程序编译时生成机器代码长的数据类型的优先级越高,不同的数据类型在进行程序运算时要转化为高优先级的的数据类型,相应的代码长度也会增长[2]。因此我们应尽可能地使用 bit,char等机器语言直接支持的数据类型,无符号数的变量应声明为无符号数,尽可能地减少程序中使用的数据类型的种类。

2.2 算法设计问题

单片机C语言和标准C语言存在着很大差别,在计算机上进行C语言程序设计时由于不必考虑程序代码的长短,只需考虑程序功能实现,但是在单片机上进行C语言程序设计就必须考虑系统的硬件资源。有时并不是程序的算法越简单、长度越短越好,因为有一些算法要调用一些内部的子程序和函数,生成的机器代码长度非常长。不同的算法对程序代码长度影响十分大,因此在进行程序设计时,就尽量采用程序生成代码短的算法,在不影响程序功能实现的情况下可以采用一些优化算法 [2]。

在单片机C语言编译成机器代码时,不同的运算生成的机器代码的长度相差很大,尽可能地减少程序中对某种数据类型的运算种类,越复杂的数据类型效果越明显。在进行数据计算时,在一定的精度范围内,可以用一些近似的计算来完成一些运算,既不损失精度又能减少大量的代码。比如:用逻辑AND/取模比MOD/%操作更有效。

在用热敏电阻测量温度时,可根据热敏电阻—温度特性公式来求值。数学表达式表示为:

RT=RT0expB(1/T-1/T0)

如果直接按照公式温度时程序结构简单,算法复杂度不高,但是程序将调用Math.h>文件中的对数函数,在编译成机器码时函数有1K多字节,对于一般只有几K字节的单片机系统来说,这是十分不合适的。考虑到系统资源问题可以用一种替代方法—查表法来实现算法。只要给出一定温度范围内不同温度值对应热敏电阻的电阻值,然后建立表格,只要按照系统求出的阻值,进行查表,插值,就可以求出相应的温度值。这种算法相比前面的的公式法的算法复杂高,C语言程序代码也长,但在编译成机器码时,代码长度却很短,只有一、二百字节。

3  数据存储器的分配

单片机内部数据存储器RAM只有几百字节,如果扩展外部存储器RAM来提高数据存储量话必将会增加了硬件成本,使系统更加的复杂,访问外部存储器比访问内部存储器所需的代码也要长得多。有效地使用片内存储器、提高存储器空间的利用率对开发者来说十分关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现将日志信息存到TXT中

在java文件操作的时候,思考将日志信息存到txt中,现在很多项目都是通过log4j来做的,同样也会用到将日志存到txt中. package FileOperation;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Calenda…

接口返回的类型是html页面_1.10 PhalApi 2.x 接口文档

接口文档在线接口文档PhalApi提供一些非常实用而又贴心的功能特性,其中最具特色的就是自动生成的在线可视化文档。在线接口文档主要分为两大类,分别是: 在线接口列表文档在线接口详情文档当客户端不知道有哪些接口服务,或者需要查…

c语言变量相等问题穷举法,C语言穷举法经典例题.ppt

《C语言穷举法经典例题.ppt》由会员分享,可在线阅读,更多相关《C语言穷举法经典例题.ppt(18页珍藏版)》请在人人文库网上搜索。1、枚举法(穷举法),“笨人之法”: 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。,分…

jmeter数据库负载测试_JMeter:负载测试关系数据库

jmeter数据库负载测试Apache JMeter是完全使用Java编写的性能测试工具。 可以在请求/响应模型上运行的任何应用程序都可以使用JMeter进行负载测试。 关系数据库也不例外:接收sql查询,执行查询并返回执行结果。 我将向您展示使用JMeter的图形用户界面设置…

python requests编码的问题_python requests 编码问题

url host pathheaders {...}data {...}files {...}files两种类型: 字典和 元组{"field1" : ("filename1", open("filePath1", "rb")),"field2" : ("filename2", open("filePath2", "rb"…

图片热区map-area

自适应图片热区坐标&#xff1a; html: <div id"imgContainer" > <img src"../../assets/flow_chart.jpg" id"flowImg" alt"流程图" style"width:100%;height:100%;" usemap"#flowChartImg"> <…

c语言编程计算人口增长模式转变示意图,读“人口增长模式及其转变示意图”,回答下列问题。(5分)(1)图中字母代表的人口增长模式是:A____________、B____...

读“人口增长模式及其转变示意图”&#xff0c;回答下列问题。(5分)(1)图中字母代表的人口增长模式是&#xff1a;A____________、B____更多相关问题According to your textbook, the following statement is an example of __________. "when Tiger Wo键盘输入一个班n个学…

具有Couchbase,Java EE和WildFly的CRUD Java应用程序

Couchbase是一个开源的NoSQL文档数据库。 它允许访问&#xff0c;索引和查询JSON文档&#xff0c;同时利用集成的分布式缓存来实现高性能的数据访问。 开发人员可以使用不同的语言&#xff08;Java&#xff0c;Go&#xff0c;.NET&#xff0c;Node&#xff0c;PHP&#xff0c;…

python定时下载链接_python定时下载FTP指定文件

公司正好有个需求&#xff0c;定期从远端ftp下载指定昨天的数据&#xff0c;写了2个函数&#xff0c;一个是连接远端ftp&#xff0c;另一个是定期下载远端数据&#xff0c;用到了ftplib、datetime和正则re三个模块1.ftplib:连接和下载ftp数据2.datetime:指定下载日期--每天的前…

c语言10个人 三向成绩,C语言入门学习精华:这样学习C语言最有效

C语言入门学习精华&#xff1a;这样学习C语言最有效c语言死了吗&#xff1f;本材料描述了使用C语言的高级技能&#xff0c;并努力将您的C语言能力从“基本”提升到“高级”。然而&#xff0c;学习态度比学习方法要好。在正式学习之前&#xff0c;有一个问题是不能抱怨的。也就是…

jQuery UI全教程之一(dialog的使用教程)

jQuery UI目前的版本已经更新到了1.8.7。个人感觉和easyui相比起来&#xff0c;jQuery UI在界面的美观程度和可定制型更强一些。所以再次将一些jQuery UI组件的用法说明一下&#xff0c;方便日后查阅。也方面没接触jQuery UI的人能早日使用jQuery UI套件 (一)首先来说jQuery UI…

python使用redis做缓存_Python中的Redis客户端缓存(二)

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。处理失效无效消息如何发送到被追踪的客户端取决于客户端正在使用的Redis序列化协议(RESP)。早期版本的Redis使用RESP2&#xff0c;但是它的后续版本RESP3已经存在于Redis 6中&#xff0c;…

c语言中有哪些函数关系,C语言中有哪些常用的函数

C语言中有哪些常用的函数发布时间&#xff1a;2020-11-17 17:01:32来源&#xff1a;亿速云阅读&#xff1a;107作者&#xff1a;小新这篇文章主要介绍C语言中有哪些常用的函数&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一定要…

akka es/cqrs_在Akka中实现主从/网格计算模式

akka es/cqrs主从模式是容错和并行计算的主要示例。 模式背后的想法是将工作划分为相同的子任务&#xff0c;然后将其委派给从属。 这些从属节点或实例将处理工作任务&#xff0c;并将结果发送回主节点。 然后主节点将编译从所有从节点接收到的结果。关键是从节点仅知道如何处理…

05 HTML字符串转换成jQuery对象、绑定数据到元素上

1 要求 将一段 HTML脚本 封装成一个字符串&#xff0c;将这个字符串转换成一个jQuery对象&#xff1b;然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str <div id"box01">hello world</div>; //定义一个字符串 利用jQuery框架将字符…

python迭代器使用_Python迭代器的用法

我们在前面使用过语句“for x in列表对象”&#xff0c;这就表示列表对象是可迭代的(Iterable)。那么如何判断某个对象是否可迭代呢&#xff1f;答案是可以使用collections.Iterable类来判断。如下面的代码所示&#xff0c;列表是可迭代的&#xff0c;整数是不可迭代的&#xf…

c语言求佩尔方程的解设计思路,c语言版 佩尔方程求最小正整数解及第k解(矩阵快速幂)...

佩尔方程讲解连接&#xff1a;若一个丢番图方程具有以下的形式&#xff1a;且为正整数&#xff0c;则称此方程为佩尔方程(英文&#xff1a;Pells equation 德文&#xff1a;Pellsche Gleichung) 若是完全平方数&#xff0c;则这个方程式只有解(实际上对任意的&#xff0c;都是解…

在Java EE 7中自动配置JMS资源

JMS 2.0&#xff08;Java EE 7平台的一部分&#xff09;引入了许多不错的功能 。 其中之一是能够声明JMS资源以进行自动部署。 Java EE 7之前的版本 使用Resource注入连接工厂 使用Resource查找目标位置&#xff08;队列/主题&#xff09; 拉出Session对象并使用它创建Messa…

python关键词提取源码_Python 结巴分词 关键词抽取分析

关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期&#xff0c;当时还不支持全文搜索的时候&#xff0c;关键词就可以作为搜索这篇论文的词语。因此&#xff0c;目前依然可以在论文中看到关键词这一项。除了这些&#xff0c;关键词…

安卓欢迎界面和activity之间的跳转问题

使用安卓的UI界面&#xff0c;就不得不了解activity&#xff0c;由于actvity就像是一个form表单一样&#xff0c;全部的UI都呈如今这里&#xff0c;他能够承载全部的UI控件。INtent就是一个中继站一样。他负责组件之间的沟通。以下我们来说一下一个actvity跳转到还有一个actvit…