嵌入式C语言程序设计基础

上传人:jun****875 文档编号:24402892 上传时间:2021-06-29 格式:PPT 页数:117 大小:270KB
收藏 版权申诉 举报 下载
嵌入式C语言程序设计基础_第1页
第1页 / 共117页
嵌入式C语言程序设计基础_第2页
第2页 / 共117页
嵌入式C语言程序设计基础_第3页
第3页 / 共117页
资源描述:

《嵌入式C语言程序设计基础》由会员分享,可在线阅读,更多相关《嵌入式C语言程序设计基础(117页珍藏版)》请在装配图网上搜索。

1、第 5章 嵌 入 式 C语 言 程 序 设 计 基 础5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 5.3 程 序 的 控 制 结 构 5.4 函 数 5.5 数 组 5.6 指 针 5.7 构 造 数 据 类 型 5.8 汇 编 语 言 与 C/C+的 混 合 编 程5.9 嵌 入 式 Linux下 C语 言 编 程 文 件 的 操 作 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令1 文 件 包 含 伪 指 令 文 件 包 含 伪 指 令 可 将 头 文 件 包 含 到 程 序 中 ,头 文 件 中 定 义 的

2、内 容 符 号 常 量 , 复 合 变 量 原 型 、用 户 定 义 的 变 量 原 型 和 函 数 的 原 型 说 明 等 。 编译 器 编 译 预 处 理 时 用 文 件 包 含 的 正 文 件 内 容 替换 到 实 际 程 序 中 。( 1) 文 件 包 含 伪 指 令 的 格 式# include ; 标 准 头 文 件# include “ 头 文 件 名 .h” ; 自 定 义 头 文 件# include 宏 标 识 符 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令( 2) 包 含 文 件 伪 指 令 的 说 明 常 在 头 文 件 名 后 用 .h作 为 扩 展 名

3、 , 可 带 或 不带 路 经 。 头 文 件 可 分 为 标 准 头 文 件 和 自 定 义 头 文 件 。 尖 括 号 内 的 头 文 件 为 标 准 头 文 件 , 由 开 发环 境 或 系 统 提 供 。 双 引 号 内 的 头 文 件 为 用 户 自 定 义 头 文 件 。搜 索 时 , 首 先 在 当 前 目 录 中 搜 索 , 其 次 按 环境 变 量 include指 定 的 目 录 顺 序 搜 索 。 搜 索 到 头 文 件 后 , 就 将 该 伪 指 令 直 接 用 头 文件 内 容 替 换 。 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令例 5.1 标 准 头

4、 文 件 定 义# include # include string.h和 stdio.h是 标 准 头 文 件 , 按 环 境 变 量 include指 定 的 目 录 顺 序 搜 索 string.h和 stdio.h。例 5.2 用 户 自 定 义 头 文 件 定 义 # include “ s3c2410-adc.h” s3c2410-adc.h头 文 件 是 用 户 自 定 义 有 关 三 星s3c2410的 ARM处 理 器 的 A/D转 换 器 各 寄 存 器 。 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令2 宏 定 义 伪 指 令宏 定 义 伪 指 令 分 为 :

5、 简 单 宏 、 参 数 宏 、 条 件 宏 、 预 定 义 宏 及宏 释 放 。( 1) 简 单 宏格 式 如 下 :# define 宏 标 识 符 宏 体 宏 体 是 由 单 词 序 列 组 成 。 宏 体 超 长 时 , 允 许 使 用 续 行 符“ ” 进 行 续 行 , 续 行 符 和 其 后 的 换 行 符 n 都 不 会 进 入 宏 体 。 在 定 义 宏 时 , 应 尽 量 避 免 使 用 C语 言 的 关 键 字 和 预 处 理 器的 预 定 义 宏 , 以 免 引 起 灾 难 性 的 后 果 。 在 源 文 件 中 , 用 预 处 理 器 伪 指 令 定 义 过 宏 标

6、识 符 之 后 ,就 可 用 宏 标 识 编 写 程 序 。 当 源 文 件 被 预 处 理 器 处 理 时 , 每 遇 到 该 宏 标 识 符 , 预 处 理 器 便 将 宏 展 为 宏 体 。 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令( 2) 参 数 宏格 式 如 下 :# define 宏 标 识 符 ( 形 式 参 数 表 ) 宏 体 形 式 参 数 表 为 逗 号 分 割 的 形 式 参 数 。 宏 体 是 由 单 词 序 列 组 成 。 宏 体 超 长 时 , 允 许 使 用续 行 符 “ ” 进 行 续 行 , 续 行 符 和 其 后 的 换 行 符 n 都 不

7、会 进 入 宏 体 。 使 用 参 数 宏 时 , 形 式 参 数 表 应 换 为 同 样 个 数 的 实参 数 表 , 这 一 点 类 似 于 函 数 的 调 用 。 参 数 宏 与 函 数的 区 别 在 于 参 数 宏 的 形 参 数 表 中 没 有 类 型 说 明 符 。 预 处 理 器 在 处 理 参 数 宏 时 使 用 2遍 宏 展 开 。 第 1遍展 开 宏 体 , 第 2遍 对 展 开 后 的 宏 体 用 实 参 数 替 换 形式 参 数 。 例 5.3 在 Linux系 统 的 /include/asm-arm/arch-s3c2410/S3C2410.h头 文 件 中 定 义

8、 了 各 Nand Flash控 制 寄存 器 , 其 源 代 码 如 下 :#define bNAND_CTL(Nb) _REG(0 x4e000000 + (Nb)#define NFCONF bNAND_CTL(0 x00)#define NFCMD bNAND_CTL(0 x04)#define NFADDR bNAND_CTL(0 x08)#define NFDATA bNAND_CTL(0 x0c)#define NFSTAT bNAND_CTL(0 x10)#define NFECC bNAND_CTL(0 x14)5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令 5.1

9、 嵌 入 式 C语 言 的 预 处 理 伪 指 令例 5.4 在 Linux下 ARM S3C2410X芯 片 的 A/D转 换 的 驱 动程 序 的 头 文 件 s3c2410-adc.h中 定 义 了 下 面 三 个 宏 。#define ADC_WRITE(ch, prescale) (ch)16) /*定 义 ADC设 备 的 主 设 备 号 */typedef struct struct semaphore lock; /*内 核 信 号 量 , 当 多 个 用 户 程 序 同 时访 问 一 个 ADC控 制 器 时 , 用 lock 进 行 同 步 */wait_queue_hea

10、d_t wait; /*等 待 队 列 */int channel; /*ADC通 道 号 */int prescale; /*预 定 标 值 */ADC_DEV;5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令 static ADC_DEV adcdev;#define START_ADC_AIN(ch, prescale) do ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT(ch) ; ADCCON |= ADC_START; while(0)/*设 置 S3C2410X的 ADC的 通 道 为 ch、 预 定 标 值 为p

11、rescale*/ PRESCALE_EN宏 对 应 ARM S3C2410X芯 片 的 A/D转 换 控 制 寄 存器 的 第 14位 PRSCEMN, 即 A/D转 换 器 预 标 器 使 能 ;/ PRSCVL宏 对 应 ARM S3C2410X芯 片 的 A/D转 换 控 制 寄 存 器 的 第6位 , 设 置 预 定 标 值 ;/ ADC_INPUT 宏 对 应 ARM S3C2410X芯 片 的 A/D转 换 控 制 寄 存器 的 第 3 5位 , 选 择 通 道 号 ;/ADCCON |= ADC_START; ADCCON 0 为 置 1, 准 备 采 集 数 据5.1 嵌 入

12、 式 C语 言 的 预 处 理 伪 指 令 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令( 3) 条 件 宏 定 义格 式 如 下 :格 式 1:# ifdef 宏 标 识 符 # undef 宏 标 识 符 # define 宏 标 识 符 宏 体# else # define 宏 标 识 符 宏 体# endif 格 式 2:# ifndef 宏 标 识 符 # define 宏 标 识 符 宏 体# else # undef 宏 标 识 符# define 宏 标 识 符 宏 体# endif其 中 : 格 式 1是 测 试 存 在 , 格 式 2是 测 试 不 存 在 。

13、else可 有 , 也 可 没 有 。5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令( 4) 宏 释 放用 于 释 放 原 先 定 义 的 宏 标 识 符 。 经 释 放 后 的 宏 标 识 符可 再 次 用 于 定 义 其 他 宏 体 。格 式 如 下 :# undef 宏 标 识 符例 5.6 #define SIZE 512 buf=SIZE*blks /*宏 扩 展 为 buf=512*blks; */undef SIZE #define SIZE 128buf=SIZE*blks /*宏 扩 展 为 buf=128*

14、blks; */ 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令3 条 件 编 译 伪 指 令格 式 如 下 :# if( 条 件 表 达 式 1) # elif ( 条 件 表 达 式 2) # elif ( 条 件 表 达 式 3)# elif ( 条 件 表 达 式 n)# else# endif 5.1 嵌 入 式 C语 言 的 预 处 理 伪 指 令例 5.7 # if _B0SIZE=B0SIZE_BYTEtypedef unsigned char PB0SIZE;# elif _B0SIZE=B0SIZE_SHORTtypedef unsigned short PB0S

15、IZE;# elif _B0SIZE=B0SIZE_WORDtypedef unsigned long PB0SIZE;# endif 5.2嵌 入 式 C语 言 的 基 本 数 据 类 型 5.2.1 数 据 类 型 与 表 达 式 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型(1) 类 型 修 饰 符 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型(2) 访 问 修 饰 符 C语 言 有 两 个 用 于 控 制 访 问 和 修 改 变 量 方 式 的 修 饰 符 ,分 别 是 常 量 (const)和 易 变 量 (volatile)。 带 const修 饰 符 定义

16、 出 的 常 量 在 程 序 运 行 过 程 中 始 终 保 持 不 变 。例 如 : const int num; 例 如 : const int num=100; volatile修 饰 符 用 于 提 醒 编 译 程 序 , 该 变 量 的 值 可 以不 通 过 程 序 中 明 确 定 义 的 方 法 来 改 变 。const和 volatile可 以 同 时 使 用 。例 如 , 假 设 0 x30是 一 个 只 随 外 部 条 件 而 变 化 的 口 地址 值 , 那 么 就 恰 好 需 要 用 下 述 说 明 来 避 免 偶 然 因 素 所 产生 的 副 作 用 的 影 响 。 c

17、onst volatile unsigned char *port=0 x30; 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型2. 构 造 数 据 类 型 n 数 组 是 一 组 连 续 、 有 序 的 存 放 在 一 起 的 具 有 相同 类 型 的 数 据 。n 结 构 体 是 将 不 同 类 型 的 数 据 按 一 定 顺 序 存 放 在一 起 的 数 据 结 构 。n 共 用 体 是 将 不 同 类 型 的 数 据 都 存 放 在 同 一 起 始地 址 的 内 存 单 元 中 , 共 用 一 段 内 存 以 节 省 内 存 单元 。 n 枚 举 是 只 有 几 种 可 能

