我试图在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);
现在这就是我认为它会起作用的方式:
当我尝试在Atmel Studio中构建它时,我对每一行都有以下错误:" this-> DDRaddr =& DDRB;"错误说:
错误1从易失性uint8_t *转换为uint8_t *
无效
在我将uint8_t * DDRaddr作为类成员之前,它曾经工作过。我无法理解问题是什么,我无法从类似的问题得出结论 - 但却不完全相同 - 问题。 有没有人能够知道这个特定代码有什么问题?
答案 0 :(得分:2)
显然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
答案 1 :(得分:2)
“volatile”意味着读取或写入值是无法优化的副作用。读取或写入易失性值可能会影响某些硬件,可能会导致以不同的方式修改值,等等。因此,编译器通常会做出的假设(如果将x存储到变量然后再次读取结果将是x,依此类推)是错误的。
如果抛弃volatile,那么编译器可能会生成错误的代码。因此,您必须明确而非隐含地执行此操作。