📄 os_cpu_c.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
*
* 80x86/80x88 Specific code
* LARGE MEMORY MODEL
*
* Borland C/C++ V4.51
*
* File : OS_CPU_C.C
* By : Jean J. Labrosse
*********************************************************************************************************
*/
#define OS_CPU_GLOBALS
//#include "includes.h"
#include "UCOS_II.H"
/*
*********************************************************************************************************
* OS INITIALIZATION HOOK
* (BEGINNING)
*
* Description: This function is called by OSInit() at the beginning of OSInit().进入OSInit()函数后,OSInitHookBegin()就会
立即被调用。添加这个函数的原因在于,想把与OS有关的初始化代码也放在OSInit()函数中。这个函数使得用户可以将自己特定的代码也
放在OSInit()函数中。这样代码会简洁明了。
*
* Arguments : none
*
* Note(s) : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookBegin (void)
{
}
#endif
/*
*********************************************************************************************************
* OS INITIALIZATION HOOK
* (END)
*
* Description: This function is called by OSInit() at the end of OSInit().OSInitHookEnd()与OSInitHookBegin()函数相似,只是
它在OSInit()函数返回之前被调用。添加这个函数的原因与添加OSInitHookBegin()的原因是相同的。可以在第15章看到OSInitHookEnd()的
例子。
*
* Arguments : none
*
* Note(s) : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSInitHookEnd (void)
{
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* TASK CREATION HOOK
*
* Description: This function is called when a task is created.每当添加任务时,OS_TCBInit()函数都会调用OSTaskCreateHook()函
数。该函数允许扩展UCOS的功能。当UCOS设置完任务控制块(OS_TCB)初始化的绝大部分工作后,但在任务控制块被链接到相应的任务链中之
前, 以及在该任务就绪运行之前,UCOS会调用OSTaskCreateHook()。该函数被调用时中断是开着的。
当OSTaskCreateHook()被调用时,它会收到指向刚刚建立任务的任务控制块的指针。这样,OSTaskCreateHook()就可访问任务控制块结构所
有的成员了。当用OSTaskCreate()建立任务时,OSTaskCreateHook()的功能是有限的;但当使用OSTaskCreateExt()建立任务时,会得到
OS_TCB中的扩展指针(OSTCBExtPtr)。该指针可用来访问任务的附加数据,如浮点寄存器,MMU寄存器,任务计数器以及调试信息。可以检查
OS_TCBInit(),看都做了哪些工作。
*
* Arguments : ptcb is a pointer to the task control block of the task being created.
*
* Note(s) : 1) Interrupts are disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 /*只有当OS_CFG.H中的OS_CPU_HOOKS_EN置一时,才会生成OS_CPU_C.C文件中的相应OS???Hook()
函数。这些在本节和以下各节描述的HOOK函数的代码中,OS???Hook()函数是始终需要的,'#define constant OS_CPU_HOOKS_EN'并不意味着
OS???Hook()是否被调用。OS_CPU_HOOKS_EN只是表明OS???Hook()函数是在OS_CPU_C.C文件中(OS_CPU_HOOKS_EN==1),还是在其他文件中
(OS_CPU_HOOKS_EN==0)。这个特点使得用户可以在自己的移植实例中,在OS_CPU_C.C文件之外定义自己的HOOK函数。显然,使用该移植范例
其他源文件的用户,应将OS_CPU_HOOKS_EN设置为0,以防止链接时出现重复定义错误。如果不需要使用HOOK函数这种机制来扩展UCOS的功能
,可以将这些HOOK函数写成空函数。需要再次强调的是,UCOS需要这些HOOK函数(这些函数必须在某处定义)。*/
void OSTaskCreateHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
#endif
/*
*********************************************************************************************************
* TASK DELETION HOOK
在任务从就绪态列表或等待列表(若任务在等待某事件发生)中被删除后,OSTaskDel()就会调用OSTaskDelHook()。该函数在将任务从UCOS
的内部有效任务链表中删除之前被调用。当调用OSTaskDelHook()时,它会收到一个指向正在被删除任务的任务控制块的指针,这样它就可
以访问该任务控制块所有的结构成员了。OSTaskDelHook()可以用来检验TCB扩展部分是否已建立了(一个非空的指针),并进行一些清0等操
作。OSTaskDelHook()被调用时,中断是关掉的,所以该函数的代码太长会影响中断响应时间。
*
* Description: This function is called when a task is deleted.
*
* Arguments : ptcb is a pointer to the task control block of the task being deleted.
*
* Note(s) : 1) Interrupts are disabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0
void OSTaskDelHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent compiler warning */
}
#endif
/*
*********************************************************************************************************
* IDLE TASK HOOK
*
* Description: This function is called by the idle task. This hook has been added to allow you to do
* such things as STOP the CPU to conserve power.很多处理器都允许执行相应的指令,将CPU置于低功耗模式。而当接受
到中断信号时,CPU就会退出低功耗模式。OSTaskIdle()函数可调用OSTaskIdleHook()函数,实现CPU的这种低功耗模式。详见邵贝贝UCOSII
*P300
* Arguments : none
*
* Note(s) : 1) Interrupts are enabled during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
void OSTaskIdleHook (void)
{
}
#endif
/*
*********************************************************************************************************
* STATISTIC TASK HOOK
*
* Description: This function is called every second by uC/OS-II's statistics task. This allows your
* application to add functionality to the statistics task.OSTaskStatHook函数每秒都会被统计任务OSTaskStat()调用
一次。可以用OSTaskStatHook()扩展统计任务的功能。例如,可以跟踪并显示每个任务的执行时间,每个任务所用的CPU份额以及每个任务
执行的频率等等。
*
* Arguments : none
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0
void OSTaskStatHook (void)
{
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* INITIALIZE A TASK'S STACK
UCOS的移植范例要求用户编写10个简单的C函数。唯一必要的是OSTaskStkInit(),其他9个函数必须声明,但并不一定要包含任何代码。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -