序:
這兩天遇到乙個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...