上章回顾

编码的规范和程序版式

版权管理和申明

头文件结构和作用

程序命名

程序注释和代码布局规范

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

第九章

第九章

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

预习检查

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

课程目标

本章概述

重点

难点

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

本章目标

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

本章结构

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

嵌入式系统编程性能优化

嵌入式系统编程性能优化

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

灵活的语言机制

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

嵌入性

专用性

计算性

资源受限的环境

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

资源受限的环境

嵌入式应用种类繁多

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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等被剔除了

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

编程调试灵活方便

生成的代码编译效率高

完全模块化

可移植性好

便于项目维护管理

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

模块划分

多任务与单任务

中断服务程序

硬件驱动模块

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                      9.2.1嵌入式编程的环境

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                              9.2.3 多任务与单任务

概念

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

多任务特点

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

嵌入式多任务OS Vxworks

ucLinux

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

初试化各硬件设备;

初始化各软件模块;

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

循坏模式

循坏模式

while(1) {

}

for(;;) {

}

死循坏例子

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

不能返回值;

不能向ISR 传递参数;

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                                               9.2.5 硬件驱动模块

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

中断服务程序ISR

硬件初始化

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

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

阶段小节

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                      9.3 嵌入式系统编程的特点

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                  9.3.1 C语言语法优化

数据类型

关于局部变量

函数操作

语法结构优化

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                 9.3.1.1 数据类型

C语言性能

编译器

硬件系统

设置某些编译器选项

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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; }

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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; }

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

系统寄存器

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

堆栈

                                        9.3.1.3 函数操作 函数优化规则

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

构体传递。

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

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

对齐的原因

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

对齐的作用

提高存取效率

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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 对齐值圆整-结构体成员变量占用总长度需要是对结构体有效对齐

值的整数倍

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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)的值是?? git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

git@github.com: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;

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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;

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

               9.3.1.11 对齐的使用 __align(num)

__packed

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                            9.3.2 关键字volatile

volatile

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

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

主要的应用实例

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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;

会出现什么错误呢?

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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;

会出现什么错误呢?

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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;

会出现什么错误呢?

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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;

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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;

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                                  9.3.4 中断程序

中断程序特性分析

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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);

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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*/

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                         9.3.7 内嵌汇编 内嵌汇编特点

提高运算速度

内嵌汇编语法

例子

_asm{ }

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

void Add(long a, long *b)

{

}

_asm {

}

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

register特点 存放在CPU的寄存器

使用时不需要访问内存

提高效率

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com: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; }

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

                9.3.9 降低内存的使用 RAM 与ROM

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

阶段小节

字节对齐特点和好处

嵌入式中断程序的特点

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

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

如何提供系统内存的利用

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

本章总结

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

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

嵌入式系统编程的环境

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

实验1 题目

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

实验目的

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

实验分析

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

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

git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.gitgit@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git

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

  1. C语言入门---第九章 C语言指针

    没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...

  2. DirectX12 3D 游戏开发与实战第九章内容(上)

    仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...

  3. 第九章 MySQL中LIMIT和NOT IN案例

    第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...

  4. CentOS7安装CDH 第九章:CDH中安装Kafka

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

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

    第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...

  6. ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  7. 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...

  8. [Effective Java]第九章 异常

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

随机推荐

  1. opencv 工程的保存

    一个项目的保存,只要保存工程底下的.CPP  .h   .dll  .lib  输入输出文件即可 最终保存的文件

  2. data属性

    本框架内置组件以及部分插件可以通过data属性来初始化并使用,通常通过data-toggle来调用API(toggle是触发器的意思,例如我们创建一个navtab标签可以通过为a的data-toggl ...

  3. namenode 无法启动之每次开机需要重新格式化-tmp

    最近遇到了一个问题,执行start-all.sh的时候发现JPS一下namenode没有启动        每次开机都得重新格式化一下namenode才可以        其实问题就出在tmp文件,默 ...

  4. 苹果 iOS 8 新固件新功能特性总结汇总 (苹果 iPhone/iPad 最新移动操作系统)

    苹果在 WWDC 2014 大会上正式发布了其最新的 OS X Yosemite 桌面系统以及 iOS 8 移动操作系统,虽然 iOS 8 依然延续了 iOS7 的扁平化设计风格,但在功能上却还是给我 ...

  5. vSphere Client上传镜像

    1. 使用vSphere Client连接到VMware ESXI 2. 打开右侧 [摘要] 选项卡 3. 在 [资源] 中选择存储器中的存储,右键 [浏览数据库存储] 4. 选择工具栏 [创建新文件 ...

  6. php的查询数据

    php中 连接数据库,通过表格形式输出,查询数据.全选时,下面的分选项都选中;子选项取消一个时,全选按钮也取消选中. <!DOCTYPE html PUBLIC "-//W3C//DT ...

  7. Python学习路程day3

    set集合 ​set是一个无序且不重复的元素集合,访问速度快,天生解决重复问题 s1 = set() s1.add('luo')​ s2 = set (['luo','wu','wei','ling' ...

  8. 多比Web 3D展示(3D机房/3D监控)中间件多比Web 3D展示(3D机房/3D监控)中间件免费下载购买地址

    多比3D是实现3D场景搭建的软件开发包,可以创建广泛的3D应用,适用于高端制造.能源.国防军工.教育科研.城市规划及建筑环艺.生物医学等领域的虚拟仿真,应用于虚拟展示.虚拟设计.方案评审.虚拟装配.虚 ...

  9. 深入分析:Fragment与Activity交互的几种方式(一,使用Handler)

    这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...

  10. # 20145210 《Java程序设计》第02周学习总结

    教材学习内容总结 本周我对教材第三章进行了学习,第三章对Java语言的语句.语法.类型.变量的定义等内容进行了比较详细的说明,相比之前的第一章和第二章,我觉得这一章还是比较好理解的,比较容易被接受.J ...