第九章 C语言在嵌入式中的应用

上章回顾

编码的规范和程序版式

版权管理和申明

头文件结构和作用

程序命名

程序注释和代码布局规范

assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

第九章

第九章

C语言在嵌入式中的应用 C语言在嵌入式中的应用

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

预习检查

嵌入式系统有哪些特点 关键字volatile的作用

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

课程目标

本章概述

重点

难点

以实例说明C在嵌入式中的应用,以及注意事项 。

本章目标

了解C语言在嵌入式系统中的重要性 熟悉嵌入式C语言编程的特点和环境 了解如何优化C语言嵌入式编程的性能

了解嵌入式平台的特点,针对性编程

嵌入式C语言嵌入编程的性能优化

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

本章结构

C语言在嵌入式中的应用 C语言在嵌入式中的应用

嵌入式C编码 嵌入式C编码

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

C语言在嵌入式系统地位 C语言在嵌入式系统地位

嵌入式系统编程性能优化

嵌入式系统编程性能优化

                9 C语言在嵌入式中的应用

C语言在嵌入式系统中的地位 嵌入式系统编程的特点 嵌入式C编程的性能优化

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                   9.1 C语言在嵌入式系统中的地位

C语言背景 嵌入式系统编程

C语言的嵌入应用 与汇编语言编程相比的优势 C语言的嵌入式应用发展

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                              9.1.1 C语言背景 C语言的特点

C 中蕴含的OO,GP 强大的语言功能

灵活的语言机制

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                     9.1.2 嵌入式系统编程 嵌入式系统有三个特点

嵌入性

专用性

计算性

资源受限的环境

