Tôi có một vi điều khiển phải tải xuống một tệp lớn từ cổng nối tiếp PC (115200 baud) và ghi nó vào bộ nhớ flash nối tiếp qua SPI (~ 2 MHz). Ghi flash phải nằm trong các khối 256 byte trước một lệnh viết và địa chỉ trang. Tổng RAM có sẵn trên hệ thống là 1 kB với kích thước ngăn xếp 80 byte.Làm cách nào để bạn xử lý việc truyền dữ liệu lớn trên các hệ thống nhúng, bộ nhớ bị hạn chế?
Điều này hiện đang hoạt động bằng cách điền bộ đệm 256 byte từ UART và sau đó ping-ponging đến bộ đệm 256 byte khác được lấp đầy bằng ngắt trên tín hiệu sẵn sàng bộ đệm RX trong khi flash được ghi bằng ghi bận. Việc hoán đổi bộ đệm được lặp lại cho đến khi thao tác hoàn tất.
Tôi muốn thiết lập trình xử lý ngắt TX/RX cho cả hai cổng SPI và UART hoạt động trên bộ đệm tròn riêng biệt. Vì vậy, thay vì bỏ phiếu cho byte mới và chờ đợi cho các hoạt động để hoàn thành tôi chỉ có thể điền vào các bộ đệm TX và cho phép gián đoạn hoặc kiểm tra bộ đệm cho dữ liệu đến. Điều này sẽ cung cấp cho rất nhiều chu kỳ đồng hồ cho công việc thực tế thay vì chờ đợi trên thiết bị ngoại vi.
Sau khi triển khai IRQ với bộ đệm tròn 128 byte, tôi thăm dò bộ đệm RX UART cho dữ liệu và đặt ngay vào bộ đệm SPI TX để chuyển tệp. Vấn đề tôi gặp phải với cách tiếp cận này là tôi không có đủ bộ nhớ đệm cho bộ đệm và bộ đệm nhận PC được lấp đầy nhanh hơn tôi nhận được dữ liệu qua bộ đệm truyền phát flash. Rõ ràng, tốc độ truyền tải không phải là vấn đề (115,2 kHz trong và 2 MHz ra), nhưng có một chu kỳ ghi chờ sau mỗi trang 256-byte được truyền đi.
Dường như các ngắt SPI thường xuyên đang chặn một số ngắt UART và khiến byte bị bỏ qua. Giải pháp tôi chọn là sử dụng bộ đệm vòng cho UART nhận ngắt và cấp dữ liệu vào bộ đệm trang 256 byte được gửi tới đèn flash nối tiếp bằng cách bỏ phiếu chuyển byte và ghi hoàn thành. Một bộ đệm 128 vòng là đủ lớn để ngăn chặn tràn trong quá trình ghi SPI.
Lưu ý rằng RAM 1 kB (1024 byte) không cho phép nhiều bộ đệm! Tuy nhiên đó là ý tưởng tốt. –
Đúng, mặc dù bạn cũng có thể thử điều chỉnh kích thước của bộ đệm xuống (có thể là 64b), nhưng chi phí của các cờ bắt đầu tác động đến hiệu quả bộ nhớ của bạn. – joshperry
Tôi sẽ sử dụng một biến cờ đơn với các vết cắn cho mỗi bộ đệm. –