第九章 C语言在嵌入式中的应用
上章回顾
编码的规范和程序版式
版权管理和申明
头文件结构和作用
程序命名
程序注释和代码布局规范
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语言在嵌入式中的应用的更多相关文章
- C语言入门---第九章 C语言指针
没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...
- DirectX12 3D 游戏开发与实战第九章内容(上)
仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...
- 第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...
- CentOS7安装CDH 第九章:CDH中安装Kafka
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- 操作系统思考 第十一章 C语言中的信号量
第十一章 C语言中的信号量 作者:Allen B. Downey 原文:Chapter 11 Semaphores in C 译者:飞龙 协议:CC BY-NC-SA 4.0 信号量是学习同步的一个好 ...
- ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...
- [Effective Java]第九章 异常
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
随机推荐
- C++中的容器类详解
一.STL容器类 STL(Standard Template Library)的六大组件:容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
- S5PV210之添加缺少的-内核提供的'.h'文件 linux3.0.8驱动
怎样解决编译时出现内核提供的函数或变量没有定义,使用source insight搜索功能找到声明的头文件,然后包含该头件就行了: 比如: error: implicit declaration of ...
- C++学习之类的构造函数、析构函数
在C++的类中,都会有一个或多个构造函数.一个析构函数.一个赋值运算操作符.即使我们自己定义的类中,没有显示定义它们,编译器也会声明一个默认构造函数.一个析构函数和一个赋值运算操作符.例如: //声明 ...
- web api post传一个参数时 值永远是null
这个问题纠结了我一个早上,不管用什么样的传参方法,走到控制器中,那个参数永远不变的等于null 在网上找了很多解决方案 上面这个是从网上截图的,第一:要将参数标记为[FromBody],变为简单参数 ...
- .net CHARTING图表控件下载地址
.net CHARTING是一款功能强大的图表控件,利用.NET framework和GDI+为工作于ASP.NET和Winform的C#和VB.NET开发人员提供可托管的图表解决方案,提供了多种2D ...
- Osmocom-BB中cell_log的多种使用姿势
转载留做备份,原文地址:http://92ez.com/?action=show&id=23342 翻阅osmocom-bb源码的时候注意到,在cell_log中有非常多我们从来没有注意到的功 ...
- 解决:信息中插入avi格式的视频时,提示“unsupported video format”
[测试步骤]:新建信息,添加AVI格式的视频 [测试结果]:添加时弹出提示"unsupported video format" 该问题主要提现在手机彩信视频附件不支持该AVI格式的 ...
- Sheet can not be presented because the view is not in a window的解决办法,和window的简单使用
Sheet can not be presented because the view is not in a window,顺便在stackoverflow上找了答案,希望能给大家带来帮助,在此感谢 ...
- # 20145210 《Java程序设计》第02周学习总结
教材学习内容总结 本周我对教材第三章进行了学习,第三章对Java语言的语句.语法.类型.变量的定义等内容进行了比较详细的说明,相比之前的第一章和第二章,我觉得这一章还是比较好理解的,比较容易被接受.J ...
- CodeForces 414D (贪心)
problem Mashmokh and Water Tanks 题目大意 给你一棵树,k升水,p块钱,进行一次游戏. 在游戏进行前,可以在任意个节点上放置1升水(总数不超过k) 游戏进行若干轮,每轮 ...