跳转到主要内容

编程工具

程序员必知的十大基础实用算法及其讲解

kelly /

<strong> 1、快速排序算法</strong>

快速排序是由东尼•霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

(1)从数列中挑出一个元素,称为“基准”(pivot),

(2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

(3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

如何形成一个良好的编程风格(二)

kelly /

<strong> 3、标识符</strong>

a、变量的命名

方法一:采用匈牙利命名法。命名规则的主要思想是“在变量中加入前缀以增进人们对程序的理解”。

例如平时声明32位整型变量Length对应使用匈牙利命名法为unLength。现在列出经常用到的变量类型。

变量类型 示例

char cLength

unsigned char ucLength

short int sLength

unsigned short int usLength

int nLength

unsigned int unLength

如何形成一个良好的编程风格(一)

kelly /

编程的总则:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。大多数程序员只是关注程序的可行性,而忽略了可读性,可移植性和健壮性,其实我个人认为,程序的可行性和健壮性与程序的可读性有很大的关系,能写出可读性很好的程序的程序员,他写的程序的可行性和健壮性必然不会差,也会有不错的可移植性。程序的可读性需要程序员有一个良好的编程风格。

好风格应该成为一种习惯。如果你在开始写代码时就关心风格问题,如果你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。一旦这种习惯变成自动的东西,你的潜意识就会帮你照料许多细节问题,甚至你在工作压力下写出的代码也会更好。

<strong>1、排版</strong>

嵌入式软件可靠性设计的一些理解

kelly /

<strong> 1、前言 </strong>

设备的可靠性涉及多个方面:稳定的硬件、优秀的软件架构、严格的测试以及市场和时间的检验等等。这里着重谈一下作者自己对嵌入式软件可靠性设计的一些理解,通过一定的技巧和方法提高软件可靠性。这里所说的嵌入式设备,是指使用单片机、ARM7、Cortex-M0,M3之类为核心的测控或工控系统。

嵌入式软件可靠性设计应该从防错、判错和容错三方面进行考虑。 此外,还需理解自己所使用的编译器特性。

<strong> 2、防错</strong>

良好的软件架构、清晰的代码结构、掌握硬件、深入理解C语言是防错的要点,这里只谈一下C语言。

“人的思维和经验积累对软件可靠性有很大影响"。C语言诡异且有种种陷阱和缺陷,需要程序员多年历练才能达到较为完善的地步。“软件的质量是由程序员的质量以及他们相互之间的协作决定的”。因此,作者认为防错的重点是要考虑人的因素。

“深入一门语言编程,不要浮于表面”。软件的可靠性,与你理解的语言深度密切相关,嵌入式C更是如此。除了语言,作者认为嵌入式开发还必须深入理解编译器。

本节将对C语言的陷阱和缺陷做初步探讨。

【下载】ARM汇编语言程序设计基础

kelly /

<strong>ARM汇编伪指令</strong>

<strong>伪操作、宏指令及伪指令的概念</strong>

伪操作是ARM汇编语言程序里的一些特殊指令助记符,主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在处理器运行期间由机器执行。

宏指令是一段独立的程序代码,它通过伪操作来定义。通过宏名来调用宏,并可以设置相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。

伪指令也是ARM汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,它们在汇编时将被合适的机器指令代替成ARM或Thumb指令从而实现真正指令操作。

<strong>伪操作</strong>

符号定义(Symbol Definition) 伪操作

内存分配(数据定义)(Data Definition) 伪操作

汇编控制(Assembly Control) 伪操作

其他 (Miscellaneous) 伪操作

ARM中C语言和汇编语言混合编程

kelly /

在嵌入式系统开发中,目前使用的主要编程语言是C 和汇编,虽然C++已经有相应的编译器,但是现在使用还是比较少的。

在稍大规模的嵌入式程序设计中,大部分的代码都是用C来编写的,主要是因为C语言具有较强的结构性,便于人的理解,并且具有大量的库支持。但对于一写硬件上的操作,很多地方还是要用到汇编语言,例如硬件系统的初始化中的CPU 状态的设定,中断的使能,主频的设定,RAM控制参数等。另外在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,熟练对应汇编语言的使用也是必须的。

单纯的C或者汇编编程请参考相关的书籍或者手册,这里主要讨论C和汇编的混合编程,包括相互之间的函数调用。下面分四种情况来进行讨论,不涉及C++语言。

<strong>一、在C语言中内嵌汇编</strong>

在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面:

a 不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令;

特别实用的单片机编程经验总结!

kelly /

本文主要总结一些比较实用的单片机编程经验:

<strong> 经验之一:用“软件陷阱+程序口令”对付PC指针的弹飞</strong>

当CPU受到外界干扰,有时PC指针会飞到另一段程序中,或跳到空白段去。其实,如果PC指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。但是,如果PC指针飞到另一段程序中去了,系统如何办?小匠在这里推荐一种方法——程序口令,思路如下:

1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。

2、设立一个模块(子程序)ID寄存器。

3、为每个子程序配置一个唯一的ID号码。

4、每当子程序执行完毕,要返回(RET)之前,先将本子程序的ID号送入 ID寄存器。

5、返回到上级程序后,先判断ID寄存器中的ID号。

如果正确,则继续执行;如果不正确,则表示PC指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。

单片机C语言易错知识点,记住它们会让你事半功倍!

kelly /

在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的C语言知识点,是一些小细节。

但是正是因为很基础,又都是小细节,所以我们往往容易忽视它们。结果有时候我们会花很长的时间纠结一个问题,迟迟找不到问题的所在。

当发现原因竟然是这么的简单和不起眼时,大家都会感到痛不欲生。这些问题要记录下来,时刻提醒自己!!

<strong>1、! 和 ~ 不一样</strong>

! 是逻辑非符号,~ 是位取反符号。

对IO口某个引脚赋值时不要错用 ! 如

<center><img src="http://mm32.eetrend.com/files/2016-11/wen_zhang_/100002557-8204-1.png&q…; alt=""></center>

浅析ARM汇编语言子例程设计方法

kelly /

<strong>引言</strong>

在嵌入式软件系统开发过程中,大量使用C语言进行应用程序开发以提高开发效率。同时,系统中经常包含一些决定整个系统性能的关键模块,此时为了获得最佳性能,经常使用汇编语言编写它们,或者某些特殊情况下,例如操作硬件等,也必须使用汇编语言。

函数是C语言中一个重要的概念,在汇编语言中经常使用子例程或过程(subroutine or procedure)表达同样的概念,本文使用术语子例程。本文首先介绍ARM汇编语言子例程设计的一般方法,并以此为基础提出一种新的基于堆栈帧的设计方法,同时介绍与C语言交互技术。

<strong>1、 一般方法</strong>

在ARM汇编语言中一般使用BL(Branch and Link)指令调用某个子例程,BL指令首先将返回地址保存在链接寄存器R14(也称为LR)中,然后跳转到目标地址。子例程执行完毕后,通过将R14的内容复制到PC中实现从子例程返回。

BL subr ;调用subr

… ;返回到这里

subr

… ;子例程体

单片机的编程语言和开发环境

kelly /

<strong> CPU懂的机器语言</strong>

单片机的CPU从存储器读取程序,但是一次只能读取一条指令,然后解释每条指令,并执行。存储器中保存的内容,不管是程序还是数据,都是二进制代码“0”和“1”组成的字符串。指令二进制代码告诉CPU要做什么,而数据二进制代码则是CPU操作或处理指令时要使用的值。CPU的操作包含加、减运算等指令。这些像密码一样排列的“0”和“1”字符串就是机器语言。比如图1左边显示的就是一个机器语言指令,意思是“将2放入寄存器A(寄存器是CPU内部的储存区域)。

CPU总是按存储器地址的顺序读取指令代码,除非遇到跳跃指令。例如,如果复位后的地址是0000,则从0000开始按0001、0002、0003的顺序读取并执行指令。也可以说,一个程序就是按处理要求排列一系列的机器语言。

CPU只能理解如上所述的机器语言。因此,为了使CPU运行,就必须使用机器语言的程序。但是,机器语言不易为人们识别和读写。因此,人们用了更简单易懂的字符串来代替机器语言,这就是汇编语言。例如,在“给寄存器A赋值2”这样的处理时,如果用汇编语言来表示,就很简单,请看图1的右边部分。汇编语言中,用MOV字符串表示赋值,所以“给寄存器A赋值2”的处理就可用“MOV A,#02”表示。