thắc mắc Linux C : Thắc măc về Thread

Marubow1

Junior Member
Chào các fen,
Em đang code về Thread trên C/C++ có vấn đề đọc dữ liệu qua Uart để xử lý. tầm 300ms 1 frame 255 byte tới và rất nhiều.
Em đang xử lý frame trong thread đó và bị miss mất
Các vozer làm nhiều về cái này cho em lời khuyên xử lý như nào cho hợp lý được không ạ
 
Bác nói chung chung quá,
Phần mềm của bác xử lý dữ liệu liên tục dạng streaming ko?
Phần cứng xử lý là gì?
Bác dùng C thuần hay C++?
 
Tạo 2 thread, 1 để get data từ port khi có dự liệu đến, sau đó lưu vào 1 buffer, 1 cái nữa để đọc data từ buffer ra
 
Bác nói chung chung quá,
Phần mềm của bác xử lý dữ liệu liên tục dạng streaming ko?
Phần cứng xử lý là gì?
Bác dùng C thuần hay C++?
liên tục ạ, luôn luôn trong trạng thái chờ có dữ liệu tới và xử lý ạ
Thuần C là chính ạ
Phần cứng là board embedded linux ạ 128Mb ram 256Mb flash ạ
 
Tạo 2 thread, 1 để get data từ port khi có dự liệu đến, sau đó lưu vào 1 buffer, 1 cái nữa để đọc data từ buffer ra
Em nghĩ cách này nhưng có thể chưa làm hết nên có nhược điểm em nhìn thấy
VD 1 uart nhận DL : 1 thread đọc DL này chuyển ra 1 buffer, sau đó 1 thread khác lại thao tác trên buffer này. mutex ở đây khi DL tới mà bên đọc xử lý liệu có vấn đề gì k ạ, có cần FIFO k ạ
Và tiếp theo là có n ngoại vi thì sẽ có 2 * n thread xử lý ạ
EM chưa làm thread bao giờ nên hơi loằng ngoằng nhỉ :LOL:)
 
mutex ở đây khi DL tới mà bên đọc xử lý liệu có vấn đề gì k ạ, có cần FIFO k ạ
Bên thread đọc data từ buffer: lock -> read data -> nhả lock thì sao lại có vấn đề đc bạn?
Về case n ngoại vi, bạn cần xem xét trade off giữa việc đọc data liên tục vs tài nguyên hệ thống (thread)
 
Mình từng gặp một issue khá giống của bạn ở 1 dự án cũ, nhưng mà hồi đấy data của mình là từ module spi gửi lên. Cách giải quyết ở đây là bạn phải tạo ra một buffer để lưu dữ liệu nhé, còn cách tổ chức buffer kiểu gì thì tùy bạn. Hồi đó mình tạo ra 1 mảng để lưu dữ liệu đọc từ thread xử lý SPI -> lưu dữ liệu và mảng, bật cờ check flag on lên cho phần tử array chứa data (tất nhiên là phải có lock mutex khi ghi dữ liệu). Sau đó thread xử lý data sẽ quét cái mảng array chứa data kia, phần tử nào có flag on thì nghĩa là chứa dữ liệu mà mình sẽ lấy nó ra (dùng mutex lock khi đọc nhé), sau khi xử lý xong thì trả cờ flag về off để thằng thread đọc có thể lưu data tiếp theo. Lưu ý nếu trường hợp tốc độ ghi luôn lớn hơn tốc đọc thì phải có cơ chế xử lý để chống tràn buffer nhé.
 
Back
Top