Tôi có đoạn mã sau trong chương trình vi điều khiển của mình:
// Wait for ADC conversion to complete
while ( ( ADCSRA && _BS( ADSC ) ) == _BS( ADSC ) ) {}
Trong đó ADCSRA là một thanh ghi sẽ thay đổi giá trị của nó sau khi hoàn thành chuyển đổi tương tự và nơi tôi muốn chờ một chút để rõ ràng. Bit này cho biết chuyển đổi hoàn thành.
Nhìn vào mã lắp ráp kết quả, toàn bộ vòng lặp được thay thế bằng một lệnh duy nhất:
in r24, 0x06 ; ADCSRA
Sổ đăng ký đã được đọc, nhưng giá trị của nó thậm chí còn chưa được kiểm tra!?
Làm cách nào để thay đổi mã C ++ của mình để hướng dẫn trình biên dịch tiếp tục kiểm tra lại thanh ghi mà không làm trì hoãn chương trình không cần thiết?
Tôi sử dụng chuỗi công cụ avr-gcc.
EDIT: Tôi đã thay đổi mã như sau (Thnx: lhballoti):
while ( ( ADCSRA & _BS( ADSC ) ) == _BS( ADSC ) ) {}
Thay đổi mã lắp ráp thành:
38: 36 99 sbic 0x06, 6 ; 6
3a: fe cf rjmp .-4 ; 0x38 <__CCP__+0x4>
Mà giải quyết vấn đề.
Kiểm tra này trang cho chương trình hoàn chỉnh và tháo rời mã kết quả của nó.
ADCSRA
không dễ bay hơi, trường hợp thứ hai cũng có cùng tối ưu hóa không?