分类 Coding 下的文章

嵌入式Linux开发学习笔记:编译与调试

编译

概念

编译的概念很容易混淆,在《编译原理》教材中,编译指的是词法分析到产生目标代码的过程,而在现代编译器中,这个过程被拓展了。现代编译器的主要工作流程包括:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables),

过程

预处理

预处理程序名为cpp,它的主要工作:
处理include
展开宏定义
处理条件编译命令
输出.i文件

编译

编译器程序名为ccl,它的主要工作为:
生成汇编代码
输出.S文件

汇编

汇编器程序名为as,它的主要工作为:
生成二进制代码
输出.o文件

连接

连接器程序名为ld,它的主要工作为:
生成可执行文件

ELF与BIN

ELF  ELF = Executable and Linkable Format,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI)而开发和发布的。… Read the rest

嵌入式Linux开发学习笔记:Linux常用API

文件编程

文件访问(系统调用)

create 创建
open 打开
close 关闭
read 读文件
write 写文件
lseek 移动读写指针
    whence 移动基准
        SEEK_SET 文件头
        SEEK_CUR 当前位置
        SEEK_END 文件尾
    offset 偏移
access 判断权限

R_OK 读
W_OK 写
X_OK 执行
F_OK 存在

文件访问(库函数)

fopen 打开
fread 读文件
fwrite 写文件
fgetc 读取一个字符
fputc 写入一个字符
fscanf 从流中进行格式化输入
fprintf 格式化输出到流中
fseek 定位

SEEK_SET 开始
SEEK_CUR 当前
SEEK_END 结尾

getcwd 获取路径
mkdir 创建目录

时间编程

time 获取日历时间
gmtime 日历时间转为格林威治时间
localtime 将日历时间转为本地时间
asctime 将tm时间转为字符串
ctime 将日历时间转化为本地时间字符串
gettimeofday 今日零时到现在的时间差
sleep 睡眠x秒
usleep 睡眠x微秒… Read the rest

嵌入式Linux开发学习笔记:开发环境

硬件环境准备

综述

如果要学习嵌入式开发,尤其是刚开始学习,那么手边有一个嵌入式设备基本上是必须的。虽然没有设备用仿真器也可以,不过看不到实物的话理解起来会稍微纠结一点。ADS(ARM Developer Suite)
具体来说,学习嵌入式开发要准备的硬件包括:
1、开发板
2、PC与开发板的连线

开发板

开发板(demoboard)是用来进行嵌入式系统开发的电路板,包括中央处理器、存储器、输入设备、输出设备、数据通路/总线和外部资源接口等一系列硬件组件。开发板一般由嵌入式系统开发者根据开发需求自己订制,也可由用户自行研究设计。开发板是为初学者了解和学习系统的硬件和软件,同时部分开发板也提供的基础集成开发环境和软件源代码和硬件原理图等。常见的开发板有51、ARM、FPGA、DSP开发板。
对于学习者来说,有一个开发板可以对嵌入式开发有更直观的了解,如果说不缺那么几百块钱的话,还是买个好些。基本上这个开发板能帮你渡过从入门到掌握之间的阶段。… Read the rest

嵌入式Linux开发学习笔记:嵌入式开发基础

嵌入式开发概述

嵌入式系统的概念

嵌入式系统的定义为:以应用为中心、以计算机技术为基础、软硬件可裁剪、适用于应用系统,对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

简单地说,嵌入式系统就是设计适用于某个功能的专用硬件,搭配与之对应的经过优化的操作系统,并在其中运行这个设备专属的软件

嵌入式系统的特点

  1. 软件、硬件可裁剪
  2. 对功能、可靠性、成本、体积、功耗严格要求

嵌入式开发的方向

硬件层

是整个嵌入式系统的根本,如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。硬件层比较适合于,电子、通信、自动化、机电一体、信息工程类专业的人来搞,需要掌握的专业基础知识有,单片机原理及接口技术、微机原理及接口技术、C语言。… Read the rest

设计模式:Visitor

针对问题

当我们需要遍历一个结构并且操作这个这个结构中的对象时,可能会写出这样的代码:

