嵌入式基础知识复习(7.28)
前瞻
1、嵌入式产品。特点:低功耗、根据用户需求定制。硬件:arm处理器。软件:Linux操作系统
arm架构:精简指令集、低功耗(移动/嵌入式)。 x86架构:复杂指令集、高功耗。(PC机/服务器)
Linux操作系统:开源可裁剪。 windows操作系统:非开源不可裁剪。
2、Linux发行版之一:ubantu。即对Linux内核进行封装和功能完善,形成了一个方便用户交互的完整操作系统。(详细见附录一)
3、C语言:面向过程的编程语言。(详细介绍见附录二)
4、 计算机基本组成:cpu、ram(内存)。
cpu负责控制与运算、存储器负责数据中转。
存储器分类:ram(随机存储器,掉电数据丢失)、rom(只读存储器)
计算机存储最小单元:字节(byte)。1byte = 8bit。每个存储单元对应一个内存地址。
(详细见附录三)
前瞻结束
1、C语言数据类型:
1)常量:程序运行过程值不变的量。整型常量、字符常量
变量:程序运行过程值改变的量。变量可以看成一段内存空间,程序运行结束空间销毁。
2)整型常量:十进制8、八进制01000、十六进制0x8。
浮点型常量:1.23、0.123e1 (常量小数默认是双精度,详细见附录四)。
字符常量(ascll码):'a'、'\n'、'1'、'!',实际上亦可以看成整型,因为每一个字符都可以转化为对应整型数字。
宏常量:#define N 10;
3)整型变量:(无符号)短整型 (unsigned)short:2字节
(无符号)整型 (unsigned)int 4字节
(无符号)长整型 (unsigned)long 8字节
浮点型变量 :单精度浮点型 float 4字节
双精度浮点型 double 8字节
字符变量: (unsigned)char 1字节
字符常量用单引号括起来,当单引号里面有多个字符,默认值是最后一个字符。
4)整数存储方式:补码存储。
正数补码是它本身,负数补码是原码取反加一(最高位符号位不变)。
当存储时数字超过类型范围会发生溢出,存储错误的结果(如unsigned char 256,实际存储0)。
单精度浮点数存储方式:符号位1位,阶码8位,尾数23位。计算如下:
x = (-1)^s × (1.M) × 2^(E-偏移值),其中,s是符号位,M是尾数(不包括隐含的1),E是阶码,偏移值对于32位浮点数是127,对于64位浮点数是1023。
5)十进制转二进制:整数部分:除二取余法。小数部分:乘二取整法。
二进制转十进制:按位乘2的n次方再加起来。
二进制转八进制:每三位二进制转一位八进制。
二进制转十六进制:没四位二进制转一位十六进制
6)
附录零:ubantu快捷键、终端命令、vim编辑器命令
//ubantu常用快捷键、终端命令、vim编辑器命令
终端命令:
ls 列出当前目录下文件及目录
ls -a 额外列出隐藏内容。 .是目录本身,..是上一层目录,带点文件是隐藏文件。
ls --help 获取命令使用方法
pwd 打印当前路径
cd 回到家目录。
cd .. 退回上一层目录
touch 文件名 创建文件
mkdir 目录名 创建文件夹
rm 文件名 删除文件
rm 文件夹 -r 删除文件夹
cp 文件 目录 文件拷贝至指定目录
cp 文件夹 目录 -r 文件夹拷贝
mv 文件 目录 移动文件
vi/vim 文件名 编辑文件
gcc 文件名(main.c) c程序编译,生成a.out可执行程序
gcc 文件名 -o 目标名 编译生成指定目标名
./a.out 可执行程序运行补充:linux@ubantu:@前面是用户名,@后面是主机名相对路径:相对当前路径来说的路径(不包含根目录)。绝对路径:从根路径开始描述(包含根目录)。~/是家目录,扩展开是/home/linux。绝对路径的第一个/就是是linux根目录,后面/是分隔符。命令组成:command [-option] [argument]命令符 选项 参数vim编辑器命令:刚进入默认命令模式,输入i进入编辑模式(INSERT),按ESC回到命令模式(NORMAL).保存退出: :w保存 :q退出文件 :q!强制退出 :wq保存退出复制粘贴:命令模式下,移动光标到要操作的行: yy 复制1行数字 yy 复制n行(包含当前行)p 粘贴(以光标下1行为粘贴的第1行)dd 剪切1行数字 dd 剪切n行permission denied 表示权限不足,要在命令前加sudo,输入用户密码。不用随意点击终端、vim界面的窗口关闭(×),容易造成文件内容未保存丢失。快捷键:
ctrl alt t 开启终端
ctrl shift + 终端字体放大
ctrl - 终端字体减小
tab 文件名自动补全
ctrl+alt+fn+f2 回到图形交互界面(默认开机界面)
ctrl+alt+fn+f3 进入文字交互界面(可用于帧缓冲相关程序运行)
附录一 ubantu与Linux内核
你的笔记基本正确,但表述可以更严谨。以下是综合搜索结果后的修正与补充说明:
Linux发行版与Ubuntu的关系
核心概念
- Linux内核:由Linus Torvalds维护的操作系统核心,负责管理硬件资源(CPU、内存、设备驱动等)。
- 发行版(Distribution):在内核基础上集成图形界面、软件包管理工具、应用程序等,形成完整的操作系统。
- Ubuntu:是基于Debian的Linux发行版之一,由Canonical公司维护,以用户友好性和稳定性著称。
你的笔记修正
- 原句:“对Linux内核进行封装,形成方便用户交互的版本”
- 更准确表述:
Ubuntu是基于Linux内核的完整操作系统发行版,不仅封装内核,还集成了桌面环境(如GNOME)、软件包管理器(APT/Snap)、系统工具和社区支持,提供开箱即用的用户体验。
补充说明
- 封装内容:除内核外,还包括:
- 桌面环境(如Ubuntu默认的GNOME)
- 软件仓库(通过APT管理数千个开源软件包)
- 系统工具(如防火墙、虚拟化支持)
- 定制优化(如Ubuntu对Debian软件包的兼容性调整)
- 交互设计:Ubuntu特别注重桌面用户的易用性,如图形化安装界面、Unity/GNOME桌面环境等。
- 封装内容:除内核外,还包括:
Ubuntu与其他发行版的区别
特性 | Ubuntu | 其他发行版(如Fedora、CentOS) |
---|---|---|
基础 | 基于Debian,但软件包不完全兼容 | Fedora基于RHEL,CentOS是RHEL的社区版 |
更新周期 | 每6个月发布新版本,LTS版支持5-10年 | Fedora更新更快,RHEL/CentOS更注重稳定性 |
目标用户 | 个人桌面、开发者、云计算 | Fedora面向技术爱好者,RHEL面向企业 |
总结与建议
- 笔记修正建议:
- 明确Ubuntu是“基于Linux内核的发行版”,而非单纯“封装内核”,强调其完整操作系统属性。
- 补充Ubuntu的衍生版本(如Kubuntu、Xubuntu)和特色功能(如Snap包管理)。
- 扩展学习:
- Linux内核与发行版的关系类似“引擎与整车”,内核提供基础能力,发行版决定用户体验。
- 其他主流发行版包括Debian(Ubuntu上游)、Red Hat(企业级)、Arch Linux(极简主义)等。
如需更详细的技术对比,可参考Ubuntu官方文档或Linux内核开发资料。
附录二 C语言详细介绍
C语言全面介绍:从历史发展到现代应用
C语言作为计算机科学领域最具影响力的编程语言之一,自1972年诞生以来,一直是系统编程和底层开发的首选工具。本文将全面介绍C语言的发展历程、语言特点、标准演进以及广泛的应用领域。
一、C语言的历史与发展
C语言的起源可以追溯到1960年代的ALGOL 60语言,经过多个阶段的演变才形成今天我们熟知的C语言。
前身语言:
- ALGOL 60(1960年):面向问题的高级语言,但离硬件较远
- CPL语言(1963年):剑桥大学在ALGOL 60基础上开发,更接近硬件但过于复杂
- BCPL语言(1967年):Martin Richards简化CPL而来
- B语言(1970年):Ken Thompson在BCPL基础上进一步简化,用于编写第一个UNIX操作系统
C语言的诞生:
- 1972年,贝尔实验室的Dennis Ritchie在B语言基础上设计出C语言(取BCPL的第二个字母)
- 1973年,C语言主体完成,并用它重写了UNIX操作系统(90%以上代码)
- 1978年,AT&T贝尔实验室正式发表C语言,同时Kernighan和Ritchie合著《The C Programming Language》(简称K&R)
标准化进程:
- K&R C:1978-1989年间事实上的标准
- ANSI C(C89):1989年美国国家标准学会制定,1990年被ISO采纳为ISO C(C90)
- C99:1999年ISO发布,增加新特性
- C11:2011年发布,支持汉字函数名和标识符
- C18:2018年发布,主要是对C11的修正
- C23:最新的C语言标准(2023年发布)
二、C语言的核心特点
C语言之所以能经久不衰,得益于其独特的设计理念和语言特性:
高效性与低级控制:
- 直接访问内存物理地址,进行位一级操作
- 代码效率高,通常只比汇编语言低10%-20%
- 不需要运行环境支持,编译后可直接运行
结构化与模块化:
- 层次清晰,便于按模块化方式组织程序
- 易于调试和维护
- 丰富的运算符和数据类型,便于实现复杂数据结构
可移植性强:
- 标准规格写的程序可在多种平台编译运行
- 从嵌入式处理器到超级计算机都支持
- 与特定硬件架构解耦
兼具高级与低级语言特性:
- 具有高级语言的抽象能力
- 保留低级语言的硬件操作能力
- 既适合系统软件开发,也适合应用软件开发
丰富的表达能力:
- 处理能力极强,可处理各类复杂问题
- 绘图能力强,适合图形和动画开发
- 支持多重编程范式(过程式、数据抽象等)
三、C语言的版本与编译器
主要版本:
- Microsoft C(MS C)
- Borland Turbo C
- AT&T C
- GNU C(GCC)
现代常用编译器:
- GCC:GNU组织开发的开源免费编译器,支持多平台
- Clang:基于LLVM的开源编译器,BSD协议
- Visual C++:微软开发的Windows平台编译器
- MinGW:Windows下的GCC移植版
- Xcode:macOS上的开发环境,使用Clang
集成开发环境(IDE):
- Windows:Visual Studio、Dev-C++、Code::Blocks
- Linux:Eclipse CDT、KDevelop
- 跨平台:CLion、VS Code(配合插件)
四、C语言的应用领域
C语言因其独特的优势,在计算机科学的多个领域都有广泛应用:
系统软件开发:
- 操作系统内核(UNIX、Linux、Windows)
- 编译器(如GCC)、解释器
- 设备驱动程序
- 文件系统和存储管理
嵌入式系统:
- 单片机开发(裸机或RTOS)
- 智能家居设备(空调、洗衣机控制器)
- 汽车电子(ECU、BCU)
- 医疗设备(监护仪、血糖仪)
高性能计算:
- 游戏引擎开发(Unity、Unreal)
- 图形渲染和3D建模
- 科学计算和数值分析
- 信号处理(DSP)
网络与安全:
- 网络协议栈实现(TCP/IP)
- Web服务器(Apache)
- 加密算法和安全系统
- 防火墙和入侵检测
数据库系统:
- MySQL
- SQLite
- PostgreSQL
- Oracle和SQL Server的核心组件
工具链开发:
- 开发其他编程语言(Python、PHP等的解释器)
- 构建系统和版本控制工具
- 性能分析工具
多媒体处理:
- 音视频编解码(FFmpeg)
- 图像处理(OpenCV)
- 语音识别和合成
五、C语言的职业方向
掌握C语言可开启多种职业路径:
- 系统软件工程师:开发操作系统、编译器、工具链等系统软件
- 嵌入式系统工程师:设计嵌入式软件,应用于智能设备、汽车电子等领域
- 游戏引擎开发工程师:开发高性能游戏引擎和图形渲染系统
- 网络安全工程师:开发安全系统和加密算法,保护系统安全
- 数据库开发工程师:设计和优化数据库管理系统
- 物联网(IoT)开发工程师:开发智能设备和物联网解决方案
- 自动化测试工程师:开发底层测试框架和工具
六、C语言的影响与未来
对后续语言的影响:
- 直接催生了C++、Objective-C、C#等语言
- 影响了Java、JavaScript、Python等语言的语法设计
- 成为许多新语言的学习参考
在现代开发中的地位:
- 仍然是系统编程和性能敏感领域的首选
- 在物联网和边缘计算时代获得新的应用场景
- 作为计算机科学教育的基石语言
未来展望:
- 随着C23标准的发布,语言持续现代化
- 在安全性和并发支持方面不断改进
- 仍将是底层开发和系统编程的核心工具
七、学习C语言的建议
- 从基础开始:掌握数据类型、控制结构、函数等基本概念
- 深入理解指针:这是C语言最强大也最容易出错的部分
- 实践项目驱动:通过实际项目(如小型操作系统、游戏等)巩固知识
- 阅读优秀代码:学习Linux内核等开源项目的代码风格和设计
- 关注现代特性:了解C11、C17和C23引入的新特性
C语言作为一门接近50年历史的语言,依然活跃在技术前沿,其设计理念和哲学影响了几代程序员。无论是想深入理解计算机系统,还是从事底层开发工作,C语言都是不可或缺的核心技能。
附录三 计算机基本组成
你的笔记基本正确,但部分表述可以更严谨,以下是补充和修正后的版本,结合了搜索结果中的权威信息:
计算机基本组成
CPU(中央处理器)
- 功能:
- 控制:作为计算机的"指挥中心",通过控制器(CU)从内存取指令、译码并生成控制信号。
- 运算:通过算术逻辑单元(ALU)执行算术(如加减乘除)和逻辑运算(如与、或、非)。
- 组成:
- 运算器(ALU) + 控制器(CU) = CPU核心。
- 寄存器:高速暂存指令和数据(如程序计数器PC、指令寄存器IR)。
- 缓存(Cache):分L1/L2/L3三级,缓解CPU与内存速度差异。
- 功能:
RAM(随机存储器)
- 功能:临时存储CPU正在处理的程序和数据,断电后丢失(易失性)。
- 分类:
- DRAM:动态RAM,需刷新(如内存条),成本低但速度较慢。
- SRAM:静态RAM,无需刷新(如CPU缓存),速度快但成本高。
存储器分类与特性
类型 | 特性 | 用途 |
---|---|---|
RAM | - 可读写,速度快 - 易失性(断电数据丢失) | 临时存储运行中的程序和数据 |
ROM | - 通常只读,写入需特殊操作(如固件升级) - 非易失性(断电保留数据) | 存储BIOS、嵌入式系统固件 |
注:ROM演进类型包括PROM(一次性写入)、EPROM(紫外线擦除)、EEPROM(电擦除)和闪存(如SSD)。
存储单元与寻址
- 最小单元:
- 字节(Byte) = 8 比特(bit),是数据存储的基本单位。
- 内存地址:每个字节对应唯一地址,CPU通过地址访问数据。
- 扩展概念:
- 字(Word):CPU一次处理的数据长度(如32位系统为4字节)。
- 存储字长:存储单元中二进制代码的位数(如64位系统的字长为64bit)。
修正建议
- CPU部分:
- 补充控制器(CU)和运算器(ALU)的协同关系。
- 增加寄存器组的作用(如PC、IR)。
- 存储器分类:
- 明确ROM的"只读"是历史名称,现代ROM(如EEPROM)支持有限写入。
- 存储单元:
- 区分"字节"与"字"的概念,避免混淆。
冯·诺依曼体系结构
计算机硬件五大核心组件:控制器、运算器(合为CPU)、存储器、输入设备、输出设备,通过总线连接。你的笔记中"存储器负责数据中转"可更精确为"存储器(内存+外存)存储程序和数据,供CPU直接访问"。
附录四 小数在C语言默认双精度类型。
在Linux系统中,浮点数常量的默认类型是双精度浮点数(double
)。这一规则不仅适用于Linux系统,也是C/C++语言标准的通用规范。以下是具体分析:
1. 语言标准与默认类型
C/C++标准规定:根据C语言标准(如C18)和C++标准,未添加后缀的浮点数常量(如
3.14
、1.23e-5
)默认类型为double
。- 若需指定为单精度(
float
),需显式添加后缀f
或F
(如3.14f
)。 - 后缀
l
或L
表示long double
(更高精度)。
- 若需指定为单精度(
示例代码:
double a = 3.14; // 默认double类型 float b = 3.14f; // 显式声明为float
2. 硬件与系统实现
- IEEE 754标准:Linux系统遵循IEEE 754浮点数标准,
double
类型通常占用64位(8字节),提供约15-17位有效数字,而float
为32位(4字节),仅6-7位有效数字。 - 性能与精度权衡:现代处理器(如x86、ARM)对双精度运算有硬件优化,默认使用
double
可减少精度损失,但可能增加内存和计算开销。
3. 实际应用中的注意事项
- 隐式转换风险:将
double
常量赋给float
变量时,编译器会自动截断,可能导致精度损失或警告。 - 科学计算与嵌入式场景:
- 科学计算优先使用
double
以保证精度。 - 嵌入式系统(如ARM Cortex-M)可能因资源限制选择
float
,需显式加后缀。
- 科学计算优先使用
4. 为什么默认是double
而非float
?
- 历史与兼容性:早期C语言设计时,
double
因其更高的精度和范围被选为默认类型,延续至今。 - 避免意外截断:默认
double
可减少因隐式转换导致的精度问题,尤其在复杂表达式中。
总结
在Linux系统中,浮点数常量默认类型为double
,这是由语言标准、硬件支持及精度需求共同决定的。开发者应根据场景选择是否显式指定类型(如float
或long double
),以平衡性能与精度需求。