gpt4 book ai didi

c - 使用数组和指针算法闪烁 LED

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:13 25 4
gpt4 key购买 nike

#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

我正在学习 Internet 上的类(class),这是使用“数组和指针算术”的示例。但是我无法理解使用“指针运算”来修改特定位的概念。

我能理解“line1”,它修改了一点,没有改变 GPIO_PORTF_DATA_R 指向的位置的任何其他位,所以它打开了红色 LED(如果我在这里弄错了,请纠正我)。

我能理解为什么我们在“line2”中移动 2 位,因为我们忽略了最后 2 位,并且“line2”和“line3”共享相同的概念,它们在反汇编中执行相同的指令。

我的第一个问题是 *(GPIO_PORTF_DATA_BITS_R + LED_RED) 究竟指向哪里? *(GPIO_PORTF_DATA_BITS_R + LED_RED) = LED_RED 是如何工作的?

第二个问题是为什么我们不再需要在“line3”中移动 2 位。他们说它是自动完成的,但有人可以解释背后的原因吗?

谢谢。

最佳答案

我不确定上下文是什么,但我可以回答你的两个问题:

  1. 如果 GPIO_PORTF_DATA_BITS_R 是一个数组,*(GPIO_PORTF_DATA_BITS_R + LED_RED)=LED_RED 正在分配无符号整数值 LED_RED 到数组中的第 LED_RED 位置。再次不确定为什么要将 LED_RED 分配给数组中的那个位置,但这取决于您。

  2. 将一个值左移 2 位就是将它乘以 4。您需要在第 2 行执行此操作,因为 GPIO_PORTF_DATA_BITS_R 是一个 4 字节值的数组(我用 Google 搜索并看到它是32 位)。内存是按字节寻址的,因此如果您想转到数组中的第 LED_RED 位置,请将 LED_RED * 4 添加到数组开头的内存地址.但是,C 中的指针算法知道 *GPIO_PORTF_DATA_BITS_R 的大小,因此在第 3 行自动执行 4 次乘法。

编辑:不是将 LED_RED 向左移动 2 个字节,计算内存地址偏移量的更简洁方法是 LED_RED * sizeof(*GPIO_PORTF_DATA_BITS_R)(或执行以下操作如果你只是设置一个数组值,你在第 3 行做了)。

关于c - 使用数组和指针算法闪烁 LED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48052877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com