首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用阵列和指针算法的闪烁LED

使用阵列和指针算法的闪烁LED
EN

Stack Overflow用户
提问于 2018-01-02 04:08:29
回答 1查看 212关注 0票数 1
代码语言:javascript
运行
复制
#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位。他们说它是自动完成的,但有人能解释一下背后的原因吗?

谢谢。

EN

Stack Overflow用户

发布于 2018-01-02 04:49:18

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

  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字节值的数组(我谷歌了一下,看到它是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行所做的操作)。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48052877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档