gpt4 book ai didi

c++ - 从 volatile uint8_t* 到 uint8_t* 的无效转换

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:12 25 4
gpt4 key购买 nike

我正在尝试用 C++ 为 AVR 设置一个库。这个想法是有一种简单的方法来配置您在每个设备上使用的引脚。这是图书馆:

class PINS{
public:
//ATTRIBUTES
uint8_t* DDRaddr;
uint8_t* PORTaddr;
uint8_t* PINaddr;
int pinnum;
//METHODS
void usepin(volatile uint8_t *pin, int num);};

void PINS::usepin(volatile uint8_t *pin, int num){
this->pinnum=num;
if(pin==&PORTB){
this->DDRaddr=&DDRB;
this->PINaddr=&PINB;
this->PORTaddr=&PORTB;}
if(pin==&PORTC){
this->DDRaddr=&DDRC;
this->PINaddr=&PINC;
this->PORTaddr=&PORTC;}
if(pin==&PORTD){
this->DDRaddr=&DDRD;
this->PINaddr=&PIND;
this->PORTaddr=&PORTD;}
return;}

这就是它的要求:

PINS RS;
RS.usepin(&PORTC, 0);

现在这就是我认为它的工作方式:

  1. 写例如“销RS;”创建类 PINS 的实例;一个名为 RS 的新 pin。
  2. 写“RS.usepin(PORTB,0);”将 RS 引脚配置到 MCU 的 PORTB0。
  3. 对DDR使用RS.DDRaddr,对PIN使用RS.PINaddr,对PORT寄存器使用RS.PORTaddr
  4. 使用 RS.pinnum 作为密码;例如:RS.DDRaddr|=(1<

当我尝试在 Atmel Studio 中构建它时,每一行都会出现以下错误:“this->DDRaddr=&DDRB;”错误说:

Error 1 invalid conversion from volatile uint8_t* to uint8_t*

在我将 uint8_t* DDRaddr 设为类成员之前,它曾经有效。我不明白问题出在哪里,我无法从类似但不完全相同的问题中得出结论。有没有人知道这个特定代码有什么问题?

最佳答案

显然 DDRBvolatile uint8_t 类型,但您试图将其地址分配给 uint8_t*。这是不允许的 - volatile 在这方面遵循与 const 相同的规则。

如果您打算像这样使用成员,则必须将它们声明为指向 volatile 的指针:

class PINS{
public:
//ATTRIBUTES
volatile uint8_t* DDRaddr;
volatile uint8_t* PORTaddr;
volatile uint8_t* PINaddr;
// ... rest as before

关于c++ - 从 volatile uint8_t* 到 uint8_t* 的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581827/

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