《C嵌入式编程设计模式》
Bruce Powel Douglass著
刘旭东译
C嵌入式编程设计模式
标签: 读书笔记 嵌入式开发
1.1 嵌入式系统有何特殊之处
实时系统,”实时”并不意味着很快。
1.1.1 嵌入式设计的约束
减少使用硬件的需求
性能:吞吐量
可靠性:衡量系统正确完成功能的可能性
健壮性:违反先决条件下仍能提供相应服务的能力
安全性:系统的风险水平,可能会造成那些意外或者损失
1.1.2 嵌入式工具
交叉编译器:在主机上运行,开发的可执行代码在不同环境中运行
连接器
载入程序
调试器工具集
以上集成到IDE中
1.1.3 OS,RTOS,还是没有操作系统
1.1.4 嵌入式中间件
中间件是一种使用某种方法将软件组件连接的软件
1.1.5 与硬件协同开发
1.1.6 调试与测试
1.2 面向对象还是结构化
结构化编程:一方面,函数和过程形成基本的编程基础;另一方面是数据结构的概念。
面向对象编程:基于正交范式。面向对象编程仅有基于类概念的一个分类标准。类将数据(存储为属性)和在数据上的操作的过程(称为操作)组合到一起。对象是类的实例。
像C一样的结构化语言能够完成面向对象的编程么?可以。
如何实现?接着往下看。
1.2.1 类
类仅是一个C语言的结构体,但特殊之处是包含两种不同的特性:数据(属性)和行为(操作)。
最简单的实现类的方法是简单使用文件作为封装边界;公共变量和方法在头文件中课件,而在实现文件中包含方法体、私有变量和方法。
一个更为灵活的方式是使用文件内的结构体来表示类。类的操作用位于相同文件内的结构体的函数定义。
这允许我们拥有同一个类的多个实例,并且保证成员函数在正确的数据拷贝上工作。此外,类可以赋予“特殊”的操作。构造函数创建类的一个对象。初始化程序(可选择)初始化对象和它的属性。析构函数销毁类并释放已使用的内存。
代码1-1 sensor.h
#ifndef SENSOR_H
#define SENDOR_H
typedef struct sensor
{
int filterFrequency;
int updateFrequency;
int value;
char whatKindOfInterface;
}SENSOR;
int Sensor_getFilterFrequency(const SENSOR* const me);
void Sensor_setFilterFrequency(SENSOR* const me, int p_filterFrequency);
int Sensor_getUpdateFrequency(const SENSOR* const me);
void Sensor_setUpdateFrequency(SENSOR* const me, int p_updateFrequency);
int Sensor_getValue(const SENSOR* const me);
//int acquireValue(SENSOR* me);
SENSOR* Sensor_create(void);
void Sensor_Destroy(Sensor* const me);
#endif
代码1-2 sensor.c
#include "sensor.h"
void Sensor_Init(SENSOR* const me){
}
void Sensor_Cleanup(SENSOR* const me){
}
int Sensor_getFilterFrequency(const SENSOR* const me){
return me->filterFrequency;
}
void Sensor_setFilterFrequency(SENSOR* const me, int p_filterFrequency){
me->filterFrequency=p_filterFrequency;
}
int Sensor_getUpdateFrequency(const SENSOR* const me){
return me->updateFrequency;
}
void Sensor_setUpdateFrequency(SENSOR* const me, int p_updateFrequency){
me->updateFrequency=p_updateFrequency;
}
int Sensor_getValue(const SENSOR* const me){
return me->value;
}
/*
int acquireValue(SENSOR* me){
int *r, *w;
int j;
switch(me->whatKindOfInterface)
{
case MEMPRYMAPPED:
w=(int*)WRITEADDR; //Address to write to sensor
*w=WRITEMASK; //sensor command to force a read
for (j = 0; j < count; j++)
{
// wait loop
}
r=(int*)READADDR; //Address to returned value
me->value=r;
break;
case PORTMAPPED:
me->value=inp(SENSORPORT);
//inp() is a compliler-specific port function
break;
}
return me->value;
}
*/
SENSOR* Sensor_create(void){
SENSOR* me=(SENSOR*)malloc(sizeof(SENSOR));
if (me != NULL)
{
Sensor_Init(me);
}
return me;
}
void Sensor_Destroy(SENSOR* const me){
if (me != NULL)
{
Sensor_Cleanup(me);
}
free(me);
}
1.2.2 对象
对象是类的实例。
代码1-3 main.c
#include "sensor.h"
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
SENSOR *p_sensor0, *p_sensor1;
p_sensor0=Sensor_create();
p_sensor1=Sensor_create();
p_sensor0->value=99;
p_sensor1->value=-1;
printf("The current value from sensor0 is %d\n",
Sensor_getValue(p_sensor0));
printf("The current value from sensor1 is %d\n",
Sensor_getValue(p_sensor1));
Sensor_Destroy(p_sensor0);
Sensor_Destroy(p_sensor1);
return 0;
}
1.2.3 多态和虚拟函数
多态允许相同函数名在一种上下文中完成一种功能,在另一种上下文中完成另一种功能。
在C语言中,标准的做法是使用选择语句if或者switch。当出现多种上下文时,不方便;此外在最开始编写时就要知道所有可能的上下文,或者提供修改功能。
代码修改 1-1 sensor.h
#ifndef SENSOR_H
#define SENDOR_H