uint64_t变量带&operations

Ada*_*lis 5 c avr atmel attiny

我有一个函数,它在64位变量(RFID标签号)中搜索九个"1"系列,如果找到,则将它们移动到MSB.理解为什么它不能正常工作我有一个很大的问题.

这是我的变量

uint64_t volatile RFID_data2= 0b1111111110000000000000000000000000000000000000000000000000000000;
Run Code Online (Sandbox Code Playgroud)

我发送它作为功能的指针

test_flag= header_align(&RFID_data2);


uint8_t header_align(uint64_t *data){

uint64_t bit_mask=(uint64_t) 
0b1111111110000000000000000000000000000000000000000000000000000000;


if((*data&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);
return 1;
}
Run Code Online (Sandbox Code Playgroud)

这种情况永远不会实现,但如果我改变了这个条件:

if((*data==bit_mask){
PORTA ^= (1<<PORTA2);
return 1;
    }
Run Code Online (Sandbox Code Playgroud)

它似乎运作良好.

更有甚者,我写了另一个条件 - 这是有效的.

if((*data&bit_mask)>(bit_mask-1) && (*data&bit_mask)<(bit_mask+1 )){
    PORTA ^= (1<<PORTA2);
    return 1
Run Code Online (Sandbox Code Playgroud)

我可以看到它与AND'&'操作有关.另外,当我将RFID_data更改为32位变量时没有任何问题.我正在使用Attiny441和GCC编译器,Atmel Studio有没有办法让它在64位上工作?

我改变了函数来取uint64t(非指针),但问题仍然存在.我也尝试创建全局变量,并删除volatile变换器,但它仍然无法正常工作.使用宏UINT64_C也没有帮助.看起来像 :

uint64_t RFID_data;// global var

int main(void)
{
  RFID_data=(0xFF80000000000000);// write into global var
 uint64_t RFID_data2=(0xFF80000000000000);
   while(1)
   {
    test_flag=header_align(RFID_data2);// send local variable
   }
}


 uint8_t header_align(uint64_t data){
  uint64_t bit_mask = UINT64_C(0xFF80000000000000);


    if((data&bit_mask)==bit_mask){
     PORTA ^= (1<<PORTA2);//nothink
        return 1;
    }
Run Code Online (Sandbox Code Playgroud)

我还尝试通过全局变量检查if-condtion:

     if((RFID_data&bit_mask)==bit_mask){
     PORTA ^= (1<<PORTA2);///nothink
        return 1;
    }
Run Code Online (Sandbox Code Playgroud)

在两种方式中它都不会返回1,也不会改变PORTA2状态.

它只适用于我在header_allgin中创建一个新的局部变量,如下所示:

 uint8_t header_align(uint64_t data){
  uint64_t RFID_data3 = UINT64_C(0xFF80000000000000);
  uint64_t bit_mask = UINT64_C(0xFF80000000000000);


    if((RFID_data3&bit_mask)==bit_mask){
     PORTA ^= (1<<PORTA2);// here i can see signal
        return 1;
    }}
Run Code Online (Sandbox Code Playgroud)

它是通过全局变量还是通过函数调用来实现的?

das*_*ght 0

将常量转换为uint64_t并不是生成uint64_t文字的正确方法。你应该使用UINT64_C宏来代替:

uint64_t bit_mask = UINT64_C(0b1111111110000000000000000000000000000000000000000000000000000000);
Run Code Online (Sandbox Code Playgroud)

或者如果您更喜欢十六进制

uint64_t bit_mask = UINT64_C(0xFF80000000000000);
Run Code Online (Sandbox Code Playgroud)