Task中啟動task的風險分析

2021-07-23 16:57:29 字數 1161 閱讀 9887

序:

這兩天遇到乙個task中引數傳遞錯誤的問題,折騰了一天多,總算找到原因了,記錄之。

設計思維:

maintask是程式的主task,在 maintask() 中重新建立新的task,呼叫關係:

maintask()

實際引數(位址)資訊:

param(0x12a154)=0x0;

void taskastart( int param )

void taska( void

*pvparameters )

實際引數(位址)資訊:

*pvparameters(0x12a234) = 0x456;

s(0x12bafc) = 0x456;

為什麼不在maintask中直接呼叫 xtaskcreate ?

為了封裝,將taskastart放在別的模組,並增加條件判斷。

上面程式呼叫後,總是發現pvparameters引數是錯誤的,邏輯沒問題,彙編也看不出321,因為硬體無法連線j-link,只能硬著頭皮分析。

錯誤分析:

函式 vlwiptcprecvstart 執行完之後,已經return, vlwiptcprecvstart 棧被釋放, 函式中定義的 socket1 也被釋放, 之後socket1位址對應記憶體區域屬於未知區域,出錯也就屬於情理之中的事情了。

解決方法:

不需要重新定義變數直接使用原來socket_fd的位址傳遞,既保證了引數變換的實時性,又安全,以下是正常的呼叫關係。

maintask()

實際引數(位址)資訊:

param(0x12a154) = 0x0;

void taskastart( int *param )

void taska( void *pvparameters )

實際引數(位址)資訊:

*pvparameters(0x12a234) = 0x0;

s(0x12bafc) = 0x0;

結論:

注意變數在函式中的作用域。

REX OS中TASK的啟動過程

任務的啟動過程 1.rex 沒有對任務的啟動做任何限制。2.一旦由rex def task 啟動的任務成為就緒任務中優先順序最高的任務,rex 就開始執行該任務。3.在rex 中沒有暫停後再啟動和開始執行命令的概念。4.在dmss 中期望統一各任務的啟動以便每個任務都有機會做初始化操作,但它們執行的...

C Task的使用 Task的啟動

net 4.0包含的新命名空間system.threading.tasks,它包含的類抽象出了執行緒功能。任務表示應完成的某個單元的工作。這個單元的工作可以在單獨的執行緒中執行,也可以以同步的方式啟動乙個任務,這需要等待主調執行緒。使用任務不僅可以獲得乙個抽象層,還可以對底層執行緒進行許多控制。啟動...

verilog中的task用法

定義乙個任務。task task demo 任務定義結構開頭,命名為 task demo input 7 0 x,y 輸入埠說明 output 7 0 tmp 輸出埠說明 if x y 給出任務定義的描述語句 tmp x else tmp y endtask 上述 定義了乙個名為 task demo...