uc/os-ii应用程序中函数的调用关系
2011-03-06 08:11
423 查看
应用程序中函数的调用关系
#include “includes.h”
#define TASK_STK_SIZE 512 // 定义堆栈长度(1024字节)
OS_STK TaskStk[TASK_STK_SIZE]; // 定义一个数组来作为任务堆栈
void main()
{
……
OSInit(); // 初始化uC/OS-IIi
……
OSTaskCreate(MyTask1,……); // 创建用户任务1
OSTaskCreate(MyTask2,……); // 创建用户任务2
……
OSStart(); // 启动任务
……
}void MyTask(void *pdata)
{
for (;;)
{
可以被中断的任务代码;
OS_ENTER_CRITICAL(); //进入临阶段(关中断)
不可以被中断的任务代码;
OS_EXIT_CRITICAL(); //退出临阶段 (开中断)
可以被中断的任务代码;
}
}
图1 OS_CORE.C文件中的OSInit()函数
图2 全局变量的说明
uC/OS-II初始化了5个空的数据结构缓冲区,每个缓冲区都是单向链表,允许uC/OS-II从缓冲区中迅速取得或释放一个缓冲区中的元素。
图3 五个空的数据结构缓冲区
图 4 OS_TASK.C中的OSTaskCreate ()函数
任务堆栈初始化就是对栈顶指针和寄存器进行初始化,OSTaskStkInit()函数的定义在OS_CPU_C.C文件中。
OS_TCBInit( )就是对结构体
typedef struct os_tcb {
OS_STK *OSTCBStkPtr;
#if OS_TASK_CREATE_EXT_EN > 0
void *OSTCBExtPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
#endif
…………
struct os_tcb *OSTCBNext;
struct os_tcb *OSTCBPrev;
INT16U OSTCBDly;
INT8U OSTCBStat;
INT8U OSTCBPrio;
INT8U OSTCBX;
INT8U OSTCBY;
INT8U OSTCBBitX;
INT8U OSTCBBitY;
} OS_TCB;
进行初始化。
图 5 OS_TASK.C中的OSTaskCreateExt()函数
任务的调度函数OS_Sched()如下:
void OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U y;
OS_ENTER_CRITICAL();
if ((OSIntNesting == 0) && (OSLockNesting == 0)) {
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
if (OSPrioHighRdy != OSPrioCur) {
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OS_TASK_SW();
}
}
OS_EXIT_CRITICAL();
}
在OS_CPU.H中找到:
#define OS_TASK_SW() asm INT uCOS
但没找到具体代码。
OS_TASK_SW()的主要工作:
把被中止任务的断点指针保存到任务堆栈中;
把CPU通用寄存器的内容保存到任务堆栈中;
把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中;
获得待运行任务的任务控制块;
使CPU通过任务控制块获得待运行任务的任务堆栈指针;
把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;
使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。
图 6 OS_CORE.C文件中的OSStart()函数
在OS_CORE.C文件中有OSStart ()的定义。
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy();
}
}
OS_CPU_A.ASM中找到了OSStartHighRdy()的汇编代码,求解释?
_OSStartHighRdy PROC FAR
MOV AX, SEG _OSTCBHighRdy
MOV DS, AX
CALL FAR PTR _OSTaskSwHook
MOV AL, 1
MOV BYTE PTR DS:_OSRunning, AL
LES BX, DWORD PTR DS:_OSTCBHighRdy
MOV SS, ES:[BX+2]
MOV SP, ES:[BX+0]
POP DS
POP ES
POPA
IRET
_OSStartHighRdy ENDP
#include “includes.h”
#define TASK_STK_SIZE 512 // 定义堆栈长度(1024字节)
OS_STK TaskStk[TASK_STK_SIZE]; // 定义一个数组来作为任务堆栈
void main()
{
……
OSInit(); // 初始化uC/OS-IIi
……
OSTaskCreate(MyTask1,……); // 创建用户任务1
OSTaskCreate(MyTask2,……); // 创建用户任务2
……
OSStart(); // 启动任务
……
}void MyTask(void *pdata)
{
for (;;)
{
可以被中断的任务代码;
OS_ENTER_CRITICAL(); //进入临阶段(关中断)
不可以被中断的任务代码;
OS_EXIT_CRITICAL(); //退出临阶段 (开中断)
可以被中断的任务代码;
}
}
图1 OS_CORE.C文件中的OSInit()函数
图2 全局变量的说明
uC/OS-II初始化了5个空的数据结构缓冲区,每个缓冲区都是单向链表,允许uC/OS-II从缓冲区中迅速取得或释放一个缓冲区中的元素。
图3 五个空的数据结构缓冲区
图 4 OS_TASK.C中的OSTaskCreate ()函数
任务堆栈初始化就是对栈顶指针和寄存器进行初始化,OSTaskStkInit()函数的定义在OS_CPU_C.C文件中。
OS_TCBInit( )就是对结构体
typedef struct os_tcb {
OS_STK *OSTCBStkPtr;
#if OS_TASK_CREATE_EXT_EN > 0
void *OSTCBExtPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
#endif
…………
struct os_tcb *OSTCBNext;
struct os_tcb *OSTCBPrev;
INT16U OSTCBDly;
INT8U OSTCBStat;
INT8U OSTCBPrio;
INT8U OSTCBX;
INT8U OSTCBY;
INT8U OSTCBBitX;
INT8U OSTCBBitY;
} OS_TCB;
进行初始化。
图 5 OS_TASK.C中的OSTaskCreateExt()函数
任务的调度函数OS_Sched()如下:
void OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U y;
OS_ENTER_CRITICAL();
if ((OSIntNesting == 0) && (OSLockNesting == 0)) {
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
if (OSPrioHighRdy != OSPrioCur) {
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OS_TASK_SW();
}
}
OS_EXIT_CRITICAL();
}
在OS_CPU.H中找到:
#define OS_TASK_SW() asm INT uCOS
但没找到具体代码。
OS_TASK_SW()的主要工作:
把被中止任务的断点指针保存到任务堆栈中;
把CPU通用寄存器的内容保存到任务堆栈中;
把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中;
获得待运行任务的任务控制块;
使CPU通过任务控制块获得待运行任务的任务堆栈指针;
把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;
使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。
图 6 OS_CORE.C文件中的OSStart()函数
在OS_CORE.C文件中有OSStart ()的定义。
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy = (INT8U)((y << 3) + x);
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy();
}
}
OS_CPU_A.ASM中找到了OSStartHighRdy()的汇编代码,求解释?
_OSStartHighRdy PROC FAR
MOV AX, SEG _OSTCBHighRdy
MOV DS, AX
CALL FAR PTR _OSTaskSwHook
MOV AL, 1
MOV BYTE PTR DS:_OSRunning, AL
LES BX, DWORD PTR DS:_OSTCBHighRdy
MOV SS, ES:[BX+2]
MOV SP, ES:[BX+0]
POP DS
POP ES
POPA
IRET
_OSStartHighRdy ENDP
相关文章推荐
- 在UC/OS-II上开发应用程序的起步信息
- uC/OS-II 函数之邮箱管理相关函数
- 驱动程序与应用程序中函数调用关系分析(write)
- uC/OS-II 函数之时间相关函数
- UC/OS-II的函数------OSTimeDly
- uC/OS-II 函数之时间相关函数
- uC/OS II学习时的一个重要函数 OSInit( );
- uC/OS II学习时的一个重要函数 OSInit( )
- uC/OS-II 常用函数参考手册
- uC/OS-II 函数之任务相关函数
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
- uC/OS-II 函数之任务相关函数
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
- uc/os-II之延时函数解析
- uC/OS-II 应用程序基本结构
- uC/OS-II 一些函数简介
- uC/OS-II 常用函数参考手册
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
- uC/OS-II 一些函数简介
- 应用程序调用dll组件,及dll组件之间的关系,dll中类及函数的导入导出;dll的导出方式和链接方式分析(一)