Cách nhanh nhất để chuyển đổi một chút trong ASM


7

Cách nhanh nhất để chuyển một bit 1 trong MPASM cho tập lệnh được tăng cường 14 bit là gì? (Tôi đang làm việc với PIC16F1829)

Mã phải là độc lập - ý tôi là nó có thể được gọi vào bất kỳ lúc nào, mà không cần biết giá trị của bit vào thời điểm đó.

Tiêu chí chính là tốc độ ở đây: một chương trình có ít chu kỳ hướng dẫn sẽ tốt hơn. Số chu kỳ hướng dẫn được tính bằng số khi bit bằng 0 + số khi bit bằng 1, chia cho 2.

1: với chuyển đổi Tôi có nghĩa là mã phải tương tự như pin=!pintrong C


Thiết bị PIC16 là gì? Tốt hơn nên gọi nó là lõi, tôi đoán bạn có nghĩa là lõi 14 bit (không tăng cường)?
Wouter van Ooijen

@WoutervanOoijen cảm ơn, ý kiến ​​hay - nhân tiện, đây là lõi nâng cao cho con chip này, nhưng bạn không thể biết điều đó.

Thật thú vị, 'pin =! Pin' trong C có thể nổ tung rất tệ. XC16 cho PIC24 biến điều này thành 11-12 hướng dẫn lắp ráp vì nó không biết gì về hướng dẫn BTG. (Trình biên dịch GCC nhắm mục tiêu tính di động theo tối ưu hóa, do đó cần những thứ như __builtin_btg)
Adam Lawrence

1
@Madmanguruman Ý tôi là nó phải làm như vậy, không phải là nó phải nhanh như vậy :)

@CamilStaps sẽ không tốt hơn để ngăn chặn câu trả lời của tôi bằng cách vô hiệu hóa nó (hồi tưởng lại) với một số từ đã chỉnh sửa trong câu hỏi. Khi câu hỏi đứng, câu trả lời của tôi là cách nhanh nhất để đạt được mục tiêu của bạn và ai đó đến câu hỏi này muộn có thể tự hỏi tại sao bạn không chấp nhận câu trả lời của tôi. Tôi khá vui khi xóa câu trả lời của tôi nếu bạn có thể ngăn chặn nó bằng một cách nào đó.
Andy aka

Câu trả lời:


14

Bạn có thể thử cách sau bằng XOR:

movlw 0x01 ; move 0x01 to W register
xorwf lat, F ; XOR W with port & store result in port latch

Một hoạt động OR độc quyền sẽ bảo toàn các giá trị theo bit trong đó các bit trong thanh ghi làm việc được đặt thành 0 và đảo ngược các giá trị nơi nó được đặt. Vì vậy, bạn cũng có thể sử dụng cùng một kỹ thuật để chuyển đổi nhiều bit.


2
PeterJ, bạn có biết về vấn đề Read-Modify_write không? - cập nhật: Camil làm rõ các quy tắc: lõi tăng cường 14 bit ==> sử dụng thanh ghi LAT thay vì PORT !!!
Wouter van Ooijen

Tôi nghĩ rằng đây là thời gian ngắn nhất bạn sẽ nhận được trên các thiết bị không hỗ trợ hướng dẫn BTG (PIC18, PIC24, v.v.)
Adam Lawrence

@WoutervanOoijen, vâng, điểm tốt tôi sẽ cập nhật câu trả lời
PeterJ

1

Tôi nghĩ ra cái này:

;                                                           Cycles if 1 | Cycles if 0
btfss    port, pin  ; skip next instruction if 1            1           | 1
goto     $+3        ; pin=0, goto PC+3                      1           | 2
bcf      port, pin  ; pin=1, clear pin and...               1           | 
goto     $+2        ;   ...proceed program                  2           |
bsf      port, pin  ; pin=0, set pin and proceed program                | 1           +
; ...                                                       ---------------------------
;                                                           5             4

Điều này mất 4 hoặc 5 chu kỳ hướng dẫn. Là một cái gì đó nhanh hơn có thể?


