uCOS-Ⅱ源碼分析之uC-CPU文件夾

此文共連載分析三個uCOS-Ⅱ的三個源碼文件夾:uC-CPU 、uC-LIB 、uCOS-Ⅱ

uC-LIB文件夾目錄:
ARM-Cortex-M3 / cpu_a.asm、cpu_c.c、cpu.h
cpu_def.h

cpu_def.h

  • 這個文件中定義了一些 CPU 有關的宏定義,分爲三類:

1、CPU 字節長度的定義,理想情況下 CPU 的字長應該是由 sizeof() 函數計算出來的,但是 sizeof() 函數必須在 CPU 運行中才能進行計算,所以在 uCOS 中直接用宏定義定義了出來

#define  CPU_WORD_SIZE_32           4       // 定義 CPU 字節長度爲 4 字節

2、CPU 字節順序的定義,也就是 CPU 的大/小端模式的定義。

#define  CPU_ENDIAN_TYPE_NONE       0       // 不知道是大端模式還是小端模式

#define  CPU_ENDIAN_TYPE_BIG        1       // 大端模式

#define  CPU_ENDIAN_TYPE_LITTLE     2        // 小端模式   

3、臨界區的定義和配置,臨界區是指一個共用資源的程序片段,但共用資源程序片段一次只能被一個線程佔用,當有一個線程正在訪問臨界區時,其他線程或進程就必須等待,以臨界區共用資源的互斥使用(舉例:打印機的使用,一個用戶正在使用打印機,在未使用完成時,其他用戶只能等待前一用戶使用完成後才能使用)。

#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    // 將臨界區狀態保存在局部變量中

cpu.h

  • 核心的就是進入臨界區和退出臨界區的兩個宏

  • 其他的都是一些數據類型重定義和 cpu_c.c 文件中函數的聲明
//設置了臨界區解決辦法,將臨界區狀態保存在局部變量中
# 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); }

cpu_c.c

  • 首先是關於對位帶操作的宏定義,定義了 SRAM 內存的位帶訪問地址範圍和外設寄存器的位帶訪問地址範圍。
  • 然後是函數的定義,包括位帶清零和置位、使能和禁止 CPU 內部中斷源、設置和讀取中斷源的優先級的函數,這些函數的實現都用到了 NVIC 模塊的設置寄存器的位定義和進入/退出臨界區時的兩個設置宏。
  • uCOS-Ⅱ 中的臨界區解決辦法用的全部都是 #define CPU_CRITICAL_METHOD_STATUS_LOCAL 這一種辦法,其他兩個辦法沒有使用。
  • 其中存儲 CPSR 寄存器的局部變量是 CPU_SR 類型的 cpu_sr,這個局部變量是配合進入/退出臨界區的兩個配置宏進行使用的,看到這個變量定義,後面一定就用到了臨界區的操作。

cpu_a.asm

文件中用 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 進入睡眠模式,等待異常喚醒
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章