UcOs-III 原始碼閱讀: os_cfg_app.c

炽杨發表於2024-11-02

/*


  •                                          uC/OS-III
    
  •                                    The Real-Time Kernel
    
  •                Copyright 2009-2022 Silicon Laboratories Inc. www.silabs.com
    
  •                             SPDX-License-Identifier: APACHE-2.0
    
  •           This software is subject to an open source license and is distributed by
    
  •            Silicon Laboratories Inc. pursuant to the terms of the Apache License,
    
  •                Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
    

*/

/*


  •                           作業系統配置(應用程式特定)
    
  • 檔案 : os_cfg_app.c
  • 版本 : V3.08.02

  • 注意事項 : 不要修改此檔案!

*/

define MICRIUM_SOURCE

include <os_cfg_app.h>

include "os.h"

ifdef VSC_INCLUDE_SOURCE_FILE_NAMES

// 如果定義了 VSC_INCLUDE_SOURCE_FILE_NAMES,則包含原始檔名
const CPU_CHAR *os_cfg_app__c = "$Id: $";

endif

if (OS_CFG_TASK_IDLE_EN > 0u)

// 如果啟用了空閒任務 (OS_CFG_TASK_IDLE_EN > 0),則定義空閒任務堆疊限制

define OS_CFG_IDLE_TASK_STK_LIMIT ((OS_CFG_IDLE_TASK_STK_SIZE * OS_CFG_TASK_STK_LIMIT_PCT_EMPTY) / 100u)

endif

if (OS_CFG_STAT_TASK_EN > 0u)

// 如果啟用了統計任務 (OS_CFG_STAT_TASK_EN > 0),則定義統計任務堆疊限制

define OS_CFG_STAT_TASK_STK_LIMIT ((OS_CFG_STAT_TASK_STK_SIZE * OS_CFG_TASK_STK_LIMIT_PCT_EMPTY) / 100u)

endif

if (OS_CFG_TMR_EN > 0u)

// 如果啟用了定時器任務 (OS_CFG_TMR_EN > 0),則定義定時器任務堆疊限制

define OS_CFG_TMR_TASK_STK_LIMIT ((OS_CFG_TMR_TASK_STK_SIZE * OS_CFG_TASK_STK_LIMIT_PCT_EMPTY) / 100u)

endif

/*


  •                                                資料儲存
    

*/

if (OS_CFG_TASK_IDLE_EN > 0u)

// 如果啟用了空閒任務 (OS_CFG_TASK_IDLE_EN > 0),則定義空閒任務堆疊
CPU_STK OSCfg_IdleTaskStk [OS_CFG_IDLE_TASK_STK_SIZE];

endif

if (OS_CFG_ISR_STK_SIZE > 0u)

// 如果定義了中斷服務例程堆疊大小 (OS_CFG_ISR_STK_SIZE > 0),則定義中斷服務例程堆疊
CPU_STK OSCfg_ISRStk [OS_CFG_ISR_STK_SIZE];

endif

if (OS_MSG_EN > 0u)

// 如果啟用了訊息功能 (OS_MSG_EN > 0),則定義訊息池
OS_MSG OSCfg_MsgPool [OS_CFG_MSG_POOL_SIZE];

endif

if (OS_CFG_STAT_TASK_EN > 0u)

// 如果啟用了統計任務 (OS_CFG_STAT_TASK_EN > 0),則定義統計任務堆疊
CPU_STK OSCfg_StatTaskStk [OS_CFG_STAT_TASK_STK_SIZE];

endif

if (OS_CFG_TMR_EN > 0u)

// 如果啟用了定時器功能 (OS_CFG_TMR_EN > 0),則定義定時器任務堆疊
CPU_STK OSCfg_TmrTaskStk [OS_CFG_TMR_TASK_STK_SIZE];

endif

/*


  •                                                  常量
    

*/

if (OS_CFG_TASK_IDLE_EN > 0u)

// 如果啟用了空閒任務 (OS_CFG_TASK_IDLE_EN > 0),則定義空閒任務堆疊基地址指標、堆疊限制、堆疊大小和堆疊在RAM中的大小
CPU_STK * const OSCfg_IdleTaskStkBasePtr = &OSCfg_IdleTaskStk[0];
CPU_STK_SIZE const OSCfg_IdleTaskStkLimit = OS_CFG_IDLE_TASK_STK_LIMIT;
CPU_STK_SIZE const OSCfg_IdleTaskStkSize = OS_CFG_IDLE_TASK_STK_SIZE;
CPU_INT32U const OSCfg_IdleTaskStkSizeRAM = sizeof(OSCfg_IdleTaskStk);

else

// 如果未啟用空閒任務,則將相關變數設定為0或空指標
CPU_STK * const OSCfg_IdleTaskStkBasePtr = (CPU_STK *)0;
CPU_STK_SIZE const OSCfg_IdleTaskStkLimit = 0u;
CPU_STK_SIZE const OSCfg_IdleTaskStkSize = 0u;
CPU_INT32U const OSCfg_IdleTaskStkSizeRAM = 0u;

endif

if (OS_CFG_ISR_STK_SIZE > 0u)