18、的 值 , 将 其 一 一 列 举 出 来 。实 际 是 用 符 号 来 表 示 若 干 个 可 取 的 整 型 值 , 它 是整 型 的 一 个 子 集 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型3. 指 针 类 型 n 指 针 可 以 有 效 地 表 示 复 杂 的 数 据 结 构 ; 能 动态 分 配 内 存 ; 能 方 便 地 使 用 字 符 串 ; 有 效 而方 便 地 使 用 数 组 ; 在 调 用 函 数 时 能 得 到 多 于一 个 的 值 ; 能 直 接 处 理 内 存 地 址 等 。n 指 针 类 型 迥 异 于 前 述 各 种 数 据 类 型 , 不 管

19、 是简 单 类 型 的 数 据 , 还 是 构 造 类 型 数 据 , 均 是代 表 数 据 的 , 而 指 针 类 型 是 代 表 地 址 的 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型5.2.2 常 量1. 数 值 常 量 (1) 整 型 常 量 整 型 常 量 也 称 为 整 型 常 数 或 整 数 。C整 型 常 量 按 进 制 分 可 分 为 十 进 制 整 数 , 八 进制 整 数 和 十 六 进 制 整 数 。(2) 实 型 常 量实 型 常 量 有 单 精 度 实 型 常 量 和 双 精 度 实 型 常 量 。可 用 小 数 形 式 或 指 数 形 式 表 示

20、 。(3) 字 符 常 量 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型2. 字 符 串 常 量 字 符 串 常 量 简 称 字 符 串 , 是 用 一 对 双 引 号 括起 来 的 字 符 序 列 。 例 如 “ China” 就 是 一 个 字 符 串 常 量 。若 数 字 被 定 义 为 字 符 型 之 后 就 不 能 参 与 数 值运 算 , 如 5和 5是 不 同 的 。 5是 字 符 常 量 , 不能 直 接 参 与 运 算 , 而 只 能 以 其 ASCII码 值 ( 0 x35)来 参 与 运 算 。 5.2

21、 嵌 入 式 C语 言 的 基 本 数 据 类 型3. 符 号 常 量( 1) 不 带 参 数 的 宏 定 义 宏 定 义 命 令 define的 一 般 形 式 是 : define 宏 名 字 符 串 用 来 终 止 宏 名 作 用 域 命 令 undef的 一 般 形 式 是 : undef 宏 名 例 5.8: define PI 3.14159 /*定 义 PI为 常 量 , 其 值 是 3.14159 */main( ) undef PI /*终 止 宏 名 PI的 作 用 域 */f1( ) 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型( 2) 带 参 数 的 宏 定

22、 义 它 不 是 进 行 简 单 的 字 符 串 替 换 , 还 要 进 行 参 数 替 换 。 其 定 义 的 一 般 形 式 为 : define 宏 名 (参 数 表 ) 字 符 串 其 中 字 符 串 中 包 括 参 数 表 中 所 指 定 的 参 数 。 在 使 用 时 ,要 将 程 序 中 宏 名 后 的 实 际 参 数 代 入 字 符 串 中 参 数 的 位 置 。例 如 : define S(a, b) a*b area=S(3, 2); 经 编 译 预 处 理 , 该 语 句 被 展 开 成 area=3*2; 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 说 明

23、 : (1) 宏 名 和 参 数 表 左 括 号 之 间 不 能 有 空 格 , 否 则 按 不 带 参 宏 替换 了 。 (2) 字 符 串 中 应 注 意 括 号 的 使 用 , 以 保 证 运 算 次 序 。 如 上 例 改成 area=S(1+2, 2); 经 展 开 后 变 成 area=1+2*2; 这 就 不 合 要 求 了 。 此 时 , 可 改 写 成 define S(a, b) (a)*(b) area=S(1+2, 2)经 展 开 后 变 成 area=(1+2)*(2); 就 不 会 出 现 错 误 了 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型5.

24、2.3 变 量 1. 变 量 的 定 义 变 量 定 义 的 一 般 形 式 如 下 : 存 储 类 型 类 型 说 明 符 修 饰 符 标 识 符 =初值 , 标 识 符 =初 值 ;变 量 的 定 义 由 5部 分 组 成 , 方 括 号 中 的 可 有 可 无 ,变 量 定 义 的 具 体 情 况 而 定 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型( 1) 类 型 说 明 符 对 于 数 字 与 字 符 , 其 常 用 的 类 型 主 要 有 8种 : char、 unsigned char、 int、 unsigned、 long、 unsigned long、 fl

25、oat、 double。 void 类 型 ( 抽 象 型 ) , 在 具 体 化 时 可 用 类 型 强 制 来 指 定 类 型说 明 符 中 的 任 意 一 类 。 通 过 typedef定 义 的 类 型 别 名 。 为 了 增 加 程 序 的 可 读 性 和 移 植程 序 时 的 方 便 , C语 言 允 许 用 户 为 C语 言 固 有 的 类 型 用 typedef起 别 名 。格 式 如 下 :typedef C固 有 的 简 单 类 型 或 复 合 类 型 别 名 标 识 符 ;用 别 名 代 替 原 来 的 类 型 , 在 说 明 中 用 作 类 型 说 明 符 。 别 名

26、一 般 用大 写 字 符 , 例 如 : typedef long BIGBIG x=80000; 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型(2) 标 识 符 变 量 名 可 以 是 C语 言 中 允 许 的 合 法 标 识 符 。 每 一 个 变 量 都 必 须 进 行 类 型 说 明 , 也 就 是 变 量 要 先 定 义 , 后使 用 。 当 一 个 变 量 被 指 定 为 某 一 确 定 类 型 时 , 将 为 它 分 配 若 干 相 应字 节 的 内 存 空 间 。 如 在 32位 体 系 的 ARM系 统 中 , char型 为 1字节 , int型 为 4字 节

