⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucosii_util.c

📁 ucos内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * COPYRIGHT (c) Notifier 1993-2004, All Rights Reserved
 *
 * 描述:        对uC/OS II的一些辅助功能
 *
 * 版本历史:
 *
 * 版本     作者        日期        修改内容
 * 1.0      王璀        2005-12-21  创建
 * 1.1      王璀        2006-01-18  将uC/OS II的hook函数安装部分移到本文件
 * 1.2      王璀        2006-01-19  将OsPrintf函数移到sys_log模块
 * 1.21     王璀        2006-02-14  添加了OsTaskInfo命令
 *                                  添加了UcosiiUtilInit()接口
 * 1.22     王璀        2006-02-23  添加了OsTaskGetHighestAvailablePrio()和
 *                                  OsTaskGetLowestAvailablePrio()接口
 * 1.23     王璀        2006-03-09  添加了OsView命令,需要使用这个命令来打开/关闭
 *                                  OS_VIEW模块,并且将Console I/O重定向到OS_VIEW
 *                                  修改了OsTaskInfo命令
 * 1.24     任学锋      2006-03-09  删除了OsTaskGetHighestAvailablePrio,
 *                                  OsTaskGetLowestAvailablePrio中的ENTER_CRITICAL()
 *                                  与EXIT_CRITICAL()
 *          王璀        2006-03-10  修改了OsViewPutChHook()  
 * 1.25     王璀        2006-06-27  适应Shell模块的修改
 * 1.26     王璀        2006-07-03  小修改
*/
//==============================================================================
// 包含的头文件
//==============================================================================
#include "assert.h"
#include "stdarg.h"
#include "stdio.h"

#include "ucos_ii.h"
#include "ucosii_util.h"
#if OS_VIEW_MODULE > 0
#include "os_view.h"
#include <string.h>
#include "system\conio.h"
#endif

#include "sys_types.h"

#include "library\lib_shell.h"
#include "library\lib_log.h"
#include "library\lib_str_util.h"

//==============================================================================
// 本地变量定义
//==============================================================================
EnumStrPair g_osTaskStateStrTbl[] =
{
    {OS_STAT_RDY,     "RDY"},
    {OS_STAT_SEM,     "SEM"},
    {OS_STAT_MBOX,    "MBOX"},
    {OS_STAT_Q,       "Q"},
    {OS_STAT_SUSPEND, "SUSP"},
    {OS_STAT_MUTEX,   "MUTX"},
    {OS_STAT_FLAG,    "FLAG"},

    {(INT32U)NULL,    (CHAR *)NULL},
};

//==============================================================================
// 全局变量定义
//==============================================================================
#if OS_VERSION > 203
void (*g_pOsInitHookBeginRoutine)(void) = NULL;
#endif
#if OS_VERSION > 203
void (*g_pOsInitHookEndRoutine)(void) = NULL;
#endif
void (*g_pOsTaskCreateHookRoutine)(OS_TCB *ptcb) = NULL;
#if OS_TASK_DEL_EN > 0
void (*g_pOsTaskDelHookRoutine)(OS_TCB *ptcb) = NULL;
#endif
#if OS_TASK_SW_HOOK_EN > 0
void (*g_pOsTaskSwHookRoutine)(void) = NULL;
#endif
#if OS_TASK_STAT_EN > 0
void (*g_pOsTaskStatHookRoutine)(void) = NULL;
#endif
#if OS_VERSION >= 204
void (*g_pOsTcbInitHookRoutine)(OS_TCB *ptcb) = NULL;
#endif
#if OS_TIME_TICK_HOOK_EN > 0
void (*g_pOsTimeTickHookRoutine)(void) = NULL;
#endif
#if OS_VERSION >= 251
void (*g_pOsTaskIdleHookRoutine)(void) = NULL;
#endif

//==============================================================================
// 函数定义
//==============================================================================
#if OS_VERSION > 203
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSInitHookBeginInstall
    (
    void (*a_pfn)(void)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsInitHookBeginRoutine = a_pfn;
}
#endif

