从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;"以创建类PINS的实例;一个名为RS的新引脚
- 写入"RS.usepin(PORTB,0);"以将RS引脚配置为MCU的PORTB0
- 使用RS.DDRaddr表示DDR,RS.PINaddr表示PIN,RS.PORTaddr表示PORT寄存器
- 使用RS.pinnum作为引脚编号;例如:RS.DDRaddr|=(1<
当我试图在Atmel Studio中构建它时,每一行都会出现以下错误:"this->DDRaddr=&DDRB;"错误显示:
错误1从volatile uint8_t*到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
"volatile"表示读取或写入值是无法优化的副作用。读取或写入volatile值可能会影响某些硬件,可能会导致该值以与您想象的不同的方式进行修改,等等。因此,编译器通常会做出的假设(如果您将x存储到变量中,然后再次读取,结果将是x,等等)是错误的。
如果去掉了易失性,那么编译器可能会生成错误的代码。因此,你必须明确而不是含蓄地这样做。
相关文章:
- 从值小于256的uint16到uint8的Endian安全转换
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将具有不同字段的结构转换为 uint8 的数组
- 如何将 uint8 列表转换为其相应的有符号值
- 如何将元素从 Swift 中的 [UnsafeMutablePointer<UInt8>] 转换为 C++ 中的 UInt8 *
- 从字符串转换为 uint8,反之亦然
- 将 UInt8 C++值转换为 C# 字节数组
- 警告缩小转换范围(uint32 到 uint8)
- 将 uint8 转换为范围为 0-1 的浮点数的最有效方法
- 将 Uint8 转换为无符号字符 RGB 值
- 将uint8的矢量转换为ascii十六进制字符串的更好方法
- 从std::string转换为uint8
- Jagged Uint8数组转换为C#字节
- 将"wstring"转换为"const UInt8 *"
- 我如何将bitset转换为字节/uint8数组
- 如何在c++中将UINT8转换为UINT32 ?
- 我如何将uint8_t (SDL中的Uint8)转换为字符串
- 将uint8 vector类型的元素转换为stringstream类型
- Node.js 6增加了将Buffer.from()转换为const UInt8*的功能