打印

ucos 的问题

[复制链接]
2740|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yoyowodeai|  楼主 | 2010-4-25 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int main (void)
{
OSInit ();                              
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);    // 1
OSStart ();
return 0;               
}
我想问下,
1.Main()函数是属于哪个进程的?

2.在上面的注释1中,创建了一个任务,然后会调用调度程序,调度程序找到就绪组中的最高优先级进程,切换上下文,之后会怎样??运行该进程?那OSStart()还有什么用?

3.如果切换了上下文之后不会马上运行选中的进程,那每次调度后都要运行一次OSStart()?

相关帖子

沙发
3B1105| | 2010-4-25 21:55 | 只看该作者
1。Main()不是进程,因为ucos中,是通过TCB(任务控制块)来感知,调度任务的。程序没有为Main()分配TCB。



2。在注释1处创建了任务Task0,但没有运行。OSTaskCreate()中调用任务是在OSStart()执行后才起作用的(也就是说ucos操作系统接管CPU后会产生标志位,OSTaskCreate()检测不到标志位,因此不调用任务)。



3。此程序的执行过程如下:

     OSInit ();   初始化ucos操作系统,建立空的TCB链表,各全局变量赋初值   

     OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);      创建任务Task0,从空TCB链表中取一个TCB结构体,完成对任务的对应关系。

      OSStart ();      ucos操作系统接管CPU,开始任务调度。任务一般为超循环结构,不会返回。因此main()函数到此不再执行

      return 0;      永远不会执行,因为ucos操作系统接管CPU后,只调度任务,而main()函数没有分配TCB,因此永远不会被调度。此语句永远不会执行。

使用特权

评论回复
板凳
六楼的窗户| | 2010-4-25 21:57 | 只看该作者
另附完整OSTaskCreate()函数如下:

     注意代码:     

           if (OSRunning == TRUE)

           {         /* Find highest priority task if multitasking has started */
                     // 如果多任务开始,寻找最高优先级任务
                  OS_Sched();
           }


               

/*

建立一个任务
      描述:这个函数用于ucosII处理完成一个任务,它要么在多任务处理之前建立,
                  要么运行任务建立,它不够由中断服务程序建立。

参数:task: 指向任务代码的指针。
                 pdata:是一个指向非强制性数据区域的指针,当任务优先运行时传递
                 参数给任务。任务有关部分假想它被唤醒,然后按照以下方式传递pdata:
*                           void Task (void *pdata)
*                           {
*                               for (;;) {
*                                   Task code;
*                               }
*                           }
                ptos:指向任务堆栈顶部的指针,如果配置常数 OS_STK_GROWTH 设置为1的话,堆栈则会由高到低增长(由高地址向低地址存储)。所以
“pstk”会指向堆栈存储器位置的最高地址;如果 OS_STK_GROWTH 设置为0的话,“pstk”将指向堆栈
最低存储器位置,堆栈将按存储器位置递增。
             prio:是任务的优先级,一个独特的优先级必须指定给每个任务,最小的数对应最高优先级。

                 返回:OS_NO_ERR   :如果函数成功。
                                  OS_PRIO_EXIT :如果优先级已经存在。
                                  OS_PRIO_INVALID:如果定义优先级的数大于最大值
                 
*********************************************************************************************
*/

#if OS_TASK_CREATE_EN > 0   // 能使包含任务创建代码
INT8U  OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) // 上面有说明
{
#if OS_CRITICAL_METHOD == 3                  /*  Allocate storage for CPU status register               */
                                //  为CPU状态寄存器分配存储空间
    OS_CPU_SR  cpu_sr;         // CPU状态字是十六位 OS_CPU_SR为unsigned int
#endif
    OS_STK    *psp;
    INT8U      err;


#if OS_ARG_CHK_EN > 0
// 如果OS_ARG_CHK_EN 设为1,OSTaskCreate会检查分配给任务的优先级是否有效。
// 系统在执行初始化的时候,已经把最低优先级分配给了空闲任务。
// 所以不能用最低优先级来创建任务。
    if (prio > OS_LOWEST_PRIO) {             /* Make sure priority is within allowable range           */
                                   // 保证优先级在允许范围内
        return (OS_PRIO_INVALID);
    }
#endif
    OS_ENTER_CRITICAL();                  // 进入临界状态
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority  */
                                     // 保证优先级没有被其它任务占用
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* Reserve the priority to prevent others from doing ...  */
                                             /* ... the same thing until task is created.              */
        // 放置一个非空指针,表示已经占用
        OS_EXIT_CRITICAL();        // 退出临界状态
        psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);    /* Initialize the task's stack         */
                       // 初始化任务堆栈,即建立任务堆栈
        err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
        // 初始化任务控制块,从空闲的OS_TCB缓冲池
        // 中获得并初始化一个任务控制块
        if (err == OS_NO_ERR) {         // 如果初始化没有错
            OS_ENTER_CRITICAL();   // 进入临界状态
            OSTaskCtr++;                                        /* Increment the #tasks counter        */
   // 任务数量加一
            OS_EXIT_CRITICAL();   // 退出临界状态
            if (OSRunning == TRUE) {         /* Find highest priority task if multitasking has started */
    // 如果多任务开始,寻找最高优先级任务
                OS_Sched();
            }
        } else {              //如果初始化任务控制块有错
            OS_ENTER_CRITICAL();//进入临界状态
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others                 */
   //把这一优先级给其它任务
            OS_EXIT_CRITICAL();//退出临界状态
        }
        return (err);//返回错误信息
    }
    OS_EXIT_CRITICAL();//如果优先级占用,退出临界状态
    return (OS_PRIO_EXIST);//返回优先级存在
}
#endif

使用特权

评论回复
地板
6019赵文| | 2010-4-25 21:58 | 只看该作者
我也在 看ucos ,不过我刚刚开始学习这个,还看不懂呢!上面两位高手能给予初学者点指导意见吗?如果还能再指导一下ADS的使用,不胜感激!谢谢!谢谢!

使用特权

评论回复
5
年轻不在| | 2010-4-25 21:58 | 只看该作者
我看ucos时是拿毛德操&胡希明的<<嵌入式系统...>>看的,邵贝贝写的那本书当是参考,我个人认为这样学比较好,不过我当时没有认真看,只想着看完了UCOS就看UCLINUX,

使用特权

评论回复
6
luffy59704331| | 2010-4-26 16:30 | 只看该作者
学习中哈哈

使用特权

评论回复
7
手写识别| | 2010-4-28 14:22 | 只看该作者
ARM中一直UCOS好像少啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

1265

帖子

2

粉丝