// 如果定義了中斷服務例程堆疊大小 (OS_CFG_ISR_STK_SIZE > 0),則定義中斷服務例程堆疊基地址指標、堆疊大小和堆疊在RAM中的大小
CPU_STK * const OSCfg_ISRStkBasePtr = &OSCfg_ISRStk[0];
CPU_STK_SIZE const OSCfg_ISRStkSize = OS_CFG_ISR_STK_SIZE;
CPU_INT32U const OSCfg_ISRStkSizeRAM = sizeof(OSCfg_ISRStk);

else

// 如果未定義中斷服務例程堆疊大小,則將相關變數設定為0或空指標
CPU_STK * const OSCfg_ISRStkBasePtr = (CPU_STK *)0;
CPU_STK_SIZE const OSCfg_ISRStkSize = 0u;
CPU_INT32U const OSCfg_ISRStkSizeRAM = 0u;

endif

if (OS_MSG_EN > 0u)

// 如果啟用了訊息功能 (OS_MSG_EN > 0),則定義訊息池大小、訊息池在RAM中的大小和訊息池基地址指標
OS_MSG_SIZE const OSCfg_MsgPoolSize = OS_CFG_MSG_POOL_SIZE;
CPU_INT32U const OSCfg_MsgPoolSizeRAM = sizeof(OSCfg_MsgPool);
OS_MSG * const OSCfg_MsgPoolBasePtr = &OSCfg_MsgPool[0];

else

// 如果未啟用訊息功能,則將相關變數設定為0或空指標
OS_MSG_SIZE const OSCfg_MsgPoolSize = 0u;
CPU_INT32U const OSCfg_MsgPoolSizeRAM = 0u;
OS_MSG * const OSCfg_MsgPoolBasePtr = (OS_MSG *)0;

endif

if (OS_CFG_STAT_TASK_EN > 0u)

// 如果啟用了統計任務 (OS_CFG_STAT_TASK_EN > 0),則定義統計任務優先順序、執行頻率、堆疊基地址指標、堆疊限制、堆疊大小和堆疊在RAM中的大小
OS_PRIO const OSCfg_StatTaskPrio = OS_CFG_STAT_TASK_PRIO;
OS_RATE_HZ const OSCfg_StatTaskRate_Hz = OS_CFG_STAT_TASK_RATE_HZ;
CPU_STK * const OSCfg_StatTaskStkBasePtr = &OSCfg_StatTaskStk[0];
CPU_STK_SIZE const OSCfg_StatTaskStkLimit = OS_CFG_STAT_TASK_STK_LIMIT;
CPU_STK_SIZE const OSCfg_StatTaskStkSize = OS_CFG_STAT_TASK_STK_SIZE;
CPU_INT32U const OSCfg_StatTaskStkSizeRAM = sizeof(OSCfg_StatTaskStk);

else

// 如果未啟用統計任務,則將相關變數設定為0或空指標
OS_PRIO const OSCfg_StatTaskPrio = 0u;
OS_RATE_HZ const OSCfg_StatTaskRate_Hz = 0u;
CPU_STK * const OSCfg_StatTaskStkBasePtr = (CPU_STK *)0;
CPU_STK_SIZE const OSCfg_StatTaskStkLimit = 0u;
CPU_STK_SIZE const OSCfg_StatTaskStkSize = 0u;
CPU_INT32U const OSCfg_StatTaskStkSizeRAM = 0u;

endif

// 定義最小堆疊大小
CPU_STK_SIZE const OSCfg_StkSizeMin = OS_CFG_STK_SIZE_MIN;

if (OS_CFG_TICK_EN > 0u)

// 如果啟用了系統滴答 (OS_CFG_TICK_EN > 0),則定義系統滴答頻率
OS_RATE_HZ const OSCfg_TickRate_Hz = OS_CFG_TICK_RATE_HZ;

else

// 如果未啟用系統滴答,則將系統滴答頻率設定為0
OS_RATE_HZ const OSCfg_TickRate_Hz = 0u;

endif

if (OS_CFG_TMR_EN > 0u)

// 如果啟用了定時器功能 (OS_CFG_TMR_EN > 0),則定義定時器任務優先順序、執行頻率、堆疊基地址指標、堆疊限制、堆疊大小和堆疊在RAM中的大小
OS_PRIO const OSCfg_TmrTaskPrio = OS_CFG_TMR_TASK_PRIO;
OS_RATE_HZ const OSCfg_TmrTaskRate_Hz = OS_CFG_TMR_TASK_RATE_HZ;
CPU_STK * const OSCfg_TmrTaskStkBasePtr = &OSCfg_TmrTaskStk[0];
CPU_STK_SIZE const OSCfg_TmrTaskStkLimit = OS_CFG_TMR_TASK_STK_LIMIT;
CPU_STK_SIZE const OSCfg_TmrTaskStkSize = OS_CFG_TMR_TASK_STK_SIZE;
CPU_INT32U const OSCfg_TmrTaskStkSizeRAM = sizeof(OSCfg_TmrTaskStk);

else

