📄 ucosii_util.c
字号:
/*
* 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 + -