Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1183458
  • 博文数量: 221
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2139
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 19:53
个人简介

JustForFun

文章分类

全部博文(221)

文章存档

2024年(6)

2023年(8)

2022年(2)

2021年(2)

2020年(29)

2019年(11)

2018年(23)

2017年(41)

2016年(76)

2015年(23)

我的朋友
最近访客

分类: 嵌入式

2015-07-21 22:07:03

为什么不注释掉OSStatInit()系统会崩呢。
int main(void)
{
    OSInit();
    BSP_Init();
 
/********* 
    #if (OS_TASK_STAT_EN > 0)
     OSStatInit();
    #endif
*******/   
  OSTaskCreate(TaskLed1,(void *)0,&task1stack[stack1_size-1], TASK_LED1_PRIO );
  OSTaskCreate(TaskLed2,(void *)0,&task2stack[stack2_size-1], TASK_LED2_PRIO );
 OSStart();
   while(1)
    {
       
    OSTaskSuspend(OS_PRIO_SELF);
    }
    
   
   
}

而源代码是下面的切不崩,?????
static OS_STK   TaskStartStk[TASK_START_STK_SIZE];
static OS_STK   TaskLed1Stk[TASK_LED1_STK_SIZE];
static OS_STK   TaskLed2Stk[TASK_LED2_STK_SIZE];
static void TaskCreate(void *p_arg);
static void TaskLed1(void *p_arg);
static void TaskLed2(void *p_arg);

 

int main(void)
{
    OSInit();
 
    OSTaskCreate(TaskCreate,(void*)0,&TaskStartStk[TASK_START_STK_SIZE-1],TASK_START_PRIO);
//<嵌入式实时操作系统UC/OS>邵贝贝 P90  OSTaskStat的优先级总是设为OS_LOWEST_PRIO-1
 
    OSStart();
}
static void TaskCreate(void *p_arg)
{
 int i,j;
    (void)p_arg;
 for(i=0;i<900;i++)
 {
 for(j=0;j<9000;j++)
  {
   ;
  }
 }
    BSP_Init();
  
    #if (OS_TASK_STAT_EN > 0)
     OSStatInit();
    #endif
    OSTaskCreate(TaskLed1,(void*)0,&TaskLed1Stk[TASK_LED1_STK_SIZE-1],TASK_LED1_PRIO);
    OSTaskCreate(TaskLed2,(void*)0,&TaskLed2Stk[TASK_LED2_STK_SIZE-1],TASK_LED2_PRIO);
    while(1)
    {
       OSTaskSuspend(OS_PRIO_SELF);
    }
   
}


以下是OSStatInit()的源码。
#if OS_TASK_STAT_EN > 0 //允许生产OSStatInit()函数
484 void OSStatInit (void) //统计任务初始化
485 {
486 #if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
487 OS_CPU_SR cpu_sr;
488 #endif
489
490
491 OSTimeDly(2); //调用延迟函数OSTimeDly()将自身延时2个时钟节拍以停止自身的运行
492 //这是为了使OSStatInit()与时钟节拍同步
493 OS_ENTER_CRITICAL(); //关闭中断
494 OSIdleCtr = 0L; //执行OSStartInit()时,空闲计数器OSIdleCtr被清零
495 OS_EXIT_CRITICAL(); //打开中断
496 OSTimeDly(OS_TICKS_PER_SEC); //将自身延时整整一秒
497 //(因为没有其它进入就绪态的任务,OSTaskIdle()又获得了CPU的控制权)
498 OS_ENTER_CRITICAL(); //关闭中断
499 OSIdleCtrMax = OSIdleCtr; //空闲计数器将1秒钟内计数的值存入空闲计数器最大值OSIdleCtrMax中
500 OSStatRdy = TRUE; //将统计任务就绪标志OSStatRdy设为"真",以此来允许两个时钟节拍
501 //以后OSTaskStat()开始计算CPU的利用率
502 OS_EXIT_CRITICAL(); //打开中断
503 }
504 #endif
 
图片

图片

图片

图片




问题解答:见黄色字体,但是原因的根源迫于能力暂且搁置。


在OS_TCB中定义了
INT16U OSTCBDly; //定义允许任务等待时的最多节拍数
414 INT8U OSTCBStat; //定义任务的状态字
415 INT8U OSTCBPrio; //定义任务的优先级
416
417 INT8U OSTCBX; //定义指向任务优先级的低3位,即=priority&0x07
418 INT8U OSTCBY; //定义指向任务优先级的高3位,即=priority>>3
419 INT8U OSTCBBitX; //定义低3位就绪表对应值(0~7),即=OSMapTbl[priority&0x07]
420 INT8U OSTCBBitY; //定义高3位就绪表对应值(0~7),即=OSMapTbl[priority>>3]
421
422 #


*********************************************************************************************************
*                              TASK STATUS (Bit definition for OSTCBStat)
*********************************************************************************************************
*/
#define  OS_STAT_RDY               0x00u    /* Ready to run                                            */
#define  OS_STAT_SEM               0x01u    /* Pending on semaphore                                    */
#define  OS_STAT_MBOX              0x02u    /* Pending on mailbox                                      */
#define  OS_STAT_Q                 0x04u    /* Pending on queue                                        */
#define  OS_STAT_SUSPEND           0x08u    /* Task is suspended                                       */
#define  OS_STAT_MUTEX             0x10u    /* Pending on mutual exclusion semaphore                   */
#define  OS_STAT_FLAG              0x20u    /* Pending on event flag group                             */
#define  OS_STAT_MULTI             0x80u    /* Pending on multiple events                              */
#define  OS_STAT_PEND_ANY         (OS_STAT_SEM | OS_STAT_MBOX | OS_STAT_Q | OS_STAT_MUTEX | OS_STAT_FLAG)
OSStatInit()与OSTCBSTat中的STat尽然一个代表统计,一个代表任务状态。
阅读(3276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~