学习目标:
1)嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器--->对应相关管脚)的操作有哪些相同与差别?
2)为什么51单片机的LED点灯编程要比STM32的简单?
3)register和volatile 关键字这两个变量修饰符的作用
学习内容:
结合阅读ARM、STM32技术手册,深入思考STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置的一般步骤
与PC平台上的一般程序不同,嵌入式C程序经常会看见 register和volatile 关键字,请解释这两个变量修饰符的作用,并用C代码示例进行说明
学习结果:
问题一:
嵌入式C程序代码对内存(RAM)中的各变量的修改操作,与对外部设备(寄存器--->对应相关管脚)的操作有哪些相同与差别?
对内存中的变量进行修改操作和对外部设备(寄存器)进行操作有以下相同和差别:
相同点:
1. 都需要通过特定的语法和指令来进行操作。
2. 都需要使用适当的数据类型和格式来表示和处理数据。
3. 都需要考虑数据的读取、写入和修改等操作。
4. 都需要考虑数据的有效性和正确性。
差异点:
1. 对内存中的变量进行修改操作是在程序运行时进行的,而对外部设备的操作是通过特定的寄存器和相关管脚进行的。
2. 对内存中的变量进行修改操作是在程序内部进行的,而对外部设备的操作是通过与外部设备进行通信来实现的。
3. 对内存中的变量进行修改操作是在程序的控制下进行的,而对外部设备的操作可能受到硬件限制和外部环境的影响。
4. 对内存中的变量进行修改操作可以直接读取和修改变量的值,而对外部设备的操作可能需要通过特定的协议和接口来进行通信和控制。
总结:
对内存中的变量进行修改操作和对外部设备的操作有一些相同的地方,但也存在一些差异。在编写嵌入式C程序时,需要根据具体的需求和硬件平台来选择合适的操作方式,并注意处理数据的有效性和正确性。
问题二:
为什么51单片机的LED点灯编程要比STM32的简单?
51单片机的LED点灯编程相对于STM32来说更简单的原因有以下几点:
1. 简单的指令集:51单片机使用的是8051指令集,指令集非常简单,只有约50条指令,易于学习和理解。而STM32使用的是ARM Cortex-M系列处理器,指令集更加复杂,包含了更多的功能和特性。
2. 简化的开发环境:51单片机的开发环境相对来说更加简单,通常使用Keil C51等集成开发环境进行开发,开发工具和调试器都比较成熟和稳定。而STM32的开发环境相对复杂一些,需要使用Keil MDK、IAR Embedded Workbench等较为复杂的开发工具。
3. 低级别的硬件抽象:51单片机的硬件抽象层相对较低级别,开发者可以直接操作寄存器和位操作来控制硬件,更加灵活。而STM32的硬件抽象层相对较高级别,使用HAL库或者CubeMX生成的代码进行开发,抽象层更加复杂,但也更加方便。
4. 资源消耗较少:51单片机的资源消耗相对较少,包括存储器和处理器性能。相比之下,STM32的资源消耗较大,需要更多的存储器和处理器性能来支持更复杂的应用。
问题三:
register和volatile 关键字这两个变量修饰符的作用
register和volatile是两个变量修饰符,它们的作用如下:
1. register:register关键字用于告诉编译器将变量存储在寄存器中,而不是内存中。寄存器是位于CPU内部的高速存储器,访问速度比内存快得多。使用register修饰的变量可以提高程序的执行速度。但是,由于寄存器数量有限,编译器可能会忽略register关键字的请求,特别是对于全局变量或者需要取地址的变量。
2. volatile:volatile关键字用于告诉编译器该变量的值可能会在意料之外的情况下发生变化,因此编译器不应该对该变量进行优化。常见的意料之外的情况包括多线程环境下的共享变量、硬件寄存器的访问等。使用volatile修饰的变量可以确保每次访问都从内存中读取最新的值,而不是使用缓存的值。这样可以避免由于编译器的优化导致的错误结果。
需要注意的是,register和volatile关键字的使用应该谨慎。register关键字的使用并不一定能够提高程序的执行速度,因为编译器可能会忽略register关键字的请求。而volatile关键字的使用可能会导致性能下降,因为每次访问都需要从内存中读取最新的值。因此,在使用这两个关键字时,需要根据具体的情况进行权衡和选择。