簡體   English   中英

在多個 c mex s-functions 之間共享數據

[英]Share data between multiple c mex s-functions

我正在實施幾個 c s 函數。 它們必須依賴於相同的指針和變量,而不依賴於當前的 s-function。

基本上,我想在一個“設置”s 函數(在 mdlInitialize 內部)中實例化所有變量和指針,然后能夠在其 mdlOutputs 函數中的不同 s 函數中使用這些變量和指針。 每個 s 函數都將用 c 編寫。

我在 mathworks 幫助中找不到任何有用的提示。 你有什么主意嗎? 謝謝。

有幾種方法可以做到這一點,盡管它們都不是最好的方法。

一種方法是在 dll 中定義所有內容,並讓每個 S-Function 加載它。 這在如何在 C S-Functions 之間共享 C 結構體的問題中進行了概述 .

另一種(也是我的首選)方法是創建一個自定義數據類型,它是一個包含所有共享數據的 C 結構,並將其作為模型中 S-Function 之間的信號傳遞。 這在文檔Configure Custom Data Types 的Using Opaque Data Types in C S-Functions部分中進行了概述。

該文檔顯示了需要在創建自定義結構的 S-Function 中完成的各種(相對簡單)的事情。 在此 S-Functions MdlOutputs方法中,自定義結構將僅以通常的方式成為塊的輸出。 例如,如果包含您的數據的自定義結構被定義為,

typedef struct{
    real_T sig0;
    real_T sig1;
}myStruct;

然后在mdlInitializeSizes您需要類似的東西,

myStruct tmp;

/* Register the user-defined data types */
id = ssRegisterDataType(S, "customDataType");
if(id == INVALID_DTYPE_ID) return;

/* Set the size of the user-defined data type */
status = ssSetDataTypeSize(S, id, sizeof(tmp));
if(status == 0) return;

/* Set the zero representation */
tmp.sig0 = 0;
tmp.sig1 = 0;
status = ssSetDataTypeZero(S, id, &tmp);

並將其作為信號輸出,在mdlOutputs方法中,您將有類似的東西

myStruct *pY0 = (myStruct *)ssGetOutputPortSignal(S, 0);

pY0[0].sig0 = 'value of this param';
pY0[0].sig1 = 'value of this param';

然后在需要使用此信號的任何 S-Function 的mdlInitializeSizes

DTypeId  id;
id = ssRegisterDataType(S, "customDataType");
if(id == INVALID_DTYPE_ID) return;

然后通過使用,您可以訪問任何其他方法中的自定義結構,

myStruct **uPtrs = (myStruct **) ssGetInputPortSignalPtrs(S,0);

然后以通常的方式訪問結構的元素,

firstVar = uPtrs[0]->sig0;
secondVar = uPtrs[0]->sig1;

這種方法的主要缺點是模型不能用於代碼生成(使用 Simulink Coder)。

生成的代碼中在 S-Function 之間共享數據的最簡單方法就是通過全局變量傳遞數據,以防您的 S-Function 是非內聯的。

因為已經定義的變量出現錯誤,所以我想您是在目標平台中編譯生成的代碼。 在這種情況下,它是由重復定義引起的——全局變量必須僅在“設置”S-Function 中定義,並在所有其他 S-Function 中用extern關鍵字聲明(這只是目標中的普通 C) .

在 Simulink 環境下用 mex 編譯 S-Function 時,不能靜態鏈接到其他 S-Function。 雖然可以將多個 S-Function 與同一個外部 C 源文件鏈接起來,但在 Simulink 中,可能會獲得為每個 S-Function 獨立創建的相同數據的多個實例。 因為 S-Function 在 Simulink 環境中獨立編譯和鏈接,所以在每個 S-Function 中定義公共全局變量沒有意義——您不能 extern 它們,因為它們不會為鏈接器定義(由 mex 調用)。

在目標上鏈接全局變量的明顯缺點是您不能使用 Simulink 環境來調試依賴於共享數據的功能。 但是如果它不是主要功能(例如一些補充日志),它可以有條件地包含在 S-Function 中的 RT 標志中,只出現在生成的代碼中,允許驗證 Simulink 中的主要功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM