Vòng lặp while được tối ưu hóa


8

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ó.


3
Bạn không có ý định sử dụng một chút VÀ?
lhballoti

thông thường, bạn sẽ tuyên bố các thanh ghi là không ổn định, và sau đó các vòng lặp mà bạn không sửa đổi mọi thứ sẽ không được tối ưu hóa ... nhưng điều đó nên được thực hiện cho bạn trong các tệp đính kèm.
W5VO

Mặc dù tôi đã phát hiện ra lỗi ngay lập tức, tôi gặp khó khăn trong việc hiểu tại sao trình biên dịch lại tối ưu hóa vòng lặp trong trường hợp đầu tiên. Nếu ADCSRAkhông dễ bay hơi, trường hợp thứ hai cũng có cùng tối ưu hóa không?
lhballoti

Bạn không nên chỉnh sửa câu hỏi của mình bằng câu trả lời, thay vì chấp nhận câu trả lời của ai đó hoặc viết câu trả lời của riêng bạn và chấp nhận nó.
Kellenjb

@Kellenjb - jippie đã thêm nó trước khi nó là một câu trả lời. lhballoti đầu tiên chỉ đưa ra như một nhận xét.
stevenvh

Câu trả lời:


11

Bạn nên sử dụng một chút VÀ. Biểu thức trong whilevòng lặp đầu tiên ước tính bằng 0, điều này khiến trình biên dịch loại bỏ hoàn toàn vòng lặp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.