2009-11-25 18 views
7

Có chức năng memcpy không đồng bộ nào trong linux không? Tôi muốn nó làm việc với DMA và thông báo cho tôi khi nó được hoàn thành.memcpy không đồng bộ trong linux?

+0

Nền tảng nào? Đây có phải là x86 không? –

+1

Đây là bộ vi xử lý ARM9, bộ điều khiển vi mô Freescale iMX233. – SunnyShah

Trả lời

7

Theo như tôi biết, CPU không/không thể tự thực hiện DMA. Vì vậy, bạn cần một phần cứng bên ngoài trên xe buýt để làm các trick cho bạn. Tuy nhiên phần lớn phần cứng không thể giải quyết tất cả bộ nhớ vật lý, do đó, một bản sao memcpy chính xác là không thể trừ khi bạn có định nghĩa rất nghiêm ngặt về phạm vi địa chỉ bộ nhớ trong trường hợp sử dụng của bạn. Quay lại đầu trang Nếu không kernel sẽ phải ghi nhớ khối đó vào chính block bộ nhớ của chính bạn, nó sẽ giết mục đích của việc nhân bản memcpy ngay từ đầu :)

Nhưng vẫn còn nếu bạn muốn tạo một "bản sao" của khối bộ nhớ mà không dùng memcpy (Vẫn còn một ý tưởng tồi bằng cách bởi vì truy cập bộ nhớ DMA thường chậm hơn so với CPU), bạn có thể gửi khối bộ nhớ đến card video và kéo nó trở lại bộ đệm khác. Bạn thậm chí có thể đặt khối trong bộ nhớ video (putbitmap()? :)) và thực hiện bitblt tăng tốc phần cứng() để tạo bản sao khi đang di chuyển.

Bạn có nhớ chia sẻ mục tiêu thực sự của mình để mọi người có thể đưa ra các thủ thuật thông minh hơn hay tốt hơn không?

+0

@ssg, Mục tiêu thực tế của tôi là tạo trình phát video được tối ưu hóa, Trong đó tôi sao chép dữ liệu YUV của mình vào hàng đợi của nó. Bây giờ bản sao đó mất 2 giây, Nếu bản sao này xảy ra thông qua DMA hơn Trong thời gian này Trong một chủ đề khác, tôi có thể thực hiện giải mã âm thanh. – SunnyShah

+3

@Sunny Shah, Bạn nên xem xét giải pháp sao chép 0 có lẽ sử dụng bộ nhớ dùng chung? Tại sao bạn sao chép những phần lớn bộ nhớ như thế? – Dipstick

+1

FFMPEG xuất ra YUVFrame làm đầu ra hàm giải mã. khi bạn muốn YUVFrame tiếp theo, nó chỉ chỉnh sửa YUVFrame hiện có để tạo mới. Vì vậy, những gì tôi làm là, tôi sao chép YUVFrame để xếp hàng của bộ đệm và sẽ hiển thị khung từ hàng đợi khi thời gian của nó đến. Bản sao này mất khoảng 7% thời gian xử lý. – SunnyShah

3

Trên bộ xử lý đa lõi hoặc thậm chí chỉ là bộ xử lý với hyper-threading, bạn có thể sắp xếp những gì bạn muốn bằng cách thực thi (đồng bộ) thông thường (đồng bộ) memcpy trong một chuỗi riêng biệt. Tôi không nói đó là một ý tưởng hay, chỉ cần chỉ ra điều hiển nhiên.

1

Bạn có thể thực hiện một số lần phát bằng mremap. Hoặc bạn có thể hack FFmpeg để sử dụng các bộ đệm khác nhau cho các khung hình khác nhau.

Các vấn đề liên quan