我正在尝试用 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);
现在这就是我认为它的工作方式:
- 写例如“销RS;”创建类 PINS 的实例;一个名为 RS 的新 pin。
- 写“RS.usepin(PORTB,0);”将 RS 引脚配置到 MCU 的 PORTB0。
- 对DDR使用RS.DDRaddr,对PIN使用RS.PINaddr,对PORT寄存器使用RS.PORTaddr
- 使用 RS.pinnum 作为密码;例如:RS.DDRaddr|=(1<
当我尝试在 Atmel Studio 中构建它时,每一行都会出现以下错误:“this->DDRaddr=&DDRB;”错误说:
Error 1 invalid conversion from volatile uint8_t* to uint8_t*
在我将 uint8_t* DDRaddr 设为类成员之前,它曾经有效。我不明白问题出在哪里,我无法从类似但不完全相同的问题中得出结论。 有没有人知道这个特定代码有什么问题?
最佳答案
显然 DDRB
是 volatile 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/