嵌入式之去模組初始化
初始化和去初始化一般是成對出現的,而很多時候,往往會忽略去初始化過程,因為部分的情況下,程序一結束,資源就會被系統自動**,也就沒有去初始化的必要,這個很容易養成忽略去初始化的過程,系統資源管理考慮不全的習慣。當分配堆記憶體時,申請共享記憶體、申請鎖資源等系統資源時,如果在程序退出後,不做銷毀、釋放,就會占用系統的資源,影響資源的配置、程序的正常執行。所以不管什麼時候,都應該養成去初始化的習慣。
去初始化只要考慮一下以下方面:
(1)記憶體釋放
(2)執行緒釋放
(3)系統資源銷毀(共享記憶體、鎖資源、訊號量等)
(4)釋放描述符(tcp通訊描述符、檔案描述符等)
…記憶體釋放
記憶體釋放需要注意幾個細節
(1)避免野指標
記憶體釋放後,需要將指標置為null
free
(p);
p=null
;
(2)記憶體釋放的先後順序問題
struct str
*str_manage;
str_manage =
(struct str *
)malloc
(sizeof
(*str_manage)
);
如果先free(str_manage);後free(name);則是由問題的
因為free(str_manage),結構體內的name變數占用的空間被釋放了,此時的釋放name就會出錯。
正確的做法是先釋放結構體成員free(name),後釋放結構體(str_manage)
執行緒釋放
通常會建立乙個全域性變數來控制線程開啟與關閉,初始化時就將變數置為1,去初始化時就將變數置為0。
例如:變數quit來控制線程的開關,去初始化時只需將quit變為0即可實現執行緒的退出。執行緒退出後需要對資源進行銷毀。
int
thread_fun()
return0;
}
linux系統中程式的執行緒資源是有限的,表現為對於乙個程式其能同時執行的執行緒數是有限的。而預設的條件下,乙個執行緒結束後,其對應的資源不會被釋放,於是,如果在乙個程式中,反覆建立執行緒,而執行緒又預設的退出,則最終執行緒資源耗盡,程序將不再能建立新的執行緒。
(1)分離執行緒(2)可結合執行緒
使用pthread_join**執行緒。三種執行緒退出方式可用pthread_join**
1、子執行緒使用return退出,主線程中使用pthread_join**執行緒。
2、子執行緒使用pthread_exit退出,主線程中使用pthread_join接收pthread_exit的返回值,並**執行緒。
3、主線程中呼叫pthread_cancel,然後呼叫pthread_join**執行緒。
void
pthread_exit
(void
*retval)
;
引數:retval表示執行緒退出狀態,通常傳null
intpthread_join
(pthread_t thread,
void
**rval_ptr)
;//成功返回0,否則返回錯誤編號
intpthread_cancel
(pthread_t tid)
;//成功返回0,失敗返回錯誤編號
注:分離執行緒的資源可以自動**,但無法確定執行緒資源是什麼時候**的,可結合執行緒是人為自動**,可以確定執行緒資源是什麼時候**的。
系統資源銷毀
(1)互斥鎖
pthread_mutex_destroy
(&audioalarmctrl.audioalarm_mutex)
;
釋放描述符
close
(fp)
;
嵌入式系統初始化過程
系統初始化過程可以分為 3 個主要環節,按照自底向上 從硬體到軟體的次序依次為 片級初始化 板 級初始化和系統級初始化。1.片級初始化 完成嵌入式微處理器的初始化,包括設定嵌入式微處理器的核心暫存器和控制暫存器 嵌入式微處理器核心工作模式和嵌入式微處理器的區域性匯流排模式等。片級初始化把嵌入式微處理...
嵌入式Linux系統初始化的過程
通過busybox製作的根檔案系統的啟動過程可以總結如下 一 核心首先啟動第乙個指令碼檔案 linuxrc。二 然後執行 sbin init這個系統程序,這個程序是核心的第乙個程序,區別第一步的第 乙個腳步檔案linuxrc。執行init程序時依次執行以下步驟 1 為init設定訊號處理程序 2 初...
嵌入式Linux系統初始化的過程
通過busybox製作的根檔案系統的啟動過程可以總結如下 一 核心首先啟動第乙個指令碼檔案 linuxrc。二 然後執行 sbin init這個系統程序,這個程序是核心的第乙個程序,區別第一步的第 乙個腳步檔案linuxrc。執行init程序時依次執行以下步驟 1 為init設定訊號處理程序 2 初...