1. 程式人生 > >uC/OS-II原始碼解析(ucos_ii.c)

uC/OS-II原始碼解析(ucos_ii.c)

/*
** ver: 2.52
** file: uCOS_II.C
** brief: C檔案集合
*/

#define  OS_GLOBALS                             /* 宣告全域性變數 防止重複定義             */
#include "includes.h"                           /* 包含"includes.h"標頭檔案                */


#define  OS_MASTER_FILE        /* 防止以下檔案重複定義巨集OS_GLOBALS和重複包含"includes.h" */
#include "\software
\ucos-ii\source\os_core.c" /* 包含 "os_core.c" 檔案 */ #include "\software\ucos-ii\source\os_flag.c" /* 包含 "os_flag.c" 檔案 */ #include "\software\ucos-ii\source\os_mbox.c" /* 包含 "os_mbox.c" 檔案 */ #include "\software\ucos-ii\source\os_mem.c" /* 包含 "os_mem.c" 檔案 */ #
include "\software\ucos-ii\source\os_mutex.c" /* 包含 "os_mutex.c" 檔案 */ #include "\software\ucos-ii\source\os_q.c" /* 包含 "os_q.c" 檔案 */ #include "\software\ucos-ii\source\os_sem.c" /* 包含 "os_sem.c" 檔案 */ #include "\software\ucos-ii\source\os_task.c" /* 包含 "os_task.c" 檔案 */ #
include "\software\ucos-ii\source\os_time.c" /* 包含 "os_time.c" 檔案 */

1. OS_GLOBALS栗子

ucos_ii.h檔案有如下定義:

. . .
#ifdef   OS_GLOBALS               
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif
. . .
OS_EXT  INT32U            OSCtxSwCtr;
. . .

includes.h檔案中有如下定義:

#include    "ucos_ii.h" 

os_core.c檔案有如下定義:

. . .
#define  OS_GLOBALS  
#include "includes.h"     
. . . 

因為os_core.c中定義了OS_GLOBALS這個巨集,所以OS_EXT巨集為空,即os_core.c檔案編譯結果如下

INT32U            OSCtxSwCtr;

結果是在檔案os_core.c中定義變數OSCtxSwCtr,其他.c檔案不會定義巨集OS_GLOBALS,所以OS_EXT的值為extern,即其他.c檔案編譯時結果如下:

extern  INT32U            OSCtxSwCtr;

結果是在其他.c中宣告變數,因為變數已經定義過了呀呀呀!

2. uCOS_II.C檔案

說明:如果你的工程中添加了uCOS_II.C檔案,則不要新增該檔案下包含的那些C檔案否則會出現重複定義錯誤,如果添加了各C檔案則不要新增uCOS_II.C檔案,這個故事告訴我們老婆與小三不能兼得【羞澀】