在Linux下搭建STM32开发环境攻略 (上) Linux发行版是64bit的Fedora19,方案选择为:Eclipse+CodeSourcery+OpenOCD+STLINKv2。NO1.准备STM32的开发板,购买仿真器STLINKv2。NO2.安装 CodeSourcery如果是64bit机器,首先确认它能够运行32bit的软件。CodeSourcery可以在官网https://sourcery.mentor.com下载,名称为a... 2023-06-13 LinuxSTM32开发文章软件开发嵌入式OS
在Linux下搭建STM32开发环境攻略 (下) NO7.编译STM代码使用Eclipse新建C Project,将STM代码放进去。根据你自己的STM32芯片类型,修改.S和.ld文件内容,注意.ld文件中要使用绝对路径。修改工程属性,注意要修改头文件路径、芯片类型和GCC工具(即CodeSourcery,同样使用绝对路径)。点击build all即可。如果编译不成功,就根... 2023-06-13 LinuxSTM32开发文章软件开发嵌入式OS
高效的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文章软件开发程序设计
高效的C编程之: 变量类型(上) 14.8变量类型ARMC编译器支持基本的数据类型:char、short、int、longlong、float和double。表14.2说明了armcc对C语言所使用的数据类型的映射。表14.2 C编译器数据类型映射C数据类型表示的意义char无符号8位字节数据short有符号16位半字数据int有符号32位字数据long有符号3... 2023-06-13 C编程变量类型armccARM编译器文章软件开发程序设计
高效的C编程之: C循环结构(上) 14.5C循环结构循环体是程序设计与优化的重点考虑对象。本节将着重讲解在ARM上处理for和while循环最有效的方法。14.5.1循环中止首先来看下面的例子,两个不同的循环退出条件,产生的不同汇编代码。C源程序如下所示。intfact1(intn){inti,fact=1;for(i=1;i<=n;i++)fact*=i;ret... 2023-06-13 C编程循环结构循环中止forwhileARM文章软件开发程序设计
高效的C编程之: 浮点运算 14.10浮点运算大多数的ARM处理器硬件上并不支持浮点运算。但ARM上提供了以下几个选项来实现浮点运算。·浮点累加协处理器FPA(Floating-PointAccelerator):ARM上提供了一组协处理器指令专门实现浮点运算。但这需要硬件支持,具体某一处理器上是否有FPA协处理器支持,可以... 2023-06-13 C编程浮点运算浮点累加协处理器FPAARM文章软件开发程序设计
高效的C编程之: 移植问题 14.11移植问题当对源代码使用不同的编译器时,可能会出现一些移植上的问题,这时可以宏将一些ARM特有的关键字“打包”。例如:#ifdef__arm#defineINLINE__inline#defineVALUE_IN_REGS__value_in_regs#definePURE__pure#else#defineINLINE#defineVALUE_IN_... 2023-06-13 C编程移植inlineVALUE_IN_REGSARM文章软件开发程序设计
RS232转RS485转换器在485总线系统施工时的注意事项 在长距离通信的诸多方案中,RS485(RS232转RS485转换器)因其独特的电器性能,可靠的应用于主控机之间、主控机与单片机或外设之间构成点到点、点到多点远程多机通信网络,实现多机应答通信。但RS485总线在抗干扰、自适应、通信效率等方面仍存在缺陷,一些细节的处理不当常会导致通信... 2023-06-13 RS232RS485转换器屏蔽双绞线浪涌冲击文章软件开发嵌入式OS