[Help] Xin gợi ý về FIFO hoặc cái gì tương tự
Xin mọi người cho ý kiến về cách giải quyết vấn đề được nêu sau đây của mình
Mình sử dụng dspic33F Giả sử mình cần làm một đối tượng giống như một FIFO RAM có kích thuớc là 1024 byte Đầu ra của RAM là khi đọc RAM, sau khi đọc thì số byte có thông tin hữu ích trong RAM giảm xuống Đầu vào của RAM, ghi dữ liệu vào RAM, nếu ghi đầy thì không cho ghi nữa hoặc set 1 cờ nào đó để báo đã đầy RAM để phía ghi biết mà không ghi dữ liệu vào nữa. Đầu ra và đầu vào độc lập. Mong mọi nguời hướng dẫn mình một ý tưởng để thực hiện việc này, mình định dùng module DMA nhưng thấy nó không giống ý của mình lắm. Cảm ơn mọi nguời đã quan tâm |
Thế này được không ? :)
Code:
BYTE fifo[1024]; |
Thật cảm ơn anh đã trả gợi ý.
Cách làm của anh về lí mà nói thì đuợc rồi, tuy nhiên cách làm như vậy mình e là sẽ làm giảm hiệu suất của PIC đi rất nhiều, cứ mỗi lần chúng ta ghi và đọc chúng ta lại phải kiểm tra xem FIFO buffer có đang đầy hay đang rỗng không, không biết có cách nào ít số lần kiểm tra hơn không nhỉ ? Dù sao cũng rất cảm ơn mod đã gợi ý. |
Trích:
|
Nhìn duới góc độ mã ASM đi, với dspic
một lệnh ghi hoặc đọc dữ liệu bình thường sẽ thực hiện tốt nhất là 1 chu kì lệnh nếu có tham số là thanh ghi. Cứ kể nó là 3 chu kì lệnh (để bù vào các cái râu ria đi). Ở trường hợp này (Mình chỉ lấy ví dụ của anh Tuan để giải thích, không có ý gì khác, mong anh Tuan bỏ qua) Code:
BYTE push(BYTE b) { Thực hiện so sánh 1 lần ==> một lệnh so sánh Thực hiện lệnh rẽ nhánh, trường hợp code tốt nhất thì vẫn tốn một chu kì lệnh ==> Tốn thêm 3 chu kì lệnh. Như vậy để thực hiện việc di chuyển 1 dữ liệu chúng ta cần 6 chu kì lệnh, 3 để di chuyển, 3 để kiểm tra hiệu suất của quá trình này là 3/(3+3) = 50%, từ 100% xuống còn 50% là nhiều rồi |
Trích:
Quá trình copy dữ liệu vào mảng cần 5 chu kỳ máy vì luôn phải tăng wrHead, ngoài ra cần thêm 4 chu kỳ máy của lệnh call và return. Thực tế nếu code đoạn mã trên bằng asm thì nhìn chung số chu kỳ máy tăng thêm chỉ khoảng 3, từ 9 lên 12. Nếu chương trình của bạn chỉ làm mỗi việc push/pop thì hiệu suất công việc của bạn sẽ giảm đi 33%. |
Đây là gợi ý về 1 FIFO vòng, tức không cần reset các index, rdCount và wrCount sẽ tự động quay vòng giá trị trên Buffer nếu FIFO chưa đầy.
Code:
#define BUFFER_SIZE (unsigned int)1024 |
Cảm ơn mọi người đã chỉ giúp, mình sẽ thử.
|
Múi giờ GMT. Hiện tại là 01:36 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam