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

时间:2015-04-11 18:57:47

标签: 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. 写例如" PINS RS;"创建类PINS的实例;一个名为RS的新引脚。
  2. 写" RS.usepin(PORTB,0);"将RS引脚配置为MCU的PORTB0。
  3. 使用RS.DDRaddr用于DDR,RS.PINaddr用于PIN,RS.PORTaddr用于PORT寄存器
  4. 使用RS.pinnum作为密码;例如:RS.DDRaddr | =(1<

当我尝试在Atmel Studio中构建它时,我对每一行都有以下错误:" this-> DDRaddr =& DDRB;"错误说:

  

错误1从易失性uint8_t *转换为uint8_t *

无效

在我将uint8_t * DDRaddr作为类成员之前,它曾经工作过。我无法理解问题是什么,我无法从类似的问题得出结论 - 但却不完全相同 - 问题。 有没有人能够知道这个特定代码有什么问题?

2 个答案:

答案 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,那么编译器可能会生成错误的代码。因此,您必须明确而非隐含地执行此操作。