嵌入式系统的c语言。
译自《c for embedded systems》讲稿。
刘永重译。一、c语言基础。
1、什么是c?
c’程序语言最初是由dennis ritchie在2024年为unix系统开发并实现的。c的一个最大优点是与任何特定的硬件或系统无关。这使得一个用户写的程序不作任何修改就能运行在几乎所有的机器上。
c通常被称为中级计算机语言,因为它将高级语言的要素与汇编语言的功能结合了在一起。
2、为什么用c?
c非常灵活,而且可随心所欲。这种自由赋予c非常强大的功能,有经验的用户可以掌握;c是一个相对小的语言,但是它经久耐用;c有时被认为是“高级汇编语言”;低级(位操作)编程也容易实现;松类型(不象其它高级语言);c是结构化编程语言;c允许你创建你脑海中已有的任何任务。
c保留了程序员知道正在做的事情的基本体系;它只需要他们明白地表达其意图。
3、为什么不用c?文化的问题…
当考虑转到c语言时,我们会遇到一些共同的问题:
产生大而低效的**;标准io程序的雍余**(printf,scanf,strcpy等);存贮器定位的使用:malloc(),alloc()…堆栈的使用,在c中不很直接;在ram和rom中数据的声明;难于写中断服务程序。
位微控制器的ansi c
对于嵌入式系统,纯粹的ansi c并不方便,因为:
嵌入式系统与硬件打交道。ansi c 提供的在固定存贮空间用寄存器寻址的工具非常拙劣;几乎所有的嵌入式系统使用中断;ansi c有各种类型的促进规则,对8位机来说绝对是性能杀手;一些微控制器结构没有硬件支持c堆栈;很多微控制器有多个存贮空间。
5、打破一些c范例。
当在低端的8位微控制器上用c语言,应想法使**变小。这意味着打破一些编程规则:
开/关全局中断;使用goto语句;全局标号;全局寄存器段;指针支持。
6、嵌入式与桌面编程。
嵌入式编程环境的主要特点:
有限的ram;有限的rom;有限的栈空间;面向硬件编程;严格的定时(isr,任务,…)很多不同种类的指针(far/near/rom/uni/paged/…)特殊关键字/标识符(@,interrupt,tiny,…)
7、汇编与c
编译器只是一个能干的优秀汇编程序员。
写能够转换为高效率汇编**的好的c**,比手工写高效率的汇编**容易得多。
c是终极解决办法,但其本身并未终结。
8、为什么改用c?
有很多原因用c语言而不用汇编:
c使我们提高效益;用c写的**更可靠;c**更容易升级和扩展;不同平台之间更容易迁移;**容易维护;文档、书籍、第三方库和程序都可得到。
9、c**结构。
如下图所示,一个c程序基本由以下部分组成:
预处理命令、类型定义、函数原型(声明传给函数的函数类型和变量)、变量和函数。
一个程序必须有一个main()函数,每个命令行必须用分号(;)结束。
10、c函数。
11、c关键字。
1)数据类型。
char short signed unsigned int float long double
2) 修饰符。
const static volatile restrict
3)标识符。
struct union void enum
4) 选择体。
if else switch case default
5) 存贮指定。
register typedef auto extern
6)循环体。
do while for
7)跳转。goto continue break return
8)功能指定。
inline
9) 预处理指示。
#include #define #undef #line #error #pragma
10)条件编译。
# if # ifdef # ifndef # elif # else # endif
12、c操作符。
1)基本表达式和后缀操作符。
) 子表达式和函数调用 [ 数组下标 ->结构指针 .结构成员。
+ 增加(后缀减少(后缀)
2) 一元操作符。
逻辑非 ~ 取补 ++增加(前缀) -减少(后缀) -一元减 + 一元加。
类型) 类型强制间接指针 & 取地址 sizeof 大小。
3) 赋值符。
相等赋值 +=加等于 -=减等于 *=乘等于 /=除等于 %=求余等于。
<= 左移位等于 >>右移位等于 &=按位与等于 ^=按位异或等于。
= 按位或等于。
4) 位操作。
位与 ^ 位异或 | 位或 < 位左移 >>位右移。
5)数**算。
乘 / 除 %求余 + 加 - 减。
6) 关系运算。
小于 <=小于或等于 > 大于 >=大于或等于 ==相等测试 !=不等测试。
7) 逻辑运算。
& 逻辑与 ||逻辑或
8) 条件运算。
: 条件测试。
9) 序列。
逗号。二、嵌入式编程。
1、变量。变量的类型决定其可带值的类型。也就是说,为变量选择一个类型与我们使用这个变量的方法直接相关。我们将学习c的基本类型、怎样写常量和声明这些变量。
1.1 选择一个类型。
值集合”是有限的。c的整数类型不能代表所有整数;它的浮点类型也不能代表所有浮点数。当声明一个变量并为它选择一个类型,你应紧记你需要的值和操作。
1.2 c的基本数据类型。
ansi标准并没为本地类型规定尺寸大小,但codewarrior规定了。c只有一些基本数据类型:
所有数量类型(除了char)缺省都是有符号的,例如:‘int’ =signed int’。
注意:int型的大小依赖于不同的机器。
1.3 codewarrior数据类型。
例如,按alt+f7打开工程的通用设置,选择“compiler for hc08”面板并点击类型尺寸。这个窗口向你显示codewarrior 编译器使用的标准类型设置。
所有基本类型可以改变,尽管这可能不是个好主意。
1.4 数据类型的事实。
**大小和执行时间的最大节约可通过为变量选择最合适的数据类型得到。
8位微控制器内部的数据的长度是8位(一字节),然而c首选的数据类型是‘int‘。
8位机处理8位数据类型比16位类型效率更高。
int“和大数据类型只有当所描述的数据的大小需要时才使用。
当效率非常重要时,双精度和浮点操作效率低,应当避免。
1.5 选择数据类型。
8位微控制器选择数据类型有3个规则:
1)用最可能小的类型来完成工作,大小越小占用存贮空间越少;
2)若可能,用无符号类型;
3)在表达式内声明以将数据类型减到最少需要。
使用类型定义得到固定大小:
1)根据编译器和系统而改变;2)移植到不同的机器**不变;3)当值需要固定位时使用。
打开文件:2、存贮类修饰符。
以下关键字用于声明变量,以指定特定需要或内存中变量存贮的相关条件。
static volatile const
这三个关键字,一起让我们不仅可写出好的**,而且可写出紧凑的**。
2.1 静态变量。
使用静态有二个主要功能:
第一个最常用的用法是定义一个变量,在函数连续调用期间,变量不会消失。
第二个使用静态的用法是限制变量的范围。在模块级定义时,能被整个模块中所有函数访问,不能被其它函数访问。这非常重要,因为当严格限制全局变量众所周知的问题时,它让我们获得所有全局变量执行性能的好处。
因此,如果我们有必须被一些函数频繁访问的数据结构,就应当将函数放入同一模块中,并将结构声明为静态。这样所有函数能够访问而不必通过一个访问函数的上层,同时与数据结构无关的**禁止访问它。这一技术是一种变通方法,立即可访问变量在小的机器上实质上取得了足够的性能。
声明模块级静态变量(与将其设为全局相反)能取得一些其他潜在的益处。静态变量由于定义,只能被一组特定的函数访问。因此,编译器和连接器能够明智地选择变量在存贮空间的放置。
例如,对于静态变量,编译器/连接器也许选择将一个模块中所有静态变量放在连续的区域,这样增加了各种优化机会,例如用简单的增加或减少代替重载。相反,全局变量在存贮空间的位置通常计划于优化编译器的哈稀算法,这排除了可能的优化。
须着重指出, 这些变量不会存贮在堆栈中,因为它们必须保存其值。
下面给出一个静态变量怎样工作的例子:
#include <>包含文件。
/中的函数。
void main (void){
/第一次进入myfunction之前,myvar=0。
myfunction在中。
/第二次进入myfunction之前,myvar=1。
myfunction在中。
void myfunction (void){ 中定义。
/myfunction函数。
static char myvar = 0; /本地变量。
/声明为static
myvar = myvar + 1; /尽管myvar是本地变量,但它保持了自己的值。
2.2 静态函数。
一个静态函数只能被其所在模块中的其它函数调用。使用静态函数是结构化编程的好习惯。你也许惊讶地知道静态函数能产生小/快的**。
这是可能的,因为编译器在编译时确切地知道什么函数能调用一个给定的静态函数。因此,函数的相关内存区域能被调整,以致使用调用的一个短版本或跳转指令。潜在的改进甚至更好,编译器足够聪明地用跳转代替调用。
2.3 关键字“static”的使用。
在函数体声明静态的变量,在函数调用期间保持其质;
在模块内声明静态的变量,(但在函数体之外)能被模块内所有函数访问;
嵌入式系统语言
1 填空题。1 嵌入式系统的三要素是嵌入 专用 计算机。2 从嵌入式系统设计的角度来看,嵌入式软件结构可以分为循环轮询系统 前后台系统 单处理器多任务系统以及多处理器多任务系统等几大类。3 衡量系统实时性的主要指标有 响应时间 生存时间 吞吐量。4 软件一般包括 程序 数据和文档。5 嵌入式软件的体...
嵌入式系统嵌入c程序
安阳师范学院计算机与信息工程学院。嵌入式系统 课程设计。实践选题 嵌入式系统嵌入c程序 专业班级。指导教师。姓名学号。成绩评定。题目 嵌入式系统嵌入c程序。一 问题描述及分析。设计裁剪镜像,设计文件镜像系统,文件镜像系统的整套文件目录,内核 zimage 文件的烧写,文件系统的烧写,自己的c程序放入...
嵌入式系统高级C语言编程笔记
嵌入式c语言的基本数据类型。char长度为1byte,即8位。int长度为4byte,即32位。unsigned int 简称unsigned 负数在计算机中存储时一般用补码表示。define uchar unsigned char define u8 unsigned char define ui...