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