当前位置: 首页 > ops >正文

【嵌入式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语言是通过指针来访问寄存器的,这也是指针在嵌入式开发中的一个典型应用

http://www.xdnf.cn/news/17555.html

相关文章:

  • 【10】微网优联——微网优联 嵌入式技术一面,校招,面试问答记录
  • 数据结构:串、数组与广义表
  • IP分片(IP Fragmentation)
  • 力扣109:有序链表转换二叉搜索树
  • docter的使用、vscode(cursor)和docker的连接,详细分析说明
  • 【3D Gen 入坑(1)】Hunyuan3D-Paint 2.1 安装 `custom_rasterizer` 报错完整排查
  • 面试题-----RabbitMQ
  • MySQL的索引(索引的数据结构-B+树索引):
  • 嵌入式Linnux学习 -- 软件编程2
  • 【已解决】报错:WARNING: pip is configured with locations that require TLS/SSL
  • STM32——system文件夹
  • 【ros-humble】4.C++写法巡场海龟(服务通讯)
  • Spring Boot 中 @Transactional 解析
  • [Oracle] UNPIVOT 列转行
  • Linux kernel network stack, some good article
  • Day 37:早停策略和模型权重的保存
  • 《番外:Veda的备份,在某个未联网的旧服务器中苏醒……》
  • Mybatis学习之缓存(九)
  • 从零开始的云计算生活——第四十一天,勇攀高峰,Kubernetes模块之单Master集群部署
  • Seata
  • vue+django 大模型心理学智能诊断评测系统干预治疗辅助系统、智慧心理医疗、带知识图谱
  • EXISTS 替代 IN 的性能优化技巧
  • 前端灰度发布浅析
  • 【C++语法】输出的设置 iomanip 与 std::ios 中的流操纵符
  • 【stm32】EXTI外部中断
  • IoT/实现和分析 NB-IoT+DTLS+PSK 接入华为云物联网平台IoTDA过程,总结避坑攻略
  • 运维学习Day21——LAMP/LNMP 最佳实践
  • Python day 41
  • Linux 流编辑器 sed 详解
  • Linux-常用命令