// 如果未啟用定時器功能,則將相關變數設定為0或空指標
OS_PRIO const OSCfg_TmrTaskPrio = 0u;
OS_RATE_HZ const OSCfg_TmrTaskRate_Hz = 0u;
CPU_STK * const OSCfg_TmrTaskStkBasePtr = (CPU_STK *)0;
CPU_STK_SIZE const OSCfg_TmrTaskStkLimit = 0u;
CPU_STK_SIZE const OSCfg_TmrTaskStkSize = 0u;
CPU_INT32U const OSCfg_TmrTaskStkSizeRAM = 0u;

endif

/*


  •                                     應用程式配置的總大小
    

*/

CPU_INT32U const OSCfg_DataSizeRAM = 0u

if (OS_CFG_TASK_IDLE_EN > 0u)

// 如果啟用了空閒任務 (OS_CFG_TASK_IDLE_EN > 0),則加上空閒任務堆疊的大小
+ sizeof(OSCfg_IdleTaskStk)

endif

if (OS_MSG_EN > 0u)

// 如果啟用了訊息功能 (OS_MSG_EN > 0),則加上訊息池的大小
+ sizeof(OSCfg_MsgPool)

endif

if (OS_CFG_STAT_TASK_EN > 0u)

// 如果啟用了統計任務 (OS_CFG_STAT_TASK_EN > 0),則加上統計任務堆疊的大小
+ sizeof(OSCfg_StatTaskStk)

endif

if (OS_CFG_TMR_EN > 0u)

// 如果啟用了定時器功能 (OS_CFG_TMR_EN > 0),則加上定時器任務堆疊的大小
+ sizeof(OSCfg_TmrTaskStk)

endif

if (OS_CFG_ISR_STK_SIZE > 0u)

// 如果定義了中斷服務例程堆疊大小 (OS_CFG_ISR_STK_SIZE > 0),則加上中斷服務例程堆疊的大小
+ sizeof(OSCfg_ISRStk)

endif

// 最後加上一個常量0,確保表示式的完整性
+ 0u;

/*


  •                                         作業系統配置初始化
    
  • 描述: 此函式用於確保應用程式中未使用的除錯變數不會被最佳化掉。此函式可能不是所有編譯器都需要。在這種情況下,您應該刪除此函式中的程式碼,但仍保留函式本身的宣告。
  • 引數: 無
  • 返回: 無
  • 注意: (1) 此程式碼不執行任何操作,它只是防止編譯器最佳化掉在此檔案中宣告的 'const' 變數。
  •   (2) 如果您的編譯器不會最佳化掉上述的 'const' 變數,您可以選擇在函式內部使用 #if 0/#endif 將程式碼編譯出去。
    

*/

void OSCfg_Init (void)
{
// 確保 OSCfg_DataSizeRAM 不被最佳化掉
(void)OSCfg_DataSizeRAM;

if (OS_CFG_TASK_IDLE_EN > 0u)

// 如果啟用了空閒任務 (OS_CFG_TASK_IDLE_EN > 0),確保以下變數不被最佳化掉
(void)OSCfg_IdleTaskStkBasePtr;
(void)OSCfg_IdleTaskStkLimit;
(void)OSCfg_IdleTaskStkSize;
(void)OSCfg_IdleTaskStkSizeRAM;

endif

// 確保中斷服務例程堆疊相關的變數不被最佳化掉
(void)OSCfg_ISRStkBasePtr;
(void)OSCfg_ISRStkSize;
(void)OSCfg_ISRStkSizeRAM;

if (OS_MSG_EN > 0u)

// 如果啟用了訊息功能 (OS_MSG_EN > 0),確保以下變數不被最佳化掉
(void)OSCfg_MsgPoolSize;
(void)OSCfg_MsgPoolSizeRAM;
(void)OSCfg_MsgPoolBasePtr;

endif

if (OS_CFG_STAT_TASK_EN > 0u)

// 如果啟用了統計任務 (OS_CFG_STAT_TASK_EN > 0),確保以下變數不被最佳化掉
(void)OSCfg_StatTaskPrio;
(void)OSCfg_StatTaskRate_Hz;
(void)OSCfg_StatTaskStkBasePtr;
(void)OSCfg_StatTaskStkLimit;
(void)OSCfg_StatTaskStkSize;
(void)OSCfg_StatTaskStkSizeRAM;

endif

// 確保最小堆疊大小的變數不被最佳化掉
(void)OSCfg_StkSizeMin;

if (OS_CFG_TICK_EN > 0u)

// 如果啟用了系統滴答 (OS_CFG_TICK_EN > 0),確保以下變數不被最佳化掉
(void)OSCfg_TickRate_Hz;

endif

if (OS_CFG_TMR_EN > 0u)

// 如果啟用了定時器功能 (OS_CFG_TMR_EN > 0),確保以下變數不被最佳化掉
(void)OSCfg_TmrTaskPrio;
(void)OSCfg_TmrTaskRate_Hz;
(void)OSCfg_TmrTaskStkBasePtr;
(void)OSCfg_TmrTaskStkLimit;
(void)OSCfg_TmrTaskStkSize;
(void)OSCfg_TmrTaskStkSizeRAM;

endif

}

相關文章