此文共連載分析三個uCOS-Ⅱ的三個源碼文件夾:uC-CPU 、uC-LIB 、uCOS-Ⅱide
uC-LIB文件夾目錄:
ARM-Cortex-M3 / cpu_a.asm、cpu_c.c、cpu.h
cpu_def.h函數
一、CPU 字節長度的定義,理想狀況下 CPU 的字長應該是由 sizeof() 函數計算出來的,可是 sizeof() 函數必須在 CPU 運行中才能進行計算,因此在 uCOS 中直接用宏定義定義了出來線程
#define CPU_WORD_SIZE_32 4 // 定義 CPU 字節長度爲 4 字節
二、CPU 字節順序的定義,也就是 CPU 的大/小端模式的定義。code
#define CPU_ENDIAN_TYPE_NONE 0 // 不知道是大端模式仍是小端模式 #define CPU_ENDIAN_TYPE_BIG 1 // 大端模式 #define CPU_ENDIAN_TYPE_LITTLE 2 // 小端模式
三、臨界區的定義和配置,臨界區是指一個共用資源的程序片斷,但共用資源程序片斷一次只能被一個線程佔用,當有一個線程正在訪問臨界區時,其餘線程或進程就必須等待,以臨界區共用資源的互斥使用(舉例:打印機的使用,一個用戶正在使用打印機,在未使用完成時,其餘用戶只能等待前一用戶使用完成後才能使用)。進程
#define CPU_CRITICAL_METHOD_NONE 0 // 發生臨界區問題是不解決 // 在有線程進入臨界區前,暫時禁止中斷響應,防止高優先級中斷打斷正在臨界區的線程,在退出臨界區時再使能中斷 #define CPU_CRITICAL_METHOD_INT_DIS_EN 1 // 用禁止/使能中斷的方法解決臨界區問題 #define CPU_CRITICAL_METHOD_STATUS_STK 2 // 將臨界區狀態保存在棧中 #define CPU_CRITICAL_METHOD_STATUS_LOCAL 3 // 將臨界區狀態保存在局部變量中
核心的就是進入臨界區和退出臨界區的兩個宏內存
//設置了臨界區解決辦法,將臨界區狀態保存在局部變量中 # define CPU_CFG_CRITICAL_METHOD CPU_CRITICAL_METHOD_STATUS_LOCAL //進入臨界區前調用這個宏,實現將 CPSR 寄存器備份,而後關閉中斷響應 # define CPU_CRITICAL_ENTER() { cpu_sr = CPU_SR_Save(); } //退出臨界區後調用這個宏,實現將 CPSR 寄存器還原,中斷響應開啓 # define CPU_CRITICAL_EXIT() { CPU_SR_Restore(cpu_sr); }
文件中用 EXPORT 導出了多個函數,定義了一些彙編語言書寫的函數:資源
EXPORT CPU_IntDis // 全局中斷的禁止 EXPORT CPU_IntEn // 全局中斷的使能 EXPORT CPU_SR_Save // 將 CPSR 寄存器內容保存到 R0 寄存器中,而後禁止全局中斷 EXPORT CPU_SR_Restore // 將 R0 寄存器內容恢復到 CPSR 寄存器中 EXPORT CPU_CntLeadZeros // 前導零計數 EXPORT CPU_RevBits // 二進制層面取反, 1010 ---> 0101 EXPORT CPU_WaitForInt // CPU 當即進入睡眠模式,等待中斷喚醒 EXPORT CPU_WaitForExcept // CPU 進入睡眠模式,等待異常喚醒