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

标签 c++ avr-gcc

我正在尝试用 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/

相关文章:

c++ - 在C++中,将左值完美转发到函数模板的正确方法是什么?

g++ 中的 C++11 链式构造合规性

arduino - 为什么在avr中寻址DDRx、PORTx时要加Offset?

real-time - AVR 上的多任务 RTOS

我可以在 C 中执行类似 #define ARRAY(size) char[##size##] 的操作吗?

c - va_arg(argp, float) 崩溃了

c++ - 将本地时间调整为夏令时 C++

c++ - 无法将字符串从命令行转换为 float 组

c++ - 是否可以从 C++ 在 QML 上编写上下文属性?

c - 如何创建一个库,其中链接器仅链接我的程序使用的函数?