从 volatile uint8_t* 到 uint8_t* 的无效转换

invalid conversion from volatile uint8_t* to uint8_t*

我正在尝试用 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. 写例如"PINS RS;" 创建 class PINS 实例;一个名为 RS.
  2. 的新引脚
  3. 写入"RS.usepin(PORTB,0);"配置RS引脚到MCU的PORTB0。
  4. DDR使用RS.DDRaddr,PIN使用RS.PINaddr,PORT寄存器使用RS.PORTaddr
  5. 密码使用RS.pinnum;例如:RS.DDRaddr|=(1<

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

Error 1 invalid conversion from volatile uint8_t* to uint8_t*

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

显然 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

"volatile" 意味着读取或写入一个值是一种无法优化掉的副作用。读取或写入 volatile 值可能会影响某些硬件,它可能会导致以与您想象的不同的方式修改该值等等。因此,编译器通常做出的假设(如果将 x 存储到一个变量然后再次读取它,结果将是 x,等等)是错误的。

如果您放弃易失性,那么编译器可能会生成错误的代码。因此,您必须明确而不是隐含地执行此操作。