У меня есть функция, которая ищет серии из девяти «1» в 64-битной переменной (номер метки RFID) и, если она найдена, перемещает их в 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 (без указателя), но проблема все еще сохраняется. Я также пытался создать глобальный переменный и удалить изменчивый модификатор, но он все еще не работает должным образом.
Использование макроса 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((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;
}}
Можно ли заставить его работать с помощью глобальной переменной или аргумента функции?