27、, float为 4字 节 , double为 8字 节 。 当 然 , 不同 的 体 系 结 构 的 系 统 可 能 稍 有 差 异 。 变 量 可 以 在 程 序 内 的 三 个 地 方 定 义 : 在 函 数 内 部 , 在 函 数 的参 数 ( 形 参 ) 定 义 中 或 在 所 有 的 函 数 外 部 。 由 此 定 义 的 变 量 分别 称 为 局 部 变 量 , 形 式 参 数 和 全 局 变 量 。 在 不 同 地 方 定 义 的变 量 , 其 作 用 域 范 围 不 同 。 在 同 一 层 次 定 义 的 变 量 不 能 与 数 组 、指 针 、 函 数 和 其 它 变 量

28、同 名 。 变 量 是 用 来 存 放 数 据 的 , 由 于 数 据 有 不 同 的 类 型 , 因 此 要 定 义 相 应 类 型 的 变 量 去 存 放 它 。 这 些 数 据 称 为 相 应 变 量 的 值 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 (3) 存 储 类 型 存 储 类 型 指 定 被 说 明 对 象 所 在 内 存 区 域 的 属 性 。 存 储 空 间 分 为 代 码 区 与 数 据 区 两 个 部 分 。 变 量 存 储 在 数 据 区 ,数 据 区 又 可 分 为 静 态 存 储 区 与 动 态 存 储 区 。 n 静 态 存 储 是 指 在

29、程 序 运 行 期 间 给 变 量 分 配 固 定 存 储 空 间 的 方 式 。如 全 局 变 量 存 放 在 静 态 存 储 区 中 , 程 序 运 行 时 分 配 空 间 , 程 序运 行 完 释 放 。n 动 态 存 储 是 指 在 程 序 运 行 时 根 据 实 际 需 要 动 态 分 配 存 储 空 间 的方 式 。 如 形 式 参 数 存 放 在 动 态 存 储 区 中 , 在 函 数 调 用 时 分 配 空间 , 调 用 完 成 释 放 。 n 对 于 静 态 存 储 方 式 的 变 量 可 在 编 译 时 初 始 化 , 默 认 初 值 为 0或空 字 符 。 对 动 态 存

30、 储 方 式 的 变 量 如 不 赋 初 值 , 则 它 的 值 是 一 个不 确 定 的 值 。 n 在 C语 言 中 , 具 体 的 存 储 类 别 有 自 动 ( auto) 、 寄 存 器( register) 、 静 态 ( static) 及 外 部 ( extern) 四 种 。 静 态 存 储类 别 与 外 部 存 储 类 别 变 量 存 放 在 静 态 存 储 区 , 自 动 存 储 类 别 变量 存 放 在 动 态 存 储 区 , 寄 存 器 存 储 类 别 直 接 送 寄 存 器 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 局 部 变 量 的 存 储 方

31、 式 局 部 变 量 一 般 用 自 动 方 式 存 储 , 用 保 留 字 auto加 以 定义 , 此 时 称 为 自 动 变 量 , 是 动 态 存 储 , 在 函 数 的 调 用 过程 中 存 在 , 由 编 译 系 统 自 动 处 理 。 例 如 :void f( ) auto int i, j; auto float x, y; /*局 部 变 量 i, j, x, y以 自 动 方 式 存 储 */ C语 言 规 定 , 自 动 变 量 可 省 去 说 明 符 auto。 如 果 希 望函 数 调 用 完 后 局 部 变 量 的 值 被 保 留 , 不 释 放 其 所 占 存 储

32、单 元 , 这 时 必 须 将 其 存 储 方 式 定 义 为 静 态 存 储 方 式 , 用保 留 字 static加 以 定 义 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 全 局 变 量 的 存 储 方 式 全 局 变 量 一 般 用 外 部 存 储 方 式 存 储 , 用 保 留字 extern加 以 定 义 。 变 量 的 作 用 域 是 构 成 整 个 程 序 的 所 有 程 序 文件 , 也 就 是 定 义 的 外 部 变 量 可 供 其 它 程 序 文 件 使用 。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型例 如 5.9 程 序 由 两 个 程

