我有一个函数在 64 位变量(RFID 标签号)中搜索一系列九个“1”,如果找到,将它们移动到 MSB。我很难理解为什么它不能正常工作。
这是我的变量
uint64_t volatile RFID_data2= 0b1111111110000000000000000000000000000000000000000000000000000000;
我将它作为指向函数的指针发送
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;
}
这个条件永远不会满足,但是如果我将条件更改为:
if((*data==bit_mask){
PORTA ^= (1<<PORTA2);
return 1;
}
它似乎运作良好。
更重要的是,我写了另一个条件 - 这是有效的。
if((*data&bit_mask)>(bit_mask-1) && (*data&bit_mask)<(bit_mask+1 )){
PORTA ^= (1<<PORTA2);
return 1
正如我所看到的,这是 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;
}
我还尝试通过全局变量检查 if-condtion:
if((RFID_data&bit_mask)==bit_mask){
PORTA ^= (1<<PORTA2);///nothink
return 1;
}
在这两种方式中,它都不会返回 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;
}}
是通过全局变量还是通过函数参数使其工作?