寫在前面:
由于時間的不足與學習的碎片化,寫博客變得有些奢侈。
但是對于記錄學習(忘了以后能快速復習)的渴望一天天變得強烈。
既然如此
不如以天為單位,以時間為順序,僅僅將博客當做一個知識學習的目錄,記錄筆者認為最通俗、最有幫助的資料,并盡量總結幾句話指明本質,以便于日后搜索起來更加容易。
標題的結構如下:“類型”:“知識點”——“簡短的解釋”
部分內容由于保密協議無法上傳。
點擊此處進入學習日記的總目錄
2024.03.01
- 七、UCOSIII:文件結構與解釋
- 八、UCOSIII:函數指針
- 函數指針的形式
- 1. 形式1:返回類型(*函數名)(參數表)
- 2. 形式2:typedef 返回類型(*新類型)(參數表)
七、UCOSIII:文件結構與解釋
由于后面會用到各種宏與函數,為了給它們分類,我提前把UCOSIII系統各文件的功能整理出來,后面遇到各種文件就知道什么功能了。
父文件目錄 | 子文件目錄 | 孫文件目錄 | 文件名 | 功能 |
---|---|---|---|---|
User | uCOS-III | Source | os.h | 包含主要的μC/ OS-III頭文件,該文件聲明常量,宏,μC/ OS-III全局變量(僅供μC/ OS-III使用),函數原型等。 |
- | - | Source | os_type.h | 包含μC/ OS-III數據類型的聲明,端口設計人員可以更改這些聲明以更好地利用CPU體系結構。 與OS相關的數據類型則在os_type.h定義。 在這種情況下,通常會將文件復制到端口目錄,然后進行修改。 |
- | - | Source | os_var.c | 包含μC/ OS-III全局變量。 這些變量供μC/ OS-III管理,不應由應用程序代碼訪問。 |
- | - | Source | os_task.c | 包含用于使用OSTaskCreate(),OSTaskDel(),OSTaskChangePrio()等管理任務的代碼。 與任務的操作密切相關,包括任務的建立、刪除、掛起、恢復等等。 |
- | - | Source | os_time.c | uC/OS-II中最小時鐘單位是timetick(時鐘節拍),其中包含時間延遲、時鐘設置及時鐘恢復等與時鐘相關的函數。 |
- | - | Source | os_cfg.h | 定義優先級數量 |
- | - | Source | os_cfg_app.c | 根據os_cfg_app.h中的值聲明變量和數組。 |
- | - | Source | os_core.c | 操作系統的處理核心。包括操作系統初始化、操作系統運行、中斷進出的前導、時鐘節拍、任務調度、事件處理等多部分。能夠維持系統基本工作的部分都在這里 |
- | - | Source | os_dbg.c | 包含由內核感知的調試器或μC/ Probe使用的常量變量的聲明。 |
- | - | Source | os_flag.c | 包含事件標志管理的代碼。 |
- | - | Source | os_int.c | 包含用于中斷處理程序任務的代碼,當OS_CFG_ISR_POST_DEFERRED_EN(請參見os_cfg.h)設置為1時使用。 |
- | - | Source | os_mem.c | 包含μC/ OS-III固定大小內存管理器的代碼。 |
- | - | Source | os_msg.c | 包含處理消息的代碼。μC/OS-III提供消息隊列和任務特定的消息隊列。 |
- | - | Source | os_mutex.c | 包含用于管理互斥信號量的代碼。 |
- | - | Source | os_pend_multi.c | 包含允許代碼插入多個信號量或消息隊列的代碼。 |
- | - | Source | os_prio.c | 包含用于管理位圖表的代碼,用于跟蹤準備就緒的任務。如果使用的CPU提供了位設置,清除和測試指令以及計數前導零指令,則可以用等效于匯編語言的該文件代替該匯編語言以提高性能。 |
- | - | Source | os_q.c | 管理信號量。 |
- | - | Source | os_sem.c | 包含用于管理用于資源管理和/或同步的信號量的代碼。 |
- | - | Source | os_stat.c | 包含用于統計任務的代碼,該代碼用于計算全局CPU使用率和每個任務的CPU使用率。 |
- | - | Source | os_tick.c | 包含用于管理已延遲自身的任務或因超時而在內核對象上暫掛的任務的代碼。 |
- | - | Source | os_tmr.c | 包含用于管理軟件計時器的代碼。 |
User | uCOS-III | Ports | os_cpu.h | 進行數據類型定義,處理器相關代碼和幾個函數原型。 |
- | - | Ports | os_cpu_c.c | 定義一些用戶 hook 函數。 |
- | - | Ports | os_cpu_a.asm | 移植需要用匯編代碼完成的函數,主要就是任務切換函數。 |
- | - | Ports | os_dbg.c | 內核調試相關數據和函數,可以不改 |
User | uC-CPU | cpu.h | 凡是與CPU類型相關的數據類型則統一在cpu.h中定義,包含用于使μC/OS-III和其他模塊獨立于CPU和編譯器字長的類型定義。 具體來說,將找到CPU_INT16U,CPU_INT32U,CPU_FP32和許多其他數據類型的聲明。 該文件還指定CPU是大端機還是小端機,定義μC/ OS-III使用的CPU_STK數據類型,定義宏CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT(),并包含特定于CPU體系結構的函數的函數原型等。 | |
- | uC-CPU | cpu_core.c | 包含所有CPU體系結構通用的C代碼。 具體來說,該文件包含用于測量CPU_CRITICAL_ENTER()和CPU_CRITICAL_EXIT()宏的中斷禁用時間的函數,一個在CPU不提供指令的情況下模擬計數前導零指令的函數以及一些其他函數。 | |
- | uC-CPU | cpu_core.h | 包含cpu_core.c中提供的功能的功能原型以及模塊用來測量中斷禁用時間的變量的分配。 | |
- | uC-CPU | cpu_def.h | 包含μC/ CPU模塊使用的其他#define常數。 |
八、UCOSIII:函數指針
在os.h里,對于任務函數的數據類型是這么定義的:
typedef void (*OS_TASK_PTR)(void *p_arg);
這就用到了一種之前不怎么常用的用法:函數指針
函數指針的形式
1. 形式1:返回類型(*函數名)(參數表)
#include <iostream>using namespace std;//定義一個函數指針pFUN,它指向一個返回類型為char,有一個整型的參數的函數
char (*pFun)(int);
//定義一個返回類型為char,參數為int的函數
//從指針層面上理解該函數,即函數的函數名實際上是一個指針,
//該指針指向函數在內存中的首地址
char glFun(int a)
{cout << a;
}int main()
{
//將函數glFun的地址賦值給變量pFunpFun = glFun;
//*pFun”顯然是取pFun所指向地址的內容,當然也就是取出了函數glFun()的內容,然后給定參數為2。(*pFun)(2);return 0;
}
通過上面的一個小例子,我們知道了函數指針的用法,
而typedef可以讓函數指針更直觀方便
2. 形式2:typedef 返回類型(*新類型)(參數表)
typedef char (*PTRFUN)(int);
//定義了一種PTRFUN的類型,并定義這種類型為指向某種函數的指針,這種函數以一個int為參數并返回char類型。后面就可以像使用int,char一樣使用PTRFUN了。PTRFUN pFun;
//使用這個新類型定義了變量pFun,此時就可以像使用形式1一樣使用這個變量了。char glFun(int a){ return;} void main()
{ pFun = glFun; //將函數指針指向定義的函數(*pFun)(2); //類似于變量指針的用法(使用*),只不過需要輸入實參
}
參考資料:
typedef void (*Fun) (void) 的理解——函數指針——typedef函數指針