33、 序 文 件 file1.c与 file2.c组 成 。/*file1.c*/extern int a; /*定 义 extern存 储 方 式 变 量 a*/main( ) int pow( ); int n; int p; scanf( %d , p=pow( n) ; printf( p=%dn , p) ; 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型/*file2.c*/extern int a; /*申 明 本 文 件 中 使 用 的 是 已 定义 的 外 部 变 量 a*/int pow( x) int x; int i, t=1; for( i=1; i、 =、 、

34、 、 =、 、 31);运 行 输 出 结 果 为 0。 因 为 两 个 是 同 一 优 先 级 , 53的 结 果 为1, 而 11的 关 系 不 满 足 , 所 以 最 后 结 果 为 0。又 如 : printf( %dn ,1=1135);运 行 输 出 结 果 为 1。 因 为 的 优 先 级 比 =高 , 则 1135的 结 果 为 1, 而 1=1的 关 系 满 足 , 所 以 最 后 结 果 为 1。 5.2 嵌 入 式 C语 言 的 基 本 数 据 类 型 3. 位 运 算 符 5.3 程 序 的 控 制 结 构 5.3 程 序 的 控 制 结 构 程 序 控 制 语 句 用

35、 于 控 制 程 序 的 流 程 , 以实 现 程 序 的 各 种 结 构 方 式 。 包 括 :条 件 判 断 语 句 : if , switch循 环 执 行 语 句 : do while, while, for转 向 语 句 : break, goto, continue, return 5.3 程 序 的 控 制 结 构 5.3.1 选 择 结 构 用 if语 句 可 以 实 现 简 单 选 择 结 构 。 其 语 法 形 式 为if(表 达 式 ) 语 句 1else 语 句 2 执 行 顺 序 是 : 首 先 计 算 表 达 式 的 值 , 若 表 达 式值 为 true, 则 执

36、 行 语 句 1; 否 则 执 行 语 句 2。if语 句 中 的 语 句 2可 以 为 空 , 当 语 句 2为 空 时 ,else可 以 省 略 , 成 为 如 下 形 式 :if(表 达 式 ) 语 句 1 其 中 , 语 句 1和 语 句 2不 仅 可 以 是 一 条 语 句 , 而 且可 以 是 大 花 括 号 括 起 来 的 多 条 语 句 , 即 复 合 语 句 。 5.3 程 序 的 控 制 结 构 5.3.2 switch语 句switch语 句 的 语 法 形 式 如 下 :switch(表 达 式 ) case 常 量 表 达 式 1: 语 句 1case 常 量 表 达

37、 式 2: 语 句 2case 常 量 表 达 式 n: 语 句 ndefault: 语 句 n+1 5.3 程 序 的 控 制 结 构 5.3.3 循 环 结 构 嵌 入 式 Lunux C语 言 中 有 三 种 循 环 控 制 语 句 ,即 while, do while, for循 环 语 句 。 while和 do while是 两 种 不 同 的 循 环 结 构 , 即 当 型 循 环 和 直 型 循环 , 其 格 式 如 下 :1 while语 句 ( 当 型 循 环 )while语 句 的 语 法 形 式 为 : while(表 达 式 ) 循 环 体 语 句 5.3 程 序 的

38、 控 制 结 构 5.3.3 循 环 结 构 2 do-while语 句 ( 直 型 循 环 )语 法 形 式 :do 循 环 体 语 句 while(表 达 式 ); 执 行 顺 序 是 : 当 流 程 执 行 到 do后 , 立 即 执 行循 环 体 语 句 , 然 后 再 判 断 循 环 条 件 表 达 式 的 值 。 当表 达 式 为 true时 , 继 续 执 行 循 环 体 ; 否 则 结 束 循 环 ,该 语 句 结 构 使 循 环 至 少 执 行 一 次 。 5.3 程 序 的 控 制 结 构 3 for语 句 for语 句 的 使 用 最 为 灵 活 , 既 可 以 用 于

39、循 环 次 数 确 定的 情 况 , 也 可 以 用 于 循 环 次 数 未 知 的 情 况 。 for语 句 的 语法 形 式 如 下 : for(表 达 式 1; 表 达 式 2; 表 达 式 3) for语 句 的 执 行 流 程 为 :(1) 首 先 计 算 表 达 式 1的 值 。(2) 再 计 算 表 达 式 2, 如 果 表 达 式 2的 值 为 false, 则 退出 循 环 。(3) 如 果 表 达 式 2的 值 为 true, 则 执 行 一 次 循 环 体 , 然后 计 算 表 达 式 3的 值 。(4) 转 回 (2), 表 达 式 2的 值 决 定 是 否 继 续 执

40、 行 循 环 体 。 5.3 程 序 的 控 制 结 构 5.3.4 其 他 控 制 语 句1 break语 句 break 语 句 只 用 于 switch语 句 或 循 环 体 中 , 作 用 是 使程 序 从 switch语 句 内 跳 出 或 结 束 本 次 循 环 , 转 去 执 行 后 面 的语 句 。 由 于 break语 句 的 转 移 方 向 是 明 确 的 , 所 以 不 需 要 语 句标 号 与 之 配 合 。2 continue语 句 continue语 句 仅 用 于 循 环 体 中 , 其 作 用 是 结 束 本 次 循环 , 接 着 开 始 判 断 循 环 条 件

41、 , 决 定 是 否 继 续 执 行 下 一 次 循 环 。3 goto语 句goto语 句 的 语 法 格 式 为goto goto语 句 的 作 用 是 跳 转 到 语 句 标 号 处 执 行 程 序 。 5.4 函 数 5.4 函 数 1 函 数 定 义 一 个 完 整 的 函 数 定 义 由 两 部 分 组 成 , 即 函 数 头 与 函 数体 。 函 数 定 义 的 一 般 语 法 形 式 为 : (形 式 参 数 表 ) 说 明 性 语 句 序 列 ;实 现 函 数 功 能 的 语 句 系 列 ; 其 中 , 类 型 标 识 符 规 定 了 函 数 的 返 回 值 类 型 。 函

42、数 的 返回 值 是 返 回 给 主 调 函 数 的 处 理 结 果 , 由 函 数 体 部 分 的 return语 句 带 回 。 无 返 回 值 的 函 数 其 类 型 标 识 符 为 void, 不 必 有return语 句 。 形 式 参 数 表 ( 简 称 形 参 表 ) 的 内 容 如 下 : 类 型 l 形 参 名 1, 类 型 2 形 参 名 2, , 类 型 n 形 参 名 n 5.4 函 数2 调 用 函 数 调 用 函 数 必 须 遵 守 先 定 义 后 调 用 的 原 则 , 否 则 ,需 要 在 调 用 函 数 之 前 在 主 调 函 数 中 声 明 函 数 原 型

43、。函 数 原 型 声 明 形 式 :( 1) (参 数 类 型 1,参 数 类 型 2 );( 2) (参 数 类 型 1 参数 名 1, 参 数 类 型 2 参 数 名 2 );函 数 的 调 用 形 式 :(实 参 1, 实 参 2, , 实 参 n) 5.4 函 数 例 如 在 中 出 现 的create_mapping函 数 定 义 ( 省 略 了 括 号 内 “ ” 的 语 句 ) 。 static void _init create_mapping(struct map_desc *md) 定 义 这 个 函 数 的 各 项 含 义 如 下 : ( 1) 类 型 说 明 符 sta

44、tic void _init, 其 中 的 static 说 明 符 用 于 指 明 这 个 静 态 的 函 数 只 可 被 这 一 文 件 内 的 其 他 函 数调 用 。 void 说 明 符 指 明 该 函 数 是 无 返 值 类 型 。 而 _init是宏 定 义 的 说 明 符 。( 2) 函 数 名 为 create_mapping。( 3) 这 个 函 数 只 有 一 个 形 式 参 数 md, 其 形 参 类 说 明 符 是 struct map_desc *, 是 一 个 指 向 结 构 体 map_desc的 指 针 。 5.4 函 数 3 内 联 函 数 内 联 函 数

45、与 一 般 函 数 不 同 的 是 , 它 不 是 在调 用 时 发 生 转 移 , 而 是 在 编 译 时 将 函 数 体 嵌 入 在 每 一个 调 用 语 句 处 。 这 样 就 相 对 节 省 了 参 数 传 递 、 系 统 栈的 保 护 与 恢 复 等 的 开 销 。 内 联 函 数 的 定 义 形 式 为 : (含类 型 说 明 的 形 参 表 ) 函 数 体 5.4 函 数例 5.12 内 联 函 数 例 题 。 #include #include inline int max(int a,int b) if(ab) return a;else return b; void mai

46、n()int a,b,c,d;a=210;b=150;c=20;d=max(a,b);d=max(d,c);/编 译 时 两 个 调 用 处 均 被 替换 为 max函 数 体 语 句printf( The biggest of %d %d %d is %d, a,b,c,d) 程 序 运 行 结 果 为The biggest of 210 150 20 is 210 5.4 函 数4 系 统 函 数 的 使 用 系 统 函 数 的 原 型 声 明 由 系统 提 供 , 并 且 已 分 类 存 于 不 同的 头 文 件 中 。 用 include指 令 嵌 入 相 应头 文 件 , 然 后 可

47、 使 用 系 统 函 数 。include指 令 格 式 如 下 。# include 其 中 : 头 文 件 名 可 带 或 不带 路 经 , 尖 括 号 内 为 标 准 头 文件 , 由 开 发 环 境 或 系 统 提 供 。若 头 文 件 为 用 户 自 定 义 头 文 件 ,则 头 文 件 在 双 引 号 内 。 例 5.13 标 准 头 文 件 定义 # include # include string.h和 types.h是 标 准 头 文 件 , 按 环 境 变量 include指 定 的 目 录 顺序 搜 索 string.h和 types.h。 5.4 函 数4 系 统 函

48、数 的 使 用 系 统 函 数 的 原 型 声 明 由 系统 提 供 , 并 且 已 分 类 存 于 不 同的 头 文 件 中 。 用 include指 令 嵌 入 相 应头 文 件 , 然 后 可 使 用 系 统 函 数 。include指 令 格 式 如 下 。# include 其 中 : 头 文 件 名 可 带 或 不带 路 经 , 尖 括 号 内 为 标 准 头 文件 , 由 开 发 环 境 或 系 统 提 供 。若 头 文 件 为 用 户 自 定 义 头 文 件 ,则 头 文 件 在 双 引 号 内 。 例 5.13 标 准 头 文 件 定义 # include # include

49、 string.h和 types.h是 标 准 头 文 件 , 按 环 境 变量 include指 定 的 目 录 顺序 搜 索 string.h和 types.h。 5.5 数 组 1. 一 维 数 组(1) 数 组 的 定 义 数 组 在 使 用 前 必 须 先 声 明 。 声 明 一 个 一 维 数 组 的 形 式 如 下 : 数 组 长 度 注 意 : 数 组 长 度 是 个 常 量 表 达 式 。 数 组 中 的 每 个 元 素 可 以 当 成 普 通 的 变 量 使 用 。 访 问 一 维 数 组 元 素 的 形 式 如 下 : 下 标 注 意 : 下 标 的 值 也 是 从 0开

50、 始 , 不 能 超 过 该 维 的长 度 减 1。 5.5 数 组 ( 2) 数 组 的 初 始 化 数 组 的 初 始 化 有 以 下 几 种 方 式 。 形 式 1: 定 义 时 整 体 初 始 化 与 变 量 在 定 义 时 初 始 化 一 样 , 数 组 也 可 以 在定 义 时 进 行 初 始 化 , 格 式 如 下 : 数 组 长 度 =第 0个元 素 值 , 第 1个 元 素 值 , , 第 n-1个 元 素 值 ; 例 如 对 字 这 符 数 组 进 行 初 始 化 : char a10=a,b,c,d,e,f,g,h,j,k; 5.5 数 组 形 式 2: 定 义 时 部

51、分 初 始 化 数 组 在 定 义 时 可 对 其 中 的 部 分 数 据 进 行 初 始 化 。 当 “ ”中 值 的 个 数 少 于 元 素 个 数 时 , 只 给 前 面 部分 元 素 赋 值 。 例 如 如 下 定 义 就 是 对 数 组 的 前 5个 数 据 初 始 化 ,而 后 5个 数 据 自 动 赋 0( 在 字 符 数 组 中 自 动 赋 0) 。 char a10=a,b,c,d,e; 5.5 数 组 形 式 3: 数 组 全 部 赋 值 若 想 要 对 数 组 中 元 素 全 部 赋 值 , 则 可 以 省 略数 组 下 标 中 的 常 数 , 在 此 时 , 编 译 器

52、 会 自 动 定 义 数组 元 素 的 个 数 , 其 格 式 如 下 : =第 0个 元 素 值 ,第 1个 元 素 值 , , 第 n个 元 素 值 ; 例 如 : char a = a,b,c,d,e,f,g,h,j,k; 5.5 数 组 2. 多 维 数 组 ( 1) 多 维 数 组 的 定 义 多 维 数 组 的 声 明 形 式 如 下 : 长 度 1长 度 2 长 度 n ( 2) 多 维 数 组 的 引 用 多 维 数 组 中 元 素 的 引 用 和 一 维 数 组 的 引 用 很 相似 , 可 通 过 下 标 引 用 的 方 式 进 行 的 。 其 表 示 形 式 为 : 第

53、1维 下 标 第 2维 下 标 第 n维 下 标 5.5 数 组 ( 2) 多 维 数 组 的 初 始 化 以 下 是 二 维 数 组 的 初 始 化 形 式 : 形 式 1: 分 段 赋 值 第 1维 长 度 第 2维长 度 =第 0个 第 2维 数 据 组 , 第 1个 第 2维 数 据组 , , 第 n-1个 第 2维 数 据 组 其 中 , n等 于 第 1维 长 度 。 形 式 2: 按 行 连 续 赋 值 第 1维 长 度 第 2维长 度 =第 0个 元 素 值 , 第 1个 元 值 , , 第 m个 元 素值 其 中 , m小 于 或 等 于 第 1维 长 度 第 2维 长 度

54、。 5.5 数 组 3. 数 组 作 为 函 数 的 参 数 将 整 个 数 组 作 为 参 数 传 递 给 函 数 , 可 通 过 传 递 不带 方 括 号 的 数 组 名 来 进 行 , 其 形 式 大 体 上 有 以 下 两 种 :形 式 1: (类 型 标 识 符 数 组 名 ,int长 度 )形 式 2: (类 型 标 识 符 数 组 名 长度 ) 5.5 数 组 4. 数 组 与 字 符 串 ( 1) 字 符 数 组 的 初 始 化 有 两 种 特 殊 的 初 始 化 方 法 , 形 式 如 下 : 形 式 1:char =字 符 串 形 式 2:char =字 符 串 两 种 形

55、 式 效 果 相 同 , 且 在 末 尾 加 个 “ 0” , 例如 : char pMyStrinq=This is a computer; 它 等 同 于 : char pMyString=T, h, i, s, , a, , c, o, m, p, u, t, e, r, 0;或 char pMyStrinq=This is a computer; 5.5 数 组 ( 2) 字 符 串 的 基 本 运 算 求 字 符 串 的 长 度 假 设 字 符 串 保 存 在 数 组 pString中 , 求 字 符 串长 度 的 程 序 代 码 如 下 :char pString=abcd;int

56、 nSize=0;while(pStringnSize!= 0)nSize+; 执 行 完 毕 后 , 整 型 变 量 nSize中 保 存 的 值 就 是字 符 串 pString的 长 度 。 5.5 数 组 字 符 串 的 复 制假 设 源 字 符 串 保 存 在 数 组 pSource中 , 目 的 字 符 型数 组 为 pDestination, 则 字 符 串 复 制 的 程 序 段 如 下 :char pSource=abcd;char pDestination=5; /源 字 符 串 长 度 +1int nIndex=0;while(pSourcenSize!=0)pDesti

57、nationnIndex=pSourcenIndex;nIndex+;pDestinationnIdex= 0; /标 识 字 符 串 结 束 5.5 数 组 字 符 串 的 连 接 假 设 源 字 符 串 保 存 在 字 符 数 组 pDest中 , 要 连 接 进 来 的 字符 串 保 存 在 字 符 数 组 pTocat中 , 则 程 序 代 码 为 : char pTocat=efg; char pDest8=abcd; int nSize=0; int nIndex=0; while (pDestnSize!=0) /找 到 被 要 连 接 的 字 符 串 的 尾 部nSize+;

58、dopDestnSize+=pTocatnIndex;nIndex+; while(pTocatnIndex!= 0);pDestnSize= 0; ( 3) 字 符 串 处 理 函 数要 引 入 #include 语 句 ( 3) 字 符 串 处 理 函 数要 引 入 #include 语 句 5.5 数 组 字 符 串 的 连 接 假 设 源 字 符 串 保 存 在 字 符 数 组 pDest中 , 要 连 接 进 来 的 字符 串 保 存 在 字 符 数 组 pTocat中 , 则 程 序 代 码 为 : char pTocat=efg; char pDest8=abcd; int nS

59、ize=0; int nIndex=0; while (pDestnSize!=0) /找 到 被 要 连 接 的 字 符 串 的 尾 部nSize+; dopDestnSize+=pTocatnIndex;nIndex+; while(pTocatnIndex!= 0);pDestnSize= 0; 5.8 汇 编 语 言 与 C/C+的 混 合 编 程汇 编 语 言 与 C/C+的 混 合 编 程 在 C/C 代 码 中 嵌 入 汇 编 指 令 。 在 汇 编 程 序 和 C/C 的 程 序 之 间 进 行 变量 的 互 访 。 汇 编 程 序 、 C/C 程 序 间 的 相 互 调 用

60、。 5.8 汇 编 语 言 与 C/C+的 混 合 编 程5.8.1 内 嵌 汇 编 指 令 是 嵌 入 在 C/C+程 序 中 使 用 , 但 不 能 直 接 引 用 C语 言 的 变 量 定 义 , 数 据 交 换 必 须 通 过 ATPCS进 行 。1 内 嵌 汇 编 指 令 的 语 法 格 式_asm _ (“ instruction . instruction” ); /Linux gcc中 支持 _asm instruction instruction ; /ADS中 支 持 特 别 注 意 :是 “ _asm ” 是 两 个 下 划 线 。 5.8.1 内 嵌 汇 编 指 令2

61、内 嵌 汇 编 指 令 的 特 点( 1) 操 作 数 内 嵌 的 汇 编 指 令 中 作 为 操 作 数 的 寄 存 器 和 常 量 可以 是 C/C+表 达 式 。 是 char、 short、 int类 型 ,而 且 这 些 表 达 式 都 是 作 为 无 符 号 数 进 行 操 作 。 编 译 器 将 会 计 算 这 些 表 达 式 的 值 , 并 为 其 分 配 寄存 器 。 5.8.1 内 嵌 汇 编 指 令( 2) 物 理 寄 存 器 内 嵌 汇 编 指 令 中 使 用 物 理 寄 存 器 的 限 制 : 不 能 直 接 向 PC寄 存 器 中 赋 值 , 程 序 的 跳 转 只

62、 能通 过 B指 令 和 BL指 令 实 现 。 在 内 嵌 汇 编 指 令 中 , 不 要 使 用 过 于 复 杂 的C/C+表 达 式 。 编 译 器 可 能 会 使 用 R12寄 存 器 或 R13寄 存 器 存 放编 译 的 中 间 结 果 , 在 计 算 表 达 式 值 时 可 能 会 将寄 存 器 R0到 R3、 R12以 及 R14用 于 子 程 序 调 用 。 指 令 中 不 要 使 用 指 定 的 物 理 寄 存 器 。 5.8.1 内 嵌 汇 编 指 令( 3) 常 量 在 内 嵌 的 汇 编 指 令 中 , 常 量 前 的 符 号 #可 省 略 。若 表 达 式 前 使

63、用 了 符 号 #, 则 必 须 是 一 个 常 量 。( 4) 指 令 展 开 内 嵌 的 汇 编 指 令 中 如 果 包 含 常 量 操 作 数 , 该 指 令可 能 会 被 汇 编 器 展 开 成 几 条 指 令 。 例 如 指 令 : ADD R0, R0, #1023 可 能 会 被 展 开 成 下 面 的 指 令 序 列 : ADD R0, R0, #1024 SUB R0, R0, #01 MUL指 令 会 被 展 开 成 一 系 列 加 法 和 移 位 操 作 。 5.8.1 内 嵌 汇 编 指 令( 5) 标 号 C/C+程 序 中 的 标 号 可 被 内 嵌 的 汇 编 指

64、 令使 用 。 但 只 有 B指 令 可 使 用 C/C+程 序 中 的 标号 , 指 令 BL不 能 使 用 C/C+程 序 中 的 标 号 。 指 令 B使 用 C/C+程 序 中 的 标 号 格 式 : Bcond label( 6) 内 存 单 元 的 分 配 所 用 的 内 存 单 元 的 分 配 都 是 通 过 C/C+程 序完 成 的 , 分 配 的 内 存 单 元 通 过 变 量 供 内 嵌 的汇 编 器 使 用 。 5.8.1 内 嵌 汇 编 指 令( 7) SWI和 BL指 令 的 使 用 内 嵌 SWI和 BL指 令 中 3个 可 选 寄 存 器 列 表 第 1个 寄 存

65、 器 列 表 中 的 寄 存 器 用 于 存 放 输 入的 参 数 。 第 2个 寄 存 器 列 表 中 的 寄 存 器 用 于 存 放 返 回的 参 数 。 第 3个 寄 存 器 列 表 中 的 寄 存 器 的 内 容 可 能 被被 调 用 的 子 程 序 破 坏 , 即 这 些 寄 存 器 是 供被 调 用 的 子 程 序 作 为 工 作 寄 存 器 。 5.8.1 内 嵌 汇 编 指 令3 内 嵌 的 汇 编 器 与 armasm的 区 别 在 功 能 和 使 用 方 法 上 主 要 有 以 下 特 点 : 不 能 写 PC (mov pc,lr) 不 支 持 伪 指 令 LDR Rn,

66、 =expression, 但 可 用 指 令 : LDR Rn, expression来 代 替 。 除 nop外 , 不 支 持 ADR、 ADRL等 伪 指 令 。 指 令 中 的 C变 量 不 要 与 任 何 物 理 寄 存 器 重 名 LDM/STM指 令 中 的 寄 存 器 列 表 只 能 使 用 物 理 寄 存 器 , 不能 使 用 C表 达 式 不 支 持 指 令 BX/BLX 用 户 不 用 维 护 数 据 栈 不 要 轻 易 改 变 处 理 器 模 式 。 不 支 持 内 存 分 配 操 作 5.8.1 内 嵌 汇 编 指 令4 内 嵌 汇 编 指 令 的 应 用 举 例 下 面 是 在 ADS 1.2下 编 译 通 过 程 序 , 程 序 中 内 嵌汇 编 指 令 。 例 5.14 字 符 串 复 制 本 例 中 使 用 了 指 令 BL调 用 子 程 序 。 在 内 嵌 的 BL指 令 中 , 除 了 正 常 的 操 作 数 外 , 还 必 须 增 加 以 下 三个 可 选 的 寄 存 器 列 表 : 第 1个 用 于 存 放 输 入 的 参 数 第 2个 用

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!