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

📄 os_cpu_c.c

📁 Ucos ii原理及应用,非常实用的资料,发给大家参考!
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                         The Real-Time Kernel
*
*                        (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                          All Rights Reserved
*
*                                          80x86 Specific code
*                                 LARGE MEMORY MODEL WITH FLOATING-POINT
*                                          Borland C/C++ V4.51
*
*
* File         : OS_CPU_C.C
* By           : Jean J. Labrosse
*********************************************************************************************************
*/

#define  OS_CPU_GLOBALS
#include "includes.h"

/*$PAGE*/
/*
*********************************************************************************************************
*                                             LOCAL CONSTANTS
*
* Note(s) : 1) OS_NTASKS_FP  establishes the number of tasks capable of supporting floating-point.  One
*              task is removed for the idle task because it doesn't do floating-point at all.
*           2) OS_FP_STORAGE_SIZE  currently allocates 128 bytes of storage even though the 80x86 FPU 
*              only require 108 bytes to save the FPU context.  I decided to allocate 128 bytes for 
*              future expansion.  
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                                     局部常量
 备注:1、OS_NTASKS_FP:建立能支持浮点的任务数,空闲任务将被去除因为它一
                         点浮点也不会算。
                  2、OS_FP_STORAGE_SIZE:即使80x86浮点运算单元只需要108字节去保存浮点运算
                        内容,但是我分配128字节,作为进一步扩展
*********************************************************************************************************
*/



#define  OS_NTASKS_FP         (OS_MAX_TASKS + OS_N_SYS_TASKS - 1)//OS_N_SYS_TASKS 为系统统计任务
#define  OS_FP_STORAGE_SIZE   128

/*
*********************************************************************************************************
*                                             LOCAL VARIABLES
*********************************************************************************************************
*/
//局部变量

static  OS_MEM  *OSFPPartPtr;          /* Pointer to memory partition holding FPU storage areas        */

                                       /* I used INT32U to ensure that storage is aligned on a ...     */
                                       /* ... 32-bit boundary.                                         */
//指向内存分割区掌握FPU存储空间的指针。我用了32位保证在32位上是对齐模式
//它是一个指针,指向此建立的分区,静态变量,用户程序不能访问
static  INT32U   OSFPPart[OS_NTASKS_FP][OS_FP_STORAGE_SIZE / sizeof(INT32U)];
//OS_NTASKS_FP为支持浮点的任务数,OS_FP_STORAGE_SIZE是浮点存储空间
//OSFPPart[][]是实际的分区,保存了所有任务的FPU寄存器内容。至少要为它
//提供(OS_MAX_TASK+1)*128字节的RAM,因为它是静态,所以用户不能访问
/*$PAGE*/
/*
*********************************************************************************************************
*                                        INITIALIZE FP SUPPORT
*
* Description: This function is called to initialize the memory partition needed to support context
*              switching the Floating-Point registers.  This function MUST be called AFTER calling
*              OSInit().
*
* Arguments  : none
*
* Returns    : none
*
* Note(s)    : 1) Tasks that are to use FP support MUST be created with OSTaskCreateExt().
*              2) For the 80x86 FPU, 108 bytes are required to save the FPU context.  I decided to
*                 allocate 128 bytes for future expansion.  Also, I used INT32U to ensure that storage 
*                 is aligned on a 32-bit boundary.
*              3) I decided to 'change' the 'Options' attribute for the statistic task in case you
*                 use OSTaskStatHook() and need to perform floating-point operations in this function.
*                 This only applies if OS_TaskStat() was created with OSTaskCreateExt().
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                                                      初始化浮点指针支持
 描述:这个函数初始化需要支持任务转换浮点寄存器的内存分割区。
                  必须在调用OSInit()后再调用
参数:无
返回:无
备注:1、支持浮点指针的任务必须由OSTaskCreateExt()建立
                 2、在80x86 FPU中,要108字节去保存FPU内容,我准备用128字节去作为进
                     一步扩展。也用了INT32U去保证在32位边界线上对齐
                 3、在此函数中,你用OSTaskStatHook()又需要浮点运算操作情况下,我想改变
                       它的选项。这只应用于OS_TaskStat() 用 OSTaskCreateExt().建立的情况。
*********************************************************************************************************
*/


void  OSFPInit (void)//浮点处理单元初始化
{
    INT8U    err;
#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN//允许统计任务和浮点建立任务
    OS_TCB  *ptcb;//任务控制块
    void    *pblk;
#endif
    
    
    OSFPPartPtr = OSMemCreate(&OSFPPart[0][0], OS_NTASKS_FP, OS_FP_STORAGE_SIZE, &err);
//OSFPInit()将此分区信息告诉ucosII,OSMemCreate函数把一个内存分区分成多块,
//每块128B,并将这些块链成单向链表,当需要一个内存保存FPU寄存器时,
//只须调用OSMemGet()函数
    
#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN       /* CHANGE 'OPTIONS' for OS_TaskStat()               */
	//允许统计任务和浮点建立任务,改变OS_TaskStat() 的选项

    ptcb            = OSTCBPrioTbl[OS_STAT_PRIO];
//改变OS_TaskStat()属性,使之能进行浮点运算,这样做是为了使用户
//可以通过OS_TaskStatHook()来扩展OS_TaskStat()函数的功能,使之可以做浮点运算。
//在此,OSFPInit()得到统计任务的任务控制块的指针。
    ptcb->OSTCBOpt |= OS_TASK_OPT_SAVE_FP;         /* Allow floating-point support for Statistic task  */
//指明是需要保存和恢复浮点寄存器的,因为系统默认为0
    pblk            = OSMemGet(OSFPPartPtr, &err); /* Get storage for FPU registers                    */
//得到一个缓冲区,用于在统计任务OS_TaskStat()挂起时,保存该任务的浮点
//寄存器内容。
    if (pblk != (void *)0) {                       /* Did we get a memory block?                       */
		//检查得到的缓冲区是否合法
        ptcb->OSTCBExtPtr = pblk;                  /* Yes, Link to task's TCB                          */
		//合法,保存在OS_TCB的扩展变量,OSTCBExtPtr中的指针指向
		//保存FPU的存储区
        OSFPSave(pblk);                            /*      Save the FPU registers in block             */
		//将FPU寄存器当前内容保存在pblk指向的地方。
    }
#endif
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                       OS INITIALIZATION HOOK
*                                            (BEGINNING)
*
* Description: This function is called by OSInit() at the beginning of OSInit().
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                          系统初始化开始接口函数
  描述:在  OSInit()开始的时候由OSInit()调用                      
*********************************************************************************************************
*/


#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().
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts should be disabled during this call.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                               系统初始化结束接口函数
 描述:在OSInit()结束的时候由OSInit()调用
 备注:调用此函数时要关中断
 此函数调用了OSFPInit(),它负责设置保留的内存分区,该内存分区
 用来保存各任务的浮点寄存器
*********************************************************************************************************
*/


#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSInitHookEnd (void)
{
    OSFPInit();//它负责设置保留的内存分区,该内存分区
 //用来保存各任务的浮点寄存器
}
#endif

/*$PAGE*/
/*
*********************************************************************************************************
*                                          TASK CREATION HOOK
*
* Description: This function is called when a task is created.
*
* Arguments  : ptcb   is a pointer to the task control block of the task being created.
*
* Note(s)    : 1) Interrupts are disabled during this call.
*              2) I decided to change the options on the statistic task to allow for floating-point in
*                 case you decide to do math. in OSTaskStatHook().
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                                      任务建立接口函数
描述:任务建立的时候调用
参数:ptcb:将要建立任务的任务控制块指针
备注:1、调用的时候中断要关闭
                2、当我们要在OSTaskStatHook()中作计算的时候我打算改变
                       它的属性使之能够浮点运算
                                                      
*********************************************************************************************************
*/


#if OS_CPU_HOOKS_EN > 0
void OSTaskCreateHook (OS_TCB *ptcb)
{
    INT8U  err;
    void  *pblk;
    
    
    if (ptcb->OSTCBOpt & OS_TASK_OPT_SAVE_FP) {  /* See if task needs FP support                      */
		//任务是否需要支持浮点
        pblk = OSMemGet(OSFPPartPtr, &err);      /* Yes, Get storage for FPU registers                */
		//需要的话,得到存储FPU寄存器的存储空间
        if (pblk != (void *)0) {                 /*      Did we get a memory block?                   */
			//得到的空间是否合法
            ptcb->OSTCBExtPtr = pblk;            /*      Yes, Link to task's TCB                      */
			//合法,加到任务TCB单向链表
            OSFPSave(pblk);                      /*           Save the FPU registers in block         */
			//将FPU寄存器当前内容保存在pblk指向的地方。这一过程中,FPU包含
          //了什么内容不重要,重要的是,FPU寄存器包含了有效数值
		
        }
    }
}
#endif

/*
*********************************************************************************************************
*                                           TASK DELETION HOOK
*
* 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.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
                                               任务删除接口函数
描述:当一个任务删除时这个函数被调用
参数:ptcb:将要建立任务的任务控制块指针
备注:1、调用的时候中断要关闭
                2、OSTaskDel()通过调用OSTaskDelHook()函数扩展其功能,
                因为在建立任务时,分配了一个内存块,用于保存浮点寄存器的内容
                所以在任务删除时,需要释放该内存块。

⌨️ 快捷键说明

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