从 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);
现在这就是我认为的工作方式:
- 写例如"PINS RS;" 创建 class PINS 实例;一个名为 RS.
的新引脚
- 写入"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 设为 class 成员之前,它曾经有效。我不明白问题出在哪里,我无法从类似但不完全相同的问题中得出结论。
有没有人知道这个特定代码有什么问题?
显然 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
"volatile" 意味着读取或写入一个值是一种无法优化掉的副作用。读取或写入 volatile 值可能会影响某些硬件,它可能会导致以与您想象的不同的方式修改该值等等。因此,编译器通常做出的假设(如果将 x 存储到一个变量然后再次读取它,结果将是 x,等等)是错误的。
如果您放弃易失性,那么编译器可能会生成错误的代码。因此,您必须明确而不是隐含地执行此操作。
我正在尝试用 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);
现在这就是我认为的工作方式:
- 写例如"PINS RS;" 创建 class PINS 实例;一个名为 RS. 的新引脚
- 写入"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 设为 class 成员之前,它曾经有效。我不明白问题出在哪里,我无法从类似但不完全相同的问题中得出结论。 有没有人知道这个特定代码有什么问题?
显然 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
"volatile" 意味着读取或写入一个值是一种无法优化掉的副作用。读取或写入 volatile 值可能会影响某些硬件,它可能会导致以与您想象的不同的方式修改该值等等。因此,编译器通常做出的假设(如果将 x 存储到一个变量然后再次读取它,结果将是 x,等等)是错误的。
如果您放弃易失性,那么编译器可能会生成错误的代码。因此,您必须明确而不是隐含地执行此操作。