[email protected]:Kevin-Dfg/Data-St[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                9.1.2 嵌入式系统编程 嵌入式系统有三个特点

嵌入性 表示系统通常需要嵌入到其他对象系统中

专用性 表示系统的软件和硬件要有可裁剪性

计算性 表示嵌入式系统必须是能满足对象系统控制需要的电脑系统

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                          9.1.2 嵌入式系统编程 嵌入式系统运行环境

资源受限的环境

嵌入式应用种类繁多

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                   9.1.2 嵌入式系统编程

C语言在嵌入式系统的不足

ISO C 的语法特性会导致代码体积膨胀和执行效率的低下

C 有可能会对嵌入式软件带来额外的开销

C语言的改造

1998年,Embedded C 规范正式出炉 (EC)

EC 是标准C 语言的一个子集

剔除了一些实现复杂和会导致额外负担语法元素。例如:多重继承和虚基 类、RTTI、异常处理、模版、命名空间等等

在标准库方面,EC 规范也做了删减,STL和Stream等被剔除了

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                        9.1.3 C语言的嵌入应用

常见的嵌入式操作系统

VxWorks 嵌入式Linux Windows CE

C语言嵌入式应用 科泰世纪公司自主研发的和欣(Elastos)

BrickOS Symbian OS Windows CE

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                          9.1.3 与汇编语言编程相比的优势 C语言相比汇编语言的优势

编程调试灵活方便

生成的代码编译效率高

完全模块化

可移植性好

便于项目维护管理

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                   9.2 嵌入式C编程 嵌入式编程环境

模块划分

多任务与单任务

中断服务程序

硬件驱动模块

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                      9.2.1嵌入式编程的环境

理解全貌 检查环境 存储器映射 I/O映射 指针与地址 通讯过程 中断映射 接触硬件

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                          9.2.2模块划分 概念:合理的将一个很大的软件划分为一系列功能独

立的部分合作完成系统的需求

一个嵌入式系统通常包括两类模块

硬件驱动模块,一种特定硬件对应一个模块

软件功能模块,其模块的划分应满足低偶合、高内聚的要求

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                              9.2.3 多任务与单任务

概念

该系统不能支持多任务并发操作,宏观串行地执行一个任务 可以宏观并行地“同时”执行多个任务堆栈溢出

多任务特点

依赖于一个多任务操作系统(OS)

嵌入式多任务OS Vxworks

ucLinux

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                 9.2.3 多任务与单任务 单任务程序典型架构

从CPU 复位时的指定地址开始执行; 跳转至汇编代码startup 处执行; 跳转至用户主程序main 执行,在main 中完成:

初试化各硬件设备;

初始化各软件模块;

进入死循环(无限循环),调用各模块的处理函数

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                 9.2.3 多任务与单任务 循坏模式

循坏模式

循坏模式

while(1) {

}

for(;;) {

}

死循坏例子

操作系统是死循环; WIN32 程序是死循环;

嵌入式系统软件是死循环;

多线程程序的线程处理函数是死循环。

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                      9.2.4 中断服务程序 中断服务程序的要求

不能返回值;

不能向ISR 传递参数;

ISR 应该尽可能的短小精悍 函数不能带来重入和性能问题

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                               9.2.5 硬件驱动模块

硬件驱动模块通常应包括如下函数

中断服务程序ISR

硬件初始化

修改寄存器,设置硬件参数 将中断服务程序入口地址写入中断向量表:

设置CPU 针对该硬件的控制线

设置CPU 内部对应寄存器使其作为控制信号;

设置CPU 内部的针对该设备的中断屏蔽位,设置中断方式 提供一系列针对该设备的操作接口函数

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

阶段小节

嵌入式系统编程软件架构方面的知识

模块划分、多任务还是单任务选取

中断服务程序、硬件驱动模块设计   单任务程序典型架构

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                      9.3 嵌入式系统编程的特点

C语言语法优化 字节对齐详解 关键字volatile 中断程序 利用硬件特性 活用位操作 内嵌汇编 使用寄存器变量

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                  9.3.1 C语言语法优化

数据类型

关于局部变量

函数操作

语法结构优化

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                 9.3.1.1 数据类型

C语言性能

编译器

硬件系统

设置某些编译器选项

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                    9.3.1.1 数据类型 结构体数据的优化规则

小的元素放在结构体的开始,大的元素放在结构体的最后; 避免使用过大的结构体,用层次话的小结构体代替; 人工对API的结构体增加填充位以提高移植性;

枚举类型要慎用,因为它的大小与编译器相关;

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                              9.3.1.2 关于局部变量 局部变量的数据类型最好有系统操作位一致

分析

比如:ARM数据处理操作都是32位的,局部变量应尽可能使用32位 的数据类型(int或long)

short checksum_v3(short * data) {

short+short=int 降低程序的效率

unsigned int i; short sum = 0;

for(i = 0; i < 64 ; i++) {

sum = (short)( sum + data[i] ); }

return sum; }

[email protected]:Kevin-Dfg/Data-Structures-and-Algorith[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                         9.3.1.2 关于局部变量 程序分析

short checksum_v3(short * data) {

提高性能

unsigned int i;

int sum=0;

for(i = 0; i < 64 ; i++) {

sun += ( data ++); }

return (short) sum; }

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                 9.3.1.3 函数操作 ARM函数参数特性

void func( var1 ,var2 ,var3 ,var4 , var5......)

系统寄存器

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

堆栈

                                        9.3.1.3 函数操作 函数优化规则

尽量限制函数参数,不要超过四个,也可以把相关的参数组织在结

构体传递。

把比较小的被调用函数和调用函数放在同一个源文件中

用_inline内联性能影响较大的重要函数。

函数参数和返回值应尽量使用int类型;

对于调用频率较低的全局变量,尽量使用小的数据类型以节省空间

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                             9.3.1.4 语法结构优化 语法结构规则

使用减数到零的循环体,以节省指令和寄存器的使用; 使用无符号的循环计数值,并用条件 i != 0中止; 如果循环体至少执行一次,用优先选用do-while; 适当情况下展开循环体; 尽量使用数组的大小是4或8的倍数,用此倍数展开循环体; 尽量避免使用边界不对齐数据。

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                9.3.1.5 什么是字节对齐 对齐的定义

按照一定的规则在空间上排列,而不是顺序的一个接一个的排放

对齐的原因

各个硬件平台对存储空间的处理上有很大的不同

对齐的作用

提高存取效率

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                           9.3.1.6 字节对齐对程序的影响 例A

例B

struct A struct B {{

};

};

int a; char b; short c;

char b; int a; short c;

假定运行在32位系统

结果

sizeof(strcut A)的值为?? sizeof(struct B)的值是??

8 12

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                           9.3.1.6 字节对齐对程序的影响 例C

例D

/*指定按2字节对齐*/

#pragma pack (2)

struct C {{

char b; int a; short c;

char b; int a; short c;

};

#pragma pack ()

};

#pragma pack ()

假定运行在32位系统

结果

sizeof(strcut C)的值为?? sizeof(struct D)的值是??

8 7

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

/*指定按1字节对齐*/ #pragma pack (1) struct D

                                                                  9.3.1.7 编译器是按照什么样的原则进行对齐的 基本概念

数据类型自身的对齐值: char型数据,其自身对齐值为1

short型为2, int,float,double类型,其自身对齐值为4

结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。 指定对齐值:#pragma pack (value)时的指定对齐值value。

数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中

小的那个值。

重要概念

有效对齐N -----存放起始地址%N=0 对齐值圆整-结构体成员变量占用总长度需要是对结构体有效对齐

值的整数倍

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                           9.3.1.7 编译器是按照什么样的原则进行对齐的

};

例A

例A分析

假定B起始地址为0X0000

b -> 0x0000%1=0 ->[0X000-0X000] a -> 0x0004%4=0 ->[0X004-0X007] c -> 0x0008%2=0 ->[0X008-0X009] 结构体的有效对齐值MAX(1,4,2) -> 4 B ->(10+2)%4=0 ->[0X000-0X00B]

struct B {

char b; int a; short c;

假定运行在32位系统 结果

sizeof(struct B)的值是?? 12

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                      9.3.1.7编译器是按照什么样的原则进行对齐的

例C

例C分析 假定B起始地址为0X0000

/*指定按2字节对齐*/ #pragma pack (2) struct C

{

b -> 0x0000%1=0 ->[0X000-0X000] b有效对齐值->MIN(2,4)->2

a -> 0x0004%2=0 ->[0X002-0X003] a -> 0x0006%2=0 ->[0X004-0X005] c -> 0x0008%2=0 ->[0X006-0X007] 结构体的有效对齐值MAX(4,2) -> 2 B -> (8)%2=0 ->[0X000-0X007]

char b; int a; short c;

};

#pragma pack ()

假定运行在32位系统 结果

sizeof(struct C)的值是?? [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

8

                     9.3.1.8 针对字节对齐,我们在编程中如何考虑

如何节约空间

结构中的变量按照类型大小从小到大声明 以空间换取时间 -显式reserved

struct A {

}

char a;

char reserved[3];//使用空间换时间 int b;

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

            9.3.1.9 字节对齐可能带来的隐患 如下例子有什么问题?分析

unsigned int i = 0x12345678; unsigned char *p=NULL; unsigned short *p1=NULL;

p=&i;

*p=0x00;

p1=(unsigned short *)(p+1); *p1=0x0000;

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                9.3.1.10 如何查找与字节对齐方面的问题 编译器的big little端设置

看这种体系本身是否支持非对齐访问

如果支持看设置了对齐与否,如果没有则看访问时需要加 某些特殊的修饰来标志其特殊访问操作。

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

               9.3.1.11 对齐的使用 __align(num)

__packed

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                            9.3.2 关键字volatile

volatile

特点:变量可能会被意想不到地改变

优化器在用到这个变量时必须每次都重新读取这个变量的值

主要的应用实例

并行设备的硬件寄存器(如:状态寄存器); 一个中断服务子程序中会访问到的非自动变量(也就是全局变量); 多线程应用中被几个任务共享的变量

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             9.3.3 关键字volatile 例子分析

int a,b,c; /*读取I/O空间0x100端口的内容存入a变量*/

a = inWord(0x100);

b = a; /*再次读取I/O空间0x100端口的内容存入a变量*/ a = inWord (0x100);

c = a;

会出现什么错误呢?

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             9.3.3 关键字volatile 例子分析 -系统优化

int a,b,c; /*读取I/O空间0x100端口的内容存入a变量*/ a = inWord(0x100);

b = a;

/*再次读取I/O空间0x100端口的内容存入a变量*/

a = inWord (0x100); c = a;

会出现什么错误呢?

[email protected]:Kevin-Dfg/Data-Structures-and-[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

             9.3.3 关键字volatile 例子分析 -正确改正

int b,c;

volatile int a; /*读取I/O空间0x100端口的内容存入a变量*/

a = inWord(0x100);

b = a; /*再次读取I/O空间0x100端口的内容存入a变量*/ a = inWord (0x100);

c = a;

会出现什么错误呢?

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                9.3.3 关键字volatile

volatile的特点 一个参数既可以是const还可以是volatile吗?解释为什么?

一个指针可以是volatile 吗?解释为什么。 下面的函数有什么错误:

int square(volatile int *ptr) {

}

return *ptr * *ptr;

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

            9.3.4 中断程序 中断程序特性分析

__interrupt double compute_area (double radius) {

}

double area = PI * radius * radius; printf(" Area = %f", area);

return area;

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                  9.3.4 中断程序

中断程序特性分析

ISR 不能返回一个值。 ISR 不能传递参数。

在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编 译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR 中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算 是不明智的。

printf()经常有重入和性能上的问题

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                     9.3.5 利用硬件特性 存储器的访问速度选择

CPU内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM

硬件内部的存储空间利用 减少了CPU 对外设的干预

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                9.3.6 活用位操作

位操作特点

位是可以操作的最小数据单位 理论上可以用“位运算”来完成所有的运算和操作 提高程序运行的效率

例子:

/* 方法1 */ int i,j;

/* 方法2 */ int i,j;

i = 879 / 16;

j = 562 % 32;

i = 879 >> 4;

j = 562 - (562 >> 5 << 5);

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                             9.3.6 活用位操作 硬件寄存器进行位设置

屏蔽控制寄存器的第低6位设置为0

#define INT_I2_MASK 0x0040

wTemp = inword(INT_MASK); outword(INT_MASK, wTemp &~INT_I2_MASK);

设置控制寄存器的第低6位设置为1

#define INT_I2_MASK 0x0040

wTemp = inword(INT_MASK); outword(INT_MASK, wTemp | INT_I2_MASK);

判断控制寄存器的第低6位设置是否为1

#define INT_I2_MASK 0x0040 wTemp = inword(INT_MASK); if(wTemp & INT_I2_MASK)

{

}

... /*该位为1*/

[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                         9.3.7 内嵌汇编 内嵌汇编特点

提高运算速度

内嵌汇编语法

例子

_asm{ }

/* 把两个输入参数的值相加,结果存放到另外一个全局变量中 */ int result;

void Add(long a, long *b)

{

}

_asm {

}

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

MOV AX, a MOV BX, b ADD AX, [BX] MOV result, AX

[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                        9.3.8 使用寄存器变量 关键字-register

register特点 存放在CPU的寄存器

使用时不需要访问内存

提高效率

Register使用规则 只有局部自动变量和形参才可以定义为寄存器变量 “建议”型关键字

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

            9.3.8 使用寄存器变量 例子

/* 1+2+3+....+n的值 */ WORD Addition(BYTE n) {

register i,s=0;

for(i=1;i<=n;i++) {

s=s+i; }

return s; }

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                9.3.9 降低内存的使用 RAM 与ROM

减小栈的大小 堆的大小受限于RAM

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

阶段小节

字节对齐特点和好处

嵌入式中断程序的特点

如何在嵌入式系统中嵌入汇编和位操作

寄存器变量和volatile变量的区别和各自的用法

如何提供系统内存的利用

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

本章总结

嵌入式环境特点和C语言的优势

C语言与汇编语言的优势及嵌入式的发展前景

嵌入式系统编程的环境

嵌入式系统编程的调试特点 如何优化嵌入式C编程

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

实验1 题目

编译器是一个纯粹的ANSI编译器。要求设置一绝对地址为0x67a9的整 型变量的值为0xaa66。写代码去完成这一任务。同时写两段代码,第 一个设置a的bit 3,第二个清除a 的bit 3。

实验目的

嵌入式寄存器位操作运算; volatile关键词的用法;

实验分析

定义一个数据指针,确定好数据指针的数据类型; 定义一个volatile指针;

实现一个设置位函数和清零位函数;

[email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

时间: 2024-11-24 00:46:40

第九章 C语言在嵌入式中的应用的相关文章

第九章 多语言环境的支持和多屏幕的适配(1)

第九章 多语言环境的支持和多屏幕的适配 资源是在代码中使用到的,并且在编译时被打包进应用程序的附加文件.出于加载效率的考虑,资源被从代码中分离出来,而且XML文件被编译进二进制代码中.在Android中,程序代码可以不直接和资源发生关系,而是通过R文件提供的索引来间接的引用某一个资源.Android系统会自动根据用户当前的环境,和屏幕分辨率情况,自动选用最合适的资源.正是基于Android系统这种独特的处理方式,开发者可以编写多套资源文件,从而很方便的实现多语言环境的支持和多种屏幕的适配. 本章

《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通知所取代.异步通知类似于硬件上的"中断"概念,比较准确的称谓是"信号驱动的异步I/O". 9.1 异步通知的概念和作用 异步通知:一旦设备就绪,则主动通知应用程序,该应用程序无需查询设备状态 几种通知方式比较: 阻塞I/O :一直等待设备可访问后开始访问 非阻塞I/O:

第九章 多语言环境的支持和多屏幕的适配(2)

9.3多屏幕的适配 9.3.1屏幕参数的基本概念 Android手机屏幕大小不一,有480x320.640x360.800x480等等,还包括不同屏幕密度,怎样才能让应用程序自动适应不同的屏幕呢? 首先我们来了解几个基本概念: 1)屏幕尺寸Screensize 即显示屏幕的实际大小,按照屏幕的对角线进行测量. 为简单起见,Android把所有的屏幕大小分为四种尺寸:小.普通.大.超大(分别对应:small.normal.large.extralarge). 应用程序可以为这四种尺寸分别提供不同的

《数据结构与算法分析:C语言描述》复习——第九章“图论”——无权值的最短路径问题

2014.07.04 18:24 简介: 给定一个有向图,你可以认为每条边长度都是1(所以叫无权值).下面的算法可以求出从特定的起点到终点的最短路径长度. 描述: 从起点出发,根据当前顶点出发的边进行广度优先搜索,直至找到终点即可.如果搜索结束了仍然没有找到终点,那么起点无法到达终点. 实现: 1 // A simple illustration for unweighted shortest path. Graph represented by adjacency matrix. 2 #inc

操作系统思考 第十一章 C语言中的信号量

第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好方式,但是它们实际上并没有像互斥体和条件变量一样被广泛使用. 尽管如此,还是有一些同步问题可以用信号量简单解决,产生显然更加合适的解决方案. 这一章展示了C语言用于处理信号量的API,以及我用于使它更加容易使用的代码.而且它展示了一个终极挑战:你能不能使用互斥体和条件变量来实现一个信号量? 这一章的

第九章: 输入与输出

@font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @font-face{ font-family:"Arial"; } @font-face{ font-family:"黑体"; } @font-face{ font-family:"微软雅黑"; } p.MsoNormal{ mso-style-name

第九章 当寂寞的男人遇到寂寞的女

道哥说酒吧是男人的战场,女人便是俘虏,我却觉得,酒吧是女人的猎场,男人就是猎物.在这个自由开放的时代,男人寻欢,女人作乐,谁又能主宰得了谁.道哥曾经最大的噩梦是第二天醒来发现女人离去,却留下了一沓钱,道哥像发疯的野兽一样的看着,仿佛那不是钱,而是耻辱.第一次,道哥对于送上门的钱视之如粪土,弃之如敝屐. 这天晚上,明羽和小凡都没有加班,之前道哥说我和小凡不够主动,这样不好,要果断出手,关键时刻敢于亮剑,才可常胜.于是今晚我们三个不再是坐在那里喝酒聊天,而是主动出击,各自寻找目标.道哥说了如果今晚我

语法》第九章 数据类型转换

第二部分  语法 ************第九章 数据类型转换 *************** JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值. 虽然变量没有类型,但是数据本身和各种运算符对运算子是有类型要求的.如果运算符发现,数据的类型与预期不符,就会自动转换类型.比如,减法运算符预期两侧的运算子应该是数值,如果不是,就会自动将它们转为数值. JS有一套数据类型自动转换的规则 一.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数

操作系统思考 第九章 线程

第九章 线程 作者:Allen B. Downey 原文:Chapter 9 Threads 译者:飞龙 协议:CC BY-NC-SA 4.0 当我在2.3节提到线程的时候,我说过线程就是一种进程.现在我会更仔细地解释它. 当你创建进程时,操作系统会创建一块新的地址空间,它包含text段.static段.和堆区.它也会创建新的"执行线程",这包括程序计数器和其它硬件状态,以及运行时栈. 我们目前为止看到的进程都是"单线程"的,也就是说每个地址空间中只运行一个执行线程