gpt4 book ai didi

c - C变量变量

转载 作者:行者123 更新时间:2023-12-02 06:44:04 26 4
gpt4 key购买 nike

在PHP中,我有类似

function doStuff($in, $value)  
{
$var = "V_" . $in;
$$var = $value;
}

有没有办法在C中做类似的事情?

基本上,我试图找出一种方法来简化AVR上的IO引脚的使用。因此,例如,将有一个功能可以将特定的引脚设置为OUTPUT。 AVR中的该引脚是PORTB的一部分。将其设置为输出并为其提供值需要我引用 DDRBPORTB常量并设置其值。除了希望完成所有这些工作外,我还想调用诸如 SetMode(Pin #, Mode);之类的函数。我只是不知道该怎么做。

最佳答案

您的问题仍然不清楚(如答案中各种解释所示)。我假设您想通过物理引脚号来引用引脚。如果这是不正确的,请澄清您的问题,以便我们提供更好的答案。

如果有人将枪对准我的头,我将大致执行以下操作:

免责声明:我没有对此进行测试,也没有特别仔细地检查文档。该代码是为Linux上的avr-gcc / avr-libc编写的,尽管它可能在其他地方也可以使用。

// Map from physical pin number to associated direction register.
volatile uint8_t *ddr_map[] = {
NULL, // Vcc, GND, or some other non-IO pin.
&DDRB,
&DDRB,
&DDRC,
// etc... Values will vary for different target chips.
};

// Map from physical pin number to port mask.
uint8_t mask_map[] = {
0x00,
_BV(0),
_BV(1),
_BV(0),
// etc... Values will vary for different target chips.
}

typedef enum {
IN,
OUT
} PinDir;

void setMode(int pin, PinDir dir) {
if(dir == OUT) {
*ddr_map[pin] |= mask_map[pin];
} else {
*ddr_map[pin] &= ~mask_map[pin];
}
}

参见 http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass

这就是为什么它不是一个好主意的原因:
  • 它不会抽象出任何有意义的行为(它实际上消除了抽象-物理引脚号低于逻辑端口/引脚的级别)。而且,物理引脚号对于不同的封装格式不一定是相同的。在QFP封装上,PORTB的引脚可能未分配为与PDIP封装相同的物理引脚号。因此,这段代码实际上更加令​​人困惑。
  • 它增加了开销。您有一个额外的函数调用(这会花费周期和堆栈),并使用两个(或更多)数组进行查找(除非采取特殊措施,否则会在AVR上花费闪存和RAM,在这种情况下,它们会花费额外的周期和闪存或EEPROM)更不用说所有的间接方法(数组查找,指针解引用)以及额外的比较和分支。在台式机和Web开发中,您应该 mock 我对如此小成本的关注,但是在AVR上,浪费的影响更大。 (注意:您也许可以说服编译器对其进行一些优化,但是如果您使用-Os将会很困难。现在您担心的是比以前更低的细节...)
  • 提供的操纵销的方法并不复杂,值得以这种方式隐藏。您应该习惯于在头脑中在十六进制和二进制之间进行转换(这并不困难)。即使您不想弄乱十六进制,_BV()宏也使引脚操作变得非常容易(或者只使用(1 << x),它更可移植并且将被更多的程序员识别)。

  • 顺便说一句, PORTBDDRB等不是常量。它们是绑定(bind)到特定地址或寄存器的变量。尝试使用 CONST_THINGY |= 0x03之类的常量修改常量将产生编译器错误。

    可变变量

    C没有您描述的功能。它是一种低级语言(有时被称为“高级汇编”),没有提供许多精美功能(按当今的标准)。这就是为什么它是AVR的选择语言的原因-您希望与硬件保持紧密联系,而又不需要很多额外的开销。

    C的确是指针。根据您的问题和评论,我想您对它们不是很熟悉,因此这里有一个简短的解释:
  • &运算符返回一个指向变量的指针,其用法如下:pointer = &variable;
  • *实际上有两个用途。
  • 首先是声明一个指针变量(即,一个保存指针而不是int,char或float的变量):int *pointer;注意,您必须指定它将指向的变量类型。
  • 第二种用法是所谓的取消引用指针。基本上,这意味着通过指针访问变量。如果pointer指向variable,则*pointer = 42;variable设置为等于42,并且other_var = *pointerother_var设置为variable的值。
  • 也有指针算法,但这超出了此答案的范围。

  • 所有这些的要点是,您可以将变量本身像值一样有效地对待,存储和传递。除了操纵它们的值之外,您无法真正以任何有意义的方式对其进行修改,但是您也不需要这样做。

    关于c - C变量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321424/

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