小编Ada*_*lis的帖子

uint64_t变量带&operations

我有一个函数,它在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 …
Run Code Online (Sandbox Code Playgroud)

c avr atmel attiny

5
推荐指数
1
解决办法
462
查看次数

标签 统计

atmel ×1

attiny ×1

avr ×1

c ×1