2012-11-05 93 views
4

有沒有人爲MicroBlaze編寫過多線程C++應用程序? Xilinx文檔指出:MicroBlaze上C++的線程安全

EDK提供的標準C庫不是爲多線程環境而構建的。像printf(),scanf()這樣的STDIO函數和像malloc()和free()這樣的內存管理函數是free()函數的常用示例,它們不是線程安全的。在多線程環境中使用C庫 時,必須使用適當的互斥技術來保護線程不安全的功能。

此外,MicroBlaze GCC報告線程模型爲「單一」。

如果我使用C++標準庫容器,這肯定是不安全的,正確的?

即使從賽靈思獲得這個簡單問題的答案,我也有一段時間,更不用說修復它了。看來這是賽靈思提供的構建系統的主要缺陷。

+1

哇,這使得多線程C++在平臺上幾乎無法使用。如果你創建了自己的線程安全的內存分配器,鉤住'new'和'delete',並確保代碼在任何線程中運行,但是除了你自己的代碼之外沒有任何代碼觸發,你可以使用額外的線程來計算/處理目的。但基本上這使得多線程幾乎無法在平臺上使用。 –

回答

4

賽靈思的答案(通過電子郵件)如下。它沒有提到多線程。它還參考了他們於2006年發佈的軟件工具8.2i(6年前)。總之,這沒有意義。

教訓:

  • 賽靈思的支持是可怕的。
  • 賽靈思軟件工具對他們來說是一種事後的追求。
  • 我只能假定文檔中概述的內容是正確的,特別是您不能在多線程環境中使用動態內存分配。這意味着沒有C++標準庫容器。
  • 如果您是選擇MicroBlaze軟核處理器的硬件人員,請在執行此操作之前檢查固件人員。他期望寫什麼樣的應用程序?確保他知道他不能用C++編寫多線程應用程序。

的malloc()

Microblaze的C庫附帶一個小的,最少的功能 的malloc()。使用時,內存不能被釋放。其他功能,例如 作爲calloc,realloc等,不被支持。當同時使用malloc()和例程(如printf,scanf等)時,也有bug 修復此問題,最小功能malloc()已被刪除。它已經被原來的Newlib malloc()取代了 。因此,您應該看到 沒有功能問題。您可能會看到代碼大小增加了大約 4K。由於malloc()的新全部功能 請求內存的區別,用戶程序可能需要檢查其堆大小設置的 。如果你看到你的malloc()調用返回NULL, 他們曾經工作,嘗試增加你的堆大小。修改 對修復損壞的功能至關重要。

對於極少數情況下,您仍然希望原始的輕量級,但破損的malloc()功能,源代碼(malloc。S)可以是 作爲要編譯的源文件之一包含在其中以構建您的 應用程序。這將保留舊功能,代碼大小 的要求,以及EDK 8.2i之前的動態內存要求。

xil_malloc()

MicroBlaze的C庫附帶一替換實現 動態存儲器分配稱爲xil_malloc的()。這個例程有一些侷限性;它不會從堆中分配內存,而是從固定的64K緩衝區中分配內存。這個例程現在已經被棄用了。雖然 這個例程仍然可用於聯動,但它的使用是強烈的 勸阻。請使用malloc();它比xil_malloc()小,並且 提供更好的功能。使用malloc()時,請確保 檢查您的堆大小設置以滿足您的動態內存 要求。

獨立BSP包含一個參數「need_xil_malloc」。這個 參數旨在允許您編寫包含 malloc()的代碼,但將其連接到xil_malloc()實現。由於 中的錯誤參數的實現以及由於 xil_malloc()的棄用,此參數也被棄用。

Xilkernel包含一個參數「use_xil_malloc」。此參數爲 ,旨在允許內核消息隊列實現使用 xil_malloc()而不是malloc()。由於 xil_malloc()的棄用,此參數也被棄用。

如果您仍然希望xil_malloc()源代碼出於傳統原因,可以下載並使用 「xil_malloc.c」和「xil_sbrk.c」文件。

C++應用程序

此前EDK 8.2i版C++應用程序可能會出現異常行爲, 內存損壞等,要解決這些問題,包括附加的 源文件(newlib_malloc.c)作爲你的一部分應用程序編譯。 這將修復不明原因的崩潰。此解決方法修復了MicroBlaze C庫中的malloc()實現 中的錯誤。這個 解決方法已被納入C庫,從EDK 8.2i開始。

此信息也似乎是可在:http://www.xilinx.com/support/answers/23345.html

+1

http://meta.stackoverflow.com/a/286118/560648 –