Tôi nghĩ Peter XOR là người béo nhất. Nhưng bám sát phong cách của bạn: cố gắng bỏ qua hướng dẫn cài đặt pin thay vì nhảy xung quanh nó. cài đặt pin sẽ không thay đổi các cờ, vì vậy bạn có thể bỏ qua cả mệnh đề sau đó và mệnh đề khác theo cách này.
Wouter van Ooijen

@WoutervanOoijen ý bạn là btfss; bsf; bcf? Sau đó, bit sẽ bị xóa bất kể trạng thái. Ý anh là gì? :)

Nếu không được đặt thì do_set thì do_clear khác do_clear. Điều này làm việc cho tôi quá.
Andy aka

@Andyaka đây là if if_set thì do_clear khác do_set

@CamilStaps Tôi đã nhận xét về cách diễn giải của bạn về nhận xét của Wouter - Tôi đã hơi nghịch ngợm vì tôi không nghĩ bạn đã đóng đinh câu hỏi - Tôi tin rằng bạn muốn "mã" đảo ngược một chút rồi thoát HOẶC đảo ngược bit, sau đó đảo ngược một lần nữa sau đó thoát ra.
Andy aka

1

Cách nhanh nhất để chuyển bit1 trong MPASM cho tập lệnh được tăng cường 14 bit là gì? (Tôi đang làm việc với PIC16F1829)

Mã phải là độc lập - ý tôi là nó có thể được gọi vào bất kỳ lúc nào, mà không cần biết giá trị của bit vào thời điểm đó.

Tiêu chí chính là tốc độ ở đây: một chương trình có ít chu kỳ hướng dẫn sẽ tốt hơn. Số chu kỳ hướng dẫn được tính bằng số khi bit bằng 0 + số khi bit bằng 1, chia cho 2.

1: với chuyển đổi Tôi có nghĩa là mã phải tương tự như pin =! Pin trong C

Tôi đã giả định rằng bit bạn muốn chuyển đổi là một phần của thanh ghi có "không quan tâm" trong các bit khác và do đó trao đổi nibble sẽ hoạt động. Bạn không bao giờ nói rằng nó không thể hoạt động như thế này và nếu bạn thiếu các thanh ghi đến mức bạn cần các bit khác thì nên viết lại mã hoặc nâng cấp MCU.

Bạn cần thiết lập 11110000 (bất kỳ mẫu nào sẽ cung cấp bn không bằng bn + 4) ban đầu nhưng sau đó mỗi lần bạn muốn đảo ngược một trong các bit bạn sử dụng: -

hoán đổi f, d

Đó là một hoạt động một chu kỳ và không cần 1 trong thiết lập đăng ký w.

Tất nhiên, trong phần còn lại của chương trình, bạn phải tuân thủ phương pháp thay đổi bit này một lần nữa, bạn đã nói rằng bạn không thể - nói cách khác, hướng dẫn BCF hoặc BSF bị đặt ra ngoài vòng pháp luật.

Tôi đã nghĩ về việc xoay vòng nhưng chúng xoay vòng mang và điều này có thể sẽ làm hỏng thứ - tôi đã không viết mã PIC trong hơn 20 năm nên sự tha thứ phải được đặt lên hàng đầu trong tâm trí của bạn khi bỏ phiếu !!!


0

Nếu bạn muốn đảo ngược mã PIN, bạn phải tải trạng thái của mã pin, vì vậy bạn sẽ phải chọn ngân hàng cho PORTA trước. Vì vậy, đây là mã trong C:

// PORTAbits.RA5=~PORTAbits.RA5;
PORTA=PORTA ^ 0b00100000;

với kết quả trong ASM:

 MOVLB 0x0
 MOVF PORTA, W
 XORLW 0x20
 MOVWF PORTA

Có vẻ như câu trả lời được chấp nhận sẽ nhanh hơn trong một chu kỳ, ngay cả khi chuyển đổi ngân hàng được kết hợp (điều này không phải lúc nào cũng cần thiết nếu bạn theo dõi bạn đang ở ngân hàng nào). Tất nhiên, trình biên dịch C không phải lúc nào cũng cung cấp mã được biên dịch nhanh nhất - đặc biệt là các trình biên dịch miễn phí của Microchip tạo ra mã không được tối ưu hóa.
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.