PC下简单任务之uCOSII启动脉络

奋斗

#include "includes.h"

#define  TASK_STK_SIZE   512   //任务堆栈长度


//typedef unsigned int   OS_STK;定义在OS_CPU.h中
OS_STK   TaskStartStk[TASK_STK_SIZE];  //定义任务堆栈区-大小为2*512=1024byte=1k
INT16S   key;        //用于退出uCOS_II的键 
INT8U  x=0,y=0;    //字符显示位置

void  ATask(void *data);   //声明一个任务
/************************主函数*********************************************/
void  main (void)
{
    char* s="A";    //定义要显示的字符

    OSInit();     //初始化uCOS_II

    PC_DOSSaveReturn();   //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断0x80H.软中断,任务级切换

 #if OS_STK_GROWTH == 1
    OSTaskCreate(ATask,            //创建任务MyTask-指向任务的指针即函数名
                             s,                     //给任务传递参数
                             &TaskStartStk[TASK_STK_SIZE - 1],//设置任务堆栈栈顶指针-堆栈增长方向向下,有高地址向低地址增长
                             0);                     //使任务MyTask的优先级别为0
 #else
 OSTaskCreate(ATask,                 //创建任务MyTask-指向任务的指针即函数名
                           s,                        //给任务传递参数
                           &TaskStartStk[0], //设置任务堆栈栈顶指针-堆栈增长方向向上,有低地址向高地址增长
                           0);
 #endif

    OSStart();     //启动uCOS_II的多任务管理
}


void  ATask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif

    pdata = pdata;

    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR); //安装uCOS_II时钟中断向量.硬件中断
    PC_SetTickRate(OS_TICKS_PER_SEC); //设置uCOS_II时钟频率.OS_CFG.H中设置.200hz
    OS_EXIT_CRITICAL();

   //OSStatInit()要在建立的第一个,并且只有一个任务的时候调用
    OSStatInit();   //初始化uCOS_II的统计任务

    for (;;)
 {       
        if (x>10)//0-10共显示11个字符,超过换行
       {
           x=0;
           y+=2;//换2行
       }                                       
      PC_DispChar(x, y,  //在x,y位置显示s中的字符
                             *(char*)pdata,
                             DISP_BGND_BLACK+DISP_FGND_WHITE );
    x += 1;//列递增                        

  //如果按下Esc键则退出uCOS_II
  if (PC_GetKey(&key) == TRUE)
  {
              if (key == 0x1B)
             {
                  PC_DOSReturn();
              }
         }

        OSTimeDlyHMSM(0, 0, 1, 0); //等待
     }
}

奋斗

主函数main中
OS_CORE.C OSInit()→OS_CORE.C OS_InitMisc();       /* 基础参数初始化 */
                                   →OS_CORE.C OS_InitRdyList();  /* 初始化任务就绪表 */
                                   →OS_CORE.C OS_InitTCBList();  /* 初始化任务控制块 */
                                                              →建立OS_TCB OSTCBFreeList
                                   →OS_CORE.C OS_InitEventList();/* 初始化事件控制块 */
                                   →OS_FLAG.C OS_FlagInit();         /* 事件标志组初始化 */
                                   →OS_MEM.C  OS_MemInit();        /* 内存管理初始化 */
                                   →OS_Q.C    OS_QInit();                 /* 消息队列初始化 */
                                   →OS_CORE.C OS_InitTaskIdle(); /* 创建空闲任务(无条件) */
                                   →OS_CORE.C OS_InitTaskStat(); /* 创建统计任务 */

PC.C       PC_DOSSaveReturn()→PC.C PC_VectGet();
                                                    →PC.C PC_VectSet();
                                                    →PC.C PC_SetTickRate();

PC.C       PC.C PC_VectSet(uCOS,OSCtxSw)→OS_CPU_A.ASM _OSCtxSw;

OS_TASK.C  OSTaskCreate()→OS_CPU_C.C OSTaskStkInit();
                                                →OS_CORE.C OSTCBInit();

OS_CORE.C  OSStart()→OS_CPU_A.asm OSStartHighRdy();

任务中
PC.C PC_VectSet(0x08, OSTickISR);//安装uCOS_II时钟中断向量.硬件中断
          →OS_CPU_A.asm _OSTickISR;
                                          →INT 081H;
                                          →OS_CORE.C OSIntExit()→OS_CPU_A.ASM _OSIntCtxSw;
                                          →OS_CORE.C OSTimeTick();

PC.C PC_SetTickRate(OS_TICKS_PER_SEC);//设置uCOS_II时钟频率.OS_TICKS_PER_SEC在OS_CFG.H中设置为200hz
          →PC.C PC_SetTickRate();

OS_CORE.C OSStatInit()→OS_TIME.C OSTimeDly(INT16U ticks);
                                         →OS_CORE.C OS_Sched();
                                                                   →OS_CPU_A.ASM _OSCtxSw;

OS_TIME.C →OSTimeDlyHMSM(hours,minutes,seconds,milli);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值