51单片机编程技巧 1.定义的变量不要太多。低128位为用户定义变量的存放区域(默认时),也可以把变量放在高128位,但容易出错,尽量少放,最好不放。通过*.M51可以查看内存变量的存放,最好不要超过110个字节,否则程序无法运行或出错。2.如一个变量多处使用可定义为全局变量。例如循环变量i、j,尽量减少参... 2023-06-13 51单片机编程文章软件开发程序设计
AVR单片机程序设计 AVR单片机程序设计一、程序设计的方法1.模块化设计模块化设计是将整个单片机程序分解成若干个功能相对独立的、较小的程序模块,对各程序模块分别进行编程和调试,最后将这些程序模块集成为实现特定功能的程序。采用模块化设计,可以使得整个程序的线条清晰,模块可以为多个程序共... 2023-06-13 AVR单片机程序设计文章软件开发
单片机的汇编语言与程序设计题解 第3章单片机的汇编语言与程序设计习题 1.MCS-51单片机有哪几种寻址方式?适用于什么地址空间? 答:MCS-51单片机有7种寻址方式:直接寻址、寄存器寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址、相对寻址。 直接寻址方式:操作数的地址由指令直接给出,适用于片内RAM的所有地址... 2023-06-13 单片机汇编语言程序设计题解文章软件开发
AVR单片机C语言编程技巧 AVR单片机C语言编程技巧1、选择合适的算法和数据结构应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可... 2023-06-13 AVR单片机C语言编程技巧文章软件开发程序设计
用AVR单片机来产生正弦波信号 用AVR单片机来产生正弦波信号使用AVR定时/计数器的PWM功能设计要点一、定时/计数器PWM设计要点根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯... 2023-06-13 AVR单片机产生正弦波信号文章软件开发程序设计
温控PID参数调节实验过程 对于温度控制系统参数的整定过程及方法,搜索了很多论坛,大家都只提到PID数学原型,很少看到有实验过程及Kp,Ki,Kd参数的整定过程及方法,这2天闲着没事,来做个温度控制实验,并将一些实验过程写上来,我也是正在摸索阶段,希望大家踊跃发言哟,各位有好的建议尽管提出来,然后我来实验,将实... 2023-06-13 文章软件开发程序设计
如何选择适合当前项目的最佳操作系统? 编者按:过去由于认识上的局限性,对如何选用合适的操作系统博主同样走过了很多弯路。在企业的发展过程中,为了满足客户的需求,我们大批量使用了正版uC/OS-II、WinCE、Vxworks、MontaVista Realtime Linux以及开源的嵌入式Linux操作系统。在基于成本核算的项目管理过程中,博主领... 2023-06-13 文章软件开发程序设计
高效的C编程之:C编译器及其优化(中) 2.冗余代码的清除下面例子显示了一段急待优化的代码。intdummy(){inta=10,b=20;intc;c=a+b;return0;}当使用arm–c–O0进行编译时,产生的汇编码如下所示。dummy:0000807CE3A0100AMOV r1,#0xa>>>REDUNDANT\#3inta=10,b=20;00008080E3A02014MOV... 2023-06-13 C编程C编译器ARM文章软件开发程序设计
高效的C编程之:C编译器及其优化(下) 下面的例子显示了同一段程序,使用内嵌功能和不使用内嵌功能编译出的不同结果。要编译的源文件如下。intbar(inta){a=a+5;returna;}intfoo(inti){i=bar(i);i=i-2;i=bar(i);i++;returni;}下面的汇编程序为不使用内嵌功能时编译出的结果。barADDr0,r0,#5MOVpc,lrfooSTRlr,[sp... 2023-06-13 C编程C编译器ARM文章软件开发程序设计
高效的C编程之:C编译器及其优化(上) 本章将帮助读者在ARM处理器上编写高效的C代码。本章涉及的一些技术不仅适用于ARM处理器,也适用于其他RISC处理器。本章首先从ARM编译器及其优化入手,讲解C编译器在优化代码时所碰到的一些问题。理解这些问题,将有助于编写出在提高执行速度和减少代码尺寸方面更高效的C源代码... 2023-06-13 C编程C编译器ARM文章软件开发程序设计
高效的C编程之:条件执行 4.3条件执行ARM指令都是可以条件执行的。在代码中使用条件执行指令可以减小代码密度并提高程序执行效率。典型的条件执行语句用在比较指令之后,形成程序的分支跳转结构。下面的例子显示了条件执行指令的典型用法。CMPx,#0MOVGEy,#1MOVLTy,#0但当代码中连续的条件执行指令... 2023-06-13 C编程条件执行ARM文章软件开发程序设计
高效的C编程之:除法运算 14.2除法运算因为ARM体系结构本身并不包含除法运算硬件,所以在ARM上实现除法是十分耗时的。ARM指令集中没有直接提供除法汇编指令,当代码中出现除法运算时,ARM编译器会调用C库函数(有符合除法调用_rt_sdiv,无符合除法调用_rt_udiv),来实现除法操作。根据除数和被除数的不同,32bit... 2023-06-13 C编程除法运算ARM_rt_sdiv合并除法求余运算文章软件开发程序设计
高效的C编程之:布尔表达式(上) 14.4布尔表达式14.4.1范围检测通常,布尔表达式被用来检测某个数值是否在特定的范围内。例如,在图形窗口处理程序中,常使用布尔表达式判断屏幕中一个点是否在当前活动窗口范围内。下面的程序使用结构体定义点坐标并计算坐标的当前位置。boolPointInRect1(Pointp,Rectangle*r)... 2023-06-13 C编程布尔表达式ARM比较指令文章软件开发程序设计
高效的C编程之:布尔表达式(下) 14.4.2和零的比较操作比较指令(CMP)将设置程序状态字的条件标志位。另外,基本的算术指令也可以设置条件标志位,如使用指令MOVS、ADDS等。如果程序中的算术指令的执行目的是为了将计算结果和零比较,那么就可以直接使用带标志扩展的基本算术指令。如下面的两条语句:ADDR0,R0,R1CM... 2023-06-13 C编程布尔表达式ARM比较指令文章软件开发程序设计
高效的C编程之:C循环结构(下) 14.5.2循环展开在14.5.1节中可以发现,每次循环需要在循环体外加两条指令:一条减法指令来减少循环计数值和一条条件分支指令。通常这些指令称为循环开销(LoopOverhead)。在ARM7或ARM9处理器上,加法指令需要1个周期,条件分支指令需要3个周期,这样每个循环就需要4个周期的开销。可... 2023-06-13 C编程循环结构循环中止forwhileARM文章软件开发程序设计
高效的C编程之:Switch语句(下) 编译后的代码如下所示。ConditionStr2:00008188E1A01000MOVr1,r0>>>SWITCH\#26if((unsigned)condition>=15)return0;0000818CE351000FCMPr1,#0xf000081903A000001BCC0x819c>>>SWITCH\#26if((unsigned)condition... 2023-06-13 C编程Switch语句ARM查找表文章软件开发程序设计
高效的C编程之:寄存器分配(上) 14.7寄存器分配编译器一项很重要的优化功能就是对寄存器的分配。与分配在寄存器中的变量相比,分配到内存的变量访问要慢得多。所以如何将尽可能多的变量分配到寄存器,是编程时应该重点考虑的问题。注意当使用-g或-dubug选项编译程序时,为了确保调试信息的完整性,寄存器分配的... 2023-06-13 C编程寄存器分配变量ARM编译器文章软件开发程序设计
高效的C编程之:寄存器分配(中) 14.7.2指针别名C语言中的指针变量可以给编程带来很大的方便。但使用指针变量时要特别小心,它很可能使程序的执行效率下降。在一个函数中,编译器通常不知道是否有2个或2个以上的指针指向同一个地址对象。所以编译器认为,对任何一个指针的写入都将会影响从任何其他指针的读出,... 2023-06-13 C编程寄存器分配变量ARM编译器文章软件开发程序设计
高效的C编程之:寄存器分配(下) 编译后的结果如下。test2STMDBsp!,{v1,lr}STRa1,[sp,#-4]!MOVa1,spBLfLDRv1,[sp,#0]MOVa1,v1BLgADDv1,a1,v1MOVa1,v1BLgADDa1,a1,v1ADDsp,sp,#4LDMIAsp!,{v1,pc}从编译结果可以看出,修改后的代码只使用了2次内存访问,而test1为4次内存访问。总上所... 2023-06-13 C编程寄存器分配变量ARM编译器文章软件开发程序设计
高效的C编程之:寄存器分配(终) 3.指针链指针链(PointerChains)常被用来访问结构体内部变量。下面的例子显示了一个典型的指针链的使用。typedefstruct{intx,y,z;}Point3;typedefstruct{Point3*pos,*direction;}Object;voidInitPos1(Object*p){p->pos->x=0;p->pos->y=0;p->pos->z=0;}... 2023-06-13 C编程寄存器分配变量ARM编译器文章软件开发程序设计
高效的C编程之:Switch语句(上) 14.6Switch语句编译器通常将C语言中的Switch语句编译一个查找表(TableLookup)以便跳转到合适的入口处。下面的例子显示了编译器如何处理程序中的Switch语言的。C源程序如下。char*ConditionStr1(intcondition){switch(condition){case0:return"EQ";case1:return"NE";ca... 2023-06-13 C编程Switch语句ARM查找表文章软件开发程序设计
高效的C编程之: 函数调用(中) func2STRlr,[sp,#-4]!ADDr0,r0,r1ADDr0,r0,r2ADDr0,r0,r3LDMIBsp,{r12,r14}ADDr0,r0,r12ADDr0,r0,r14LDRpc,{sp},#4caller2STMFDsp!,{r2,r3,lr}MOVr3,#6MOVr2,#5STMIAsp,{r2,r3}MOVr3,#4MOVr2,#3MOVr1... 2023-06-13 C编程函数调用ARM__value_in_regs文章软件开发程序设计
高效的C编程之: 函数调用(终) 14.9.5单纯子函数所谓单纯子函数(PureFunctions)是指那些函数返回值只和调用参数有关。换句话说,就是如果调用函数的参数相同,那么函数的返回结果也相同。如果程序中存在这样的函数,可以在函数定义时使用_pure进行声明,这样在程序编译时编译器会根据函数的调用情况对其进行优化... 2023-06-13 C编程函数调用ARM__value_in_regs文章软件开发程序设计
高效的C编程之: 函数调用(补充) 14.9.6内嵌函数ARM编译器支持函数内嵌功能。使用关键字“_inline”声明函数,可以使函数内嵌。下面的例子显示了如何使用函数内嵌功能。程序源文件如下。__inlineintsquare(intx){returnx*x;}#includedoublelength(intx,inty){returnsqrt(square(x)+squ... 2023-06-13 C编程函数调用ARM__value_in_regs文章软件开发程序设计
高效的C编程之: 函数调用(上) 14.9函数调用函数设计的基本原则是使其函数体尽量的小。这样编译器可以对函数做更多的优化。14.9.1减少函数调用开销ARM上的函数调用开销比非RISC体系结构上的调用开销小:·调用返回指令“BL”或“MOVpc,lr”一般只需要6个指令周期(ARM7上)。&midd... 2023-06-13 C编程函数调用ARM__value_in_regs文章软件开发程序设计