#if OS_VERSION > 203
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSInitHookEndInstall
    (
    void (*a_pfn)(void)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsInitHookEndRoutine = a_pfn;
}
#endif

//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTaskCreateHookInstall
    (
    void (*a_pfn)(OS_TCB *ptcb)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTaskCreateHookRoutine = a_pfn;
}

#if OS_TASK_DEL_EN > 0
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTaskDelHookInstall
    (
    void (*a_pfn)(OS_TCB *ptcb)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTaskDelHookRoutine = a_pfn;
}
#endif

#if OS_TASK_SW_HOOK_EN > 0
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTaskSwHookInstall
    (
    void (*a_pfn)(void)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTaskSwHookRoutine = a_pfn;
}
#endif

#if OS_TASK_STAT_EN > 0
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTaskStatHookInstall
    (
    void (*a_pfn)(void)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTaskStatHookRoutine = a_pfn;
}
#endif

#if OS_VERSION >= 204
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTCBInitHookInstall
    (
    void (*a_pfn)(OS_TCB *ptcb)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTcbInitHookRoutine = a_pfn;
}
#endif

#if OS_TIME_TICK_HOOK_EN > 0
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTimeTickHookInstall
    (
    void (*a_pfn)(void)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTimeTickHookRoutine = a_pfn;
}
#endif

#if OS_VERSION >= 251
//------------------------------------------------------------------------------
// 函数描述:OS hook函数安装
void OSTaskIdleHookInstall
    (
    void (*a_pfn)(void)//指向函数的指针
    )
{
    assert(a_pfn != NULL);
    
    g_pOsTaskIdleHookRoutine = a_pfn;
}
#endif

#if UCOSII_UTIL_OS_GET_TIME_IN_MS > 0
//------------------------------------------------------------------------------
// 函数描述:获取OS的当前时间,单位为毫秒。从OS节拍发生器启动时开始计时。
// 注意:实际的分辨率取决于系统节拍的周期。如节拍为5毫秒,则分辨率也为5毫秒。
INT32U//当前时间
OsTimeGetInMs(void)
{
    return ((OSTimeGet() * 1000) / OS_TICKS_PER_SEC);
}
#endif

#if UCOSII_UTIL_OS_GET_HIGHEST_AVAILABLE_PRIO > 0
//------------------------------------------------------------------------------
// 函数描述:获取OS任务池中可用的最高优先级
INT32U//可用的最高优先级
      //-1 - 无可用优先级
OsTaskGetHighestAvailablePrio(void)
{
    INT8U   prio;
    OS_TCB *ptcb;


    for (prio = 0; prio <= OS_LOWEST_PRIO; prio++)
    {
        ptcb = OSTCBPrioTbl[prio];
        if ( ptcb == (OS_TCB *)0
          || ptcb == (OS_TCB *)1 )             // Does task exist? (Not a Mutex reserved task)
        {//任务不存在
            return prio;
        }
    }
    
    return -1;
}
#endif

#if UCOSII_UTIL_OS_GET_LOWEST_AVAILABLE_PRIO > 0
//------------------------------------------------------------------------------
// 函数描述:获取OS任务池中可用的最低优先级
INT32U//可用的最低优先级
      //-1 - 无可用优先级
OsTaskGetLowestAvailablePrio(void)
{
    INT8U   prio;
    OS_TCB *ptcb;


    //这里有一个编码花招:不推荐
    //prio是无符号数,递减到0后,会继续得到最大有效数值,从而退出循环
    for (prio = OS_LOWEST_PRIO; prio <= OS_LOWEST_PRIO; prio--)
    {
        ptcb = OSTCBPrioTbl[prio];
        if ( ptcb == (OS_TCB *)0
          || ptcb == (OS_TCB *)1 )             // Does task exist? (Not a Mutex reserved task)
        {//任务不存在
            return prio;
        }
    }
    
    return -1;
}
#endif

#if UCOSII_UTIL_OS_TASK_INFO_EN > 0
//------------------------------------------------------------------------------
// 函数描述:显示操作系统的任务信息

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -