【嵌入式C语言】
2.6变量的用法与注意事项
将100存进内存中
在寄存器窗口中查看,0x64即代表100、
但是上面利用寄存器的方法不利于代码的编写,就引入了变量的概念,变量就等价于地址,单片机会为变量分配地址空间,可以通过变量找到地址空间,分配地址空间的机制在讲解堆栈课程时详细讲解。
变量的用法
类型关键字 变量名(可以有多个变量名统一定义)
可以通过取地址运算符读取变量的地址
变量的注意事项
变量的注意事项
- 以英文字母开头
- 英文字母区分大小写
- 不能是关键字
- 不能包含空格、标点符号和类型说明符
关键字在keil里一般用蓝色提示
变量的扩展
2.7浮点型数据类型
值得注意的是,在正数和负数之间有一段数据范围是无法表示的、
float类型常数后面要添加f后缀,double类型不需要添加
2.8一个字符引入的BUG
当浮点数乘以常量后面加上f,告诉编译器是float类型而不是double类型,会节省很多字节
看汇编代码可以看出,第二个只是调用了float类型的乘法运算函数
如果只调用了double类型的乘法运算函数,字节数也会比float多100多字节
2.9浮点数应用注意事项
浮点数不要直接用等号做比较,因为2.468是double型数据,两者并不相等
整型数转浮点数时要显示转换类型,否则会导致运算错误
根据上面的案例,计算机在计算浮点数时是有误差的,这是因为浮点数本身有精度的限制
注意事项
- 尽量选择float类型,减小对单片机资源和性能的开销
- 浮点数常量默认是double型,加后缀可以声明float型
- 浮点数不要直接用等于号做比较
- 整型数转浮点数的运行是要显示的转换类型
2.10为什么要引入ASCII码
计算机只能处理二进制数据,当输入字符c时,需要按照特定的编码格式转换为二进制数据,特定的编码格式就是ASCII码
ASCII码统一规定了常用符号用哪些二进制数来表示,ASCII使用七位二进制数(剩下的一位为0)来表示所有的大写和小写字母,数字0-9,标点符号,以及在美式英语中使用的特殊控制字符
ASCII码表
字符型变量的关键字是char,字符常量需要使用英文输入法‘’括起来
自己编程时,使用c99标准,不要使用char来定义单字节整型数据,而是使用uint8-t/int8-t,只使用char定义表示字符数据
3.1c语言有哪些运算符
程序等于数据加运算,前面讲到了数据的类型,包括整型,浮点型,字符型,后面学习C语言的运算符
运算符的几个概念
- 表达式:由一个活多个操作数及运算符组成的式子
- 优先级:运算符执行的优先级,优先级高的先执行
- 结合性:当优先级相同时,可以通过结合性确定表达式如何结合来确定执行顺序,优先级相同时,从左到右
- 类别:参与当前运算符运算的操作数个数,一元,二元,三元
运算符的几个概念
像= + *都属于二元运算符,因为他们的左右两边都有操作数
而a++的+是一元运算符
赋值运算符=
C语言中,等号左侧不允许是表达式只能是变量名
3.2算数运算符及应用案例


求余运算参与运算的两个操作数为整数
3.3算数复合赋值运算符
他们的优先级较低
在编写代码时一定要关注优先级,当不确定优先级时,用()来明确
3.4增1和减1运算符及应用案例
将变量的值增加或减少一个单位,既可以作为前置运算符,也可以作为后置运算符
在独立使用时,前置和后置的运算结果是一样的
当应用于表达式时,运算结果不一样
左侧是先赋值给y,然后进行加1运算,右侧是先加一,再赋值给y
3.5单片机是如何控制外设的
单片机不是直接控制外设的,而是通过配置外设寄存器来控制其输出和检测高低电平,进而来控制外围器件
首先内核从flash加载读取指令,然后根据指令到SRAM里对应的地址去读取数据,这些数据就是即将要赋值给gpio外设寄存器里面的数据,内核会通过总线对gpio寄存器进行赋值,外设根据寄存器的数值转换成高低电平
内核是如何找到外设寄存器的,每个外设寄存器都有对应的地址(门牌号),内核就是通过这些地址来访问寄存器的,对于ARM32位的单片机是统一寻址,寻址范围是4GB,2的32次方就是4GB,B代表的是字节byte,这个空间又被分为了多个板块
C语言是通过指针来访问寄存器的,这也是指针在嵌入式开发中的一个典型应用