如何把两个流放之路安全组件下载在gridbagconstraints中放同一格中

一场Pokemon
Go,让全世界的小精灵师都暴露了。因此,在……
2016年初,一场人机大战点燃了人工智能芯片的争夺战,而……
今年,频频爆出摩尔定律将不再是制造工艺界的神话,虽说……
值农历新年佳节之际,很多半导体公司都借机召开了自己的……
21ic 2016年度采访之TE――将无人机与VR连接在一起
演讲人:彭煜歆时间: 10:00:00
演讲人:杜复旦时间: 10:00:00
演讲人:沈凯时间: 10:00:00
预算:¥5,000-¥10000预算:¥10,000-¥50,000
单片机C语言编程应注意的若干问题
[导读]作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合
作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对用编程者来说具有十分重要的意义。
1 单片机C语言主要特点
用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能[1],这样可使整个应用系统程序结构清晰,易于调试和维护。不同的功能模块,分别指定相应的入口参数和出口参数,对于一些要重复调用的程序一般把其编成函数,这样可以减少程序代码的长度,又便于整个程序的管理,还可增强可读性和移植性。
在实际单片机程序设计中,程序结构一般均采用如下结构:
#include&reg51.h&&&&&&&& /*头文件说明部份*/
unsigned char x1,x2;& /*全局变量声明部份*/
&Function1(& ){&&&&&& /*功能函数定义部份*/
&&     }
  inti,j;&&&&&&&&& /* 整型变量声明部份*/ 
Function1(&);& /* 功能函数说明部份*/
2 单片机C语言与标准C语言的区别
由于现在越来越多的产品都采用单片机开发,所完成的计算和控制工作也日趋复杂,但是单片机系统是一种资源十分有限的系统,这主要表现在程序存储器资源的不足,因此在程序设计时如何使用好这些有限的资源就显得十分重要。用C语言编程虽然具有许多的优点,但是生成的代码相对要长,要是编程技术不好,生成的代码甚至有可能比汇编语言生成的代码长几倍,因此对编程者来说,应该注意到单片机C语言和一般意义上的标准C语言的区别,对程序进行适当的优化。
2.1 数据类型的选用
单片机C语言编程不同于一般的C语言编程的显著的一个特点,就是要和程序存储器资源结合起来,虽然其提供的数据据类型十分丰富,但是只有bit和char 等数据类型是是机器语言直接支持的数据类型,用此类数据类型的语句所生成的代码较短;而其它的数据类型如整型、浮点型等数据要有一定的内部程序或内部函数的支持,相对来说用该类数据类型的语句生成的代码要长。有些C语言程序表面上看起来十分的简单,但在在实际编译时,生成的代码却相当长。因此我们要按照实际需要,合理地选用数据,可以大大的减少所生成的代码长度。例如在C51中每种数据类型变量所占用存储器字节数和经编译后生成的代码长度如表1所示:
表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来提高数据存储量话必将会增加了硬件成本,使系统更加的复杂,访问外部存储器比访问内部存储器所需的代码也要长得多。有效地使用片内存储器、提高存储器空间的利用率对开发者来说十分关键。
内部处理器、内部堆栈、压缩栈、所有程序变量和所有包含进来的库函数都将使用数量有限的内部数据存储器RAM。因为C语言采用了存储器的覆盖技术[2],可以在程序进行连接时,它将那些已经被其它程序段释放了的存储器空间重新定义给另一个程序段的变量使用,当这个程序运行结束时再将这些存储器释放以供其它程序段使用。全局变量的作用范围是整个程序,因此不能被释放;静态变量由于在函数的调用中专用不变,也不能被释放;只有局部变量中的动态变量可以被释放。
因此在进行程序设计时应该尽量的使用局部变量,提高内部数据存储器的使用率。在C语言中程序中间结果及参数传传递是通过内部的寄存器来完成的,要是内部的存储器不够,将会给你的程序带来许多莫名其妙的错误。例如在进行程序设计时语句不应该太长,一个长语句可以分成多个语句,这样的话可以大的减少中间变量,当然太长时就会造成临时寄存器的不够用,导致计算出错。
4 单片机C语言与汇编语言的混合编程
在绝大多数场合采用C语言编程即可完成预期的目的,但是对实时时钟系统、要求执行效率高的的系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。汇编语言具有直接和硬件打道、执行代码的效率高等特点,可以做到C语言所不能做到的一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一的选择。这种混合编程[2]的方法将C语言和汇编语言的优点结合起来,已经成为目前单片机开发最流行的编程方法。
目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分和C程序部分为不同的模块,或不同的文件,通常由C程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。
当汇编程序和C程序为不同模块时程序一般可分为若于个C程序模块和汇编程序模块,C程序模块通常是程序的主体框架,而汇编程序模块通常由用C语言实现效率不高的函数组成,也可以是已经成熟的、没有必要再转化成C语言的汇编子程序。在这种混合编程技术中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。
对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练的代码,减少运行时间。当汇编函数不大,且内部没有复杂的跳转时,可以用嵌入式汇编实现。
下面就以AT89C2051单片机在模拟电压检测中的应用为例说明C语言程序与汇编语言程序的调用。电路图如图1所示:
AT89C2051单片机内置模拟比较器,13脚即P1.1是比较器的负输入端,12脚即P1.0是比较器的正输入端,比较器的输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较的结果其和一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换的原理,来检测外部P1.1引脚的输入电压。由于系统对时钟要求很严格,因此就采用了C语言和汇编语言混合编程技术,程序调用形式如下:
汇编子程序:
PUBLIC& _AD&&&&&&&&&& ;入口地址
con& SEGMENT CODE&&&& ;程序段
RSEG&&& con
_AD:   SETB& P3.7&&&&&& ;充电
Loop:&&& JB& p3.6,AD_END&& ;开始计数匹配
INC A&&&&&&&
CJNE& A,#100,Loop
AD_END:& CLR P3.7& ;放电&&&&&&&
CJNE& A,#100,Ret_Val&& ;看结果是否有溢出,有溢出说明结果不对
SJMP& Con_OV;返回值&&&&&&&&&
Ret_Val:DEC A
MOV R7,A&&&&&&&& ;A/D转换的结果保存在R7中,传递给主程序
Con_OV: RET&
&&&&&&& END
单片机C程序:
&include&reg51.h&
unsigned char AD(unsigned char);//在C程序中声明汇编模数转换子程序
&void timer0(void) interrupt 1 using 1{&&&
&&&&&&&&&&&&
&x=AD();&&&&&&&&&&&& //在C程序中调用汇编程序
Main{&&&&&&&&&&&&&&&& //主程序
在以上程序中,函数的返回值为一无符号字符型数,根据调用规则,返回值在R7中,这样才可保证数据的传递不出错。另外,在调用过程中,必须注意寄存器的入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。
C语言具有很强的功能性和结构性,可以缩短单片机控制系统的开发周期,而且易于调试和维护,已经成为目前单片机语言中最流行的编程语言。
本文就单片机C语言的特点以及在开发过程中的一些问题给予分析并提供了解决方法,为广大单片机开发人员提供了可借鉴的经验。
1 王平,邢建春,王林.一种快速有效拦截弹飞的单片机程序新方法. 微计算机信息,):80-81.
2 马忠梅,籍顺心,张凯,马岩.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1999.
  通用运动控制技术现状、发展及其应用:运动控制技术的发展是制造自动化前进的旋律,是推动新的产业革命的关键技术。运动控制器已经从以单片机或微处理器作为核心的运动控制器和以专用芯片(ASIC)作为核心处理器的......关键字:
全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商――Microchip Technology Inc.(美国微芯科技公司)宣布旗下全业务渠道microchipDIRECT在线商店开始全面供应所有Atmel原有产品。客户首......关键字:
由于电子和计算机科学的高速发展呈现日新月异的变化局势,在电子科技行业领域,技术进步永远是最大的推动力量,只有创新,才能真正打破格局。......关键字:
单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。......关键字:
北京时间11月8日早间消息,据路透社报道,韩国一位检方官员称,韩国检察部门周二突击搜查了三星电子的办公室,作为对总统朴槿惠政治丑闻调查的一部分。该官员拒绝透露进一步细节,而三星电子尚未对此消息发表评论。此......关键字:
我 要 评 论
热门关键词2766人阅读
c语言(42)

C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。看着有错的程序,不知该如何改起,本人通过对C的学习,积累了一些C编程时常犯的错误,以供参考。
1、书写标识符时,忽略了大小写字母的区别。
  int a=5;
  printf(&%d&,A);
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
2、忽略了变量的类型,进行了不合法的运算。
  float a,b;
  printf(&%d&,a%b);
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
3、将字符常量与字符串常量混淆。
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\0',而把它赋给一个字符变量是不行的。
4、忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写
if (a=3) then …
但C语言中,“=”是赋值运算符,“==”是关系运算符。如:
if (a==3) a=b;
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。
5、忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
  z=x+y;
  t=z/100;
  printf(&%f&,t);
  对于复合语句来说,最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。
6、多加分号。
  对于一个复合语句,如:
  z=x+y;
  t=z/100;
  printf(&%f&,t);
复合语句的花括号后不应再加分号,否则将会画蛇添足。又如:
if (a%3==0);
I++;
本是如果3整除a,则I加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行I++语句,不论3是否整除a,I都将自动加1。再如:
for (I=0;I&5;I++);
&&&&&& scanf(&%d&,&x);
&&&&&& printf(&%d&,x);
本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
7、输入变量时忘记加地址运算符“&”。
scanf(&%d%d&,a,b);
这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。
8、输入数据的方式与要求不符。
①scanf(&%d%d&,&a,&b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf(&%d,%d&,&a,&b);
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:
此时不用逗号而用空格或其它字符是不对的。
& & 3 4 3:4
& & scanf(&a=%d,b=%d&,&a,&b);
输入应如以下形式:
& & a=3,b=4
9、输入字符的格式与要求不一致。
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
& & scanf(&%c%c%c&,&c1,&c2,&c3);
如输入a b c
字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
10、输入输出的数据类型与所用格式说明符不一致。
例如,a已定义为整型,b定义为实型
& & a=3;b=4.5;
& & printf(&%f%d\n&,a,b);
编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。
11、输入数据时,企图规定精度。
& & scanf(&%7.2f&,&a);
这样做是不合法的,输入数据时不能规定精度。
12.switch语句中漏写break语句。
例如:根据考试成绩的等级打印出百分制数段。
switch(grade)
  case 'A':printf(&85~100\n&);
  case 'B':printf(&70~84\n&);
  case 'C':printf(&60~69\n&);
  case 'D':printf(&&60\n&);
  default:printf(&error\n&);
由于漏写了break语句,case只起标号的作用,而不起判断作用。因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“”。例如
case 'A':printf(&85~100\n&);break;
13、忽视了while和do-while语句在细节上的区别。
int a=0,I;
scanf(&%d&,&I);
while(I&=10)
{a=a+I;
I++;
printf(&%d&,a);
int a=0,I;
scanf(&%d&,&I);
{a=a+I;
I++;
}while(I&=10);
printf(&%d&,a);
可以看到,当输入I的值小于或等于10时,二者得到的结果相同。而当I&10时,二者结果就不同了。因为while循环是先判断后执行,而do- while循环是先执行后判断。对于大于10的数while循环一次也不执行循环体,而do-while语句则要执行一次循环体。
14、定义数组时误用变量。
scanf(&%d&,&n);
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即C不允许对数组的大小作动态定义。
15、在定义数组时,将定义的“元素个数”误认为是可使的最大下标值。
&&& static int a[10]={1,2,3,4,5,6,7,8,9,10};
&&& printf(&%d&,a[10]);
C语言规定:定义时用a[10],表示a数组有10个元素。其下标值由0开始,所以数组元素a[10]是不存在的。
17、在不应加地址运算符&的位置加了地址运算符。
& & scanf(&%s&,&str);
C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为:
& & scanf(&%s&,str);
18、同时定义了形参和函数中的局部变量。
int max(x,y)
int x,y,z;
  z=x&y?x:y;
  return(z);
  形参应该在函数体外定义,而局部变量应该在函数体内定义。应改为:
int max(x,y)
  z=x&y?x:y;
  return(z);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:690438次
积分:6242
积分:6242
排名:第3211名
原创:117篇
转载:40篇
评论:104条
(1)(3)(8)(6)(5)(8)(11)(10)(8)(36)(26)(18)(19)新手关于学习C语言的编程软件问题_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:520,397贴子:
新手关于学习C语言的编程软件问题收藏
师兄推荐使用vc6.0但是我在看谭书时书上没有在开头加#include &stdio.h&以及结尾的return 0如果不加,vc6.0便无法运行,是不是我要换一个软件?比如tc?但是不习惯DOS界面,不好操作,求大神解答!
三大理由告诉你,2017上半年为什么要抓紧学车
额,虽然我没看过他的书,但我知道头文件是必须要加的
C 不加头文件当然可以,问题是你不加的话就得自己编写代码实现输入输出。无论 tc 还是 vc6 都是一个应该扔掉的东西。
我这里有按照官方建议制作的 Code::Blocks 绿色版,包大小是 40.5MB。解压展开后马上可以使用,无须任何设置。codeblocks-13.12mingw-setup-TDM-GCC-481.7z:这里的 .pdf 是一个简单的使用指南。下载后解压展开文件,执行 CbLauncher.exe 启动就能使用。如果直接执行 codeblocks.exe 会无法启用绿色版所配的设定。部分杀毒软件会提示 CbLauncher.exe 不安全,但是这是误报,CbLauncher 的源代码已经包含在 .7z 里,它是 code::blocks 官方 wiki 中提供的,怀疑有毒的人自己去看源代码。我用 360 等安全软件扫过,没问题。我在 Windows 8.1 x64、Windows XP、Windows 7 等操作系统上实际使用过都没问题。注意,gdb 目前不支持 unicode 文件/路径名称,因此要在 code::blocks 里进行调试的话,请确保软件展开的位置、调试对象的项目和文件采用纯英文路径、文件名称(不要包含有空格、中文、全角符号等,其实这本应该成为一种使用习惯。例如把压缩包展开在 D 盘根目录 下面,编写的代码放在 d:\coding\ 下)。关于汉化包中软件中已经集成了界面汉化文件,请解压后点击“说明.txt”查看如何调用界面汉化。code::blocks 一些特点:1、默认执行编译好的程序后会暂停让你查看运行结果;2、内建了 Astyle 插件,点击一下就能让代码自动排版好,例如从网络的代码粘贴过来可能是一堆字母汤,但是点击 插件(plugins) - & Astyle 后马上就干净了。3、具备代码、变量等代码提示功能。4、可以方便地进行编译、构建、运行、调试,例如你编写支持命令行参数输入的代码时,Visual Studio 需要跑到项目属性里进行设置,但是 code::blocks 直接在项目下拉选单中就能找到设置输入参数的设置。5、官方提供了配置参数便携工具,像我这里提供的版本就是这样实现的,这样的好处是你把我这个版本放进 U 盘中,拿到任何电脑上都能马上使用,无需任何设置!
C 不加头文件当然可以,问题是你不加的话就得自己编写代码实现输入输出。无论 tc 还是 vc6 都是一个应该扔掉的东西
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 流放之路安全组件修复 的文章

 

随机推荐