#include "lm4f120h5qr.h"
#define LED_RED (1u<<1)
#define LED_BLUE (1u<<2)
#define LED_GREEN (1u<<3)
GPIO_PORTF_DATA_R |= LED_RED; // line1
*((unsigned long volatile *)(0x40025000 +(LED_RED << 2)))=LED_RED;//line2
*(GPIO_PORTF_DATA_BITS_R + LED_RED)=LED_RED; //line3
GPIO_PORTF_DATA_BITS_R[LED_RED]=LED_RED; //line3
我正在学习一门关于互联网的课程,这是一个使用“数组和指针算法”的例子。但是我不能理解使用“指针算法”来修改特定位的概念。
我可以理解"line1",它修改了一点,而不会改变GPIO_PORTF_DATA_R指向的位置的任何其他位,所以它打开了红色发光二极管(如果我这里弄错了,请纠正我)。
我可以理解为什么我们在"line2“中移位2位,因为我们忽略了最后两位,"line2”和"line3“有相同的概念,他们在反汇编中执行相同的指令。
我的第一个问题是*(GPIO_PORTF_DATA_BITS_R + LED_RED)到底指向哪里?*(GPIO_PORTF_DATA_BITS_R + LED_RED) = LED_RED是如何工作的?
第二个问题是为什么我们在"line3“中不再需要移位2位。他们说它是自动完成的,但有人能解释一下背后的原因吗?
谢谢。
发布于 2018-01-02 04:49:18
我不确定上下文是什么,但我可以回答你的两个问题:
GPIO_PORTF_DATA_BITS_R
应该是一个数组,则*(GPIO_PORTF_DATA_BITS_R + LED_RED)=LED_RED
将无符号整数值LED_RED
赋给数组中的第LED_RED
个位置。我还是不确定为什么要将LED_RED
赋给数组中的那个位置,但这取决于你。GPIO_PORTF_DATA_BITS_R
是一个4字节值的数组(我谷歌了一下,看到它是32位的)。内存是字节寻址的,所以如果您想转到数组中的第LED_RED
位置,可以将LED_RED * 4
添加到数组开始处的内存地址。然而,C中的指针算法知道*GPIO_PORTF_DATA_BITS_R
的大小,因此在第3行中自动执行4次乘法。编辑:计算内存地址偏移量的一种更简洁的方法是LED_RED * sizeof(*GPIO_PORTF_DATA_BITS_R)
,而不是将LED_RED
左移2个字节(或者,如果您只是设置一个数组值,请执行您在第3行所做的操作)。
https://stackoverflow.com/questions/48052877
复制相似问题