这样如果我们需要修改对element元素的操作时,需要重写整个循环。同样,如果我们要修改遍历元素的算法,也需要改写这个循环。
Visitor模式分离了对象结构的“遍历”和“对象操作”,使得这两种逻辑可以分别被修改。

介绍

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

实现

Visitor模式的静态图如下:

由UML图可以看出Visitor模式有两个类层次:一个对应于接受操作元素(遍历),一个用于定义对元素操作的访问者(操作)。

下面的协作图进一步说明了Visitor模式的协作方式:

1、遍历可以由对象结构、访问者、或独立的迭代器完成。… Read the rest

设计模式:TemplateMethod

针对问题

当一个算法的大部分实现是不变的,只有一部分可变时,我们可以将算法的不变部分提取到基类中,可变部分留给派生类完成,这便是Template Method模式。

介绍

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

实现

Template Method的静态图如下:

AbstractClass中的TemplateMethod实现了算法中不变的逻辑,将可变逻辑PrimitlveOperation交给子类实现。

另一种Template Method的主要用途为hook操作:基类中提供一个默认空操作,派生类可以修改这个操作的实现,相当于在Template Method算法中“插入”了派生类的逻辑。在实现这样的hook时,基类设计者必须指明哪些是hook操作。

特点

1、Template Method模式是代码复用的一种基本技术,它提供了一种反向控制的结构:由父类调用子类的操作。… Read the rest

设计模式:Strategy

针对问题

当对象要调用某类算法时(例如排序),同一个算法可能有多种实现方式,客户程序中如果直接包含算法代码会让程序变得庞大并难以维护,这时如果要更改算法实现可能需要重写整个客户程序。Strategy模式将算法封装到独立的类型中,从而避免这些问题。

介绍

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

实现

Strategy模式的静态图如下:

其中:
Strategy类型声明算法接口,并在ConcreteStrategy类型中实现具体算法,必要时可以在算法中回调Context。
Context对象中维护strategy对象的引用,并将算法调用转发给Strategy。

在Context调用Strategy接口时可以传递算法必要的参数,或者直接传递Context本身,前者将使得Strategy和Context进一步解耦。
实现Context时可以使Strategy对象成为可选的,如果Context中有Strategy对象,则执行算法,否则继续执行。… Read the rest

设计模式:State

针对问题

假设要开发一个工作流程,流程里包括提交、审批、通过、退回几个步骤,一种设计方案如下:

设计模式:Observer

针对问题

有时一个对象状态的更改需要引发其他对象更新。最常见的情况便是在GUI编程中,对象中数据的改变需要反应到界面上。
例如一个table控件需要增加一行,传统方式是在table中创建一个新行,并为每个单元格赋值。但是这样做必然会将数据逻辑和界面逻辑耦合在一起,如果需要更新多个表格,那么这段代码就会重复出现多次。
Observer模式便是抽取了这种多个对象之间状态同步操作。

介绍

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

实现

Observer模式的静态图如下:

其中:
Subject维护一个Observer列表,Subject内部状态更新时通知列表中的Observer对象。
Observer声明Update接口,这个接口在Subject更新时被Subject调用,并保持Observer状态与Subject一致。

Observer模式的顺序图如下:

当Subject更新时它将通知各个Observer,Observer收到通知时可以查询Subject的状态,并同步自身状态。… Read the rest

设计模式:Memento

针对问题

有时程序需要记录对象的内部状态,在对象内部状态改变后可以利用记录恢复之前的状态。但是面向对象编程中通常封装了对象内部的状态信息,使得这些状态不能被其他对象访问,而暴露对象内部状态又破坏了封装原则。Memento模式利用独立的状态对象保存对象状态,解决了这两者间的冲突。

介绍

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

实现

Memento模式的静态图如下:

其中:
Originator提供两个接口:
1、创建Memento,并将自身状态保存在Memento中。
2、通过Memento对象恢复自身状态。
Memento对象可存入或取出Originator对象的状态。
Caretaker负责保存Memento对象。

Memento模式的活动图如下:

实现Memento模式时,需要注意以下两点:
1、Memento对象需要支持两类接口:为Originator提供的宽接口和为其他对象提供的窄接口,也就是说,应该对Originator以外的对象隐藏Originator相关的接口。C++中可以用友元函数实现。… Read the rest

分类目录