usos-ii的笔记2

                     Uc/os-ii的读书笔记

  一个无限循环的任务:

    void YourTask (void *pdata)                      

    {

       for (;;) {                                    

          /* 用户代码 */

          调用uC/OS-II的某种系统服务:

          OSMboxPend();

          OSQPend();

          OSSemPend();

          OSTaskDel(OS_PRIO_SELF);

          OSTaskSuspend(OS_PRIO_SELF);

          OSTimeDly();

          OSTimeDlyHMSM();

          /* 用户代码 */

       }

}

这个任务在一个循环里面,所以这个任务无限的循环之中。

   任务的删除,我的理解就是在这个死循环里面,一个叫做OSTaskDel(OS_PRIO_SELF);

  传参数可以是这个函数的地址,这种的删除只是意义的删除,仅仅不再理会这个任务;

  关于任务的管理的函数

  建立任务:OSTaskCreat()

  建立任务,OSTaskCreateExt()

  这两个函数都可可以建立任务的,但是呢Ext的加强版的建立任务的函数,

  OSTaskCreat()这个函数需要四个参数,他们分别为task是任务代码指针,pdata是指餐给任务的参数的指针的。Ptos是分配给任务的堆栈的栈顶的指针,prio是分配给任务的优先级。

其实就是这个任务的是什么,这个任务需要上面东西,然后系统堆栈里面的位置吧(这个是猜的),还没没有搞懂堆栈的问题。然后就是每个任务的优先级的问题了。

 

 

这个函数:

INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)

{

    void   *psp;

    INT8U   err;

    if (prio > OS_LOWEST_PRIO) {                                                return (OS_PRIO_INVALID);

    }

    OS_ENTER_CRITICAL();

    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {                             

        OSTCBPrioTbl[prio] = (OS_TCB *)1;                                

        OS_EXIT_CRITICAL();                                                     psp = (void *)OSTaskStkInit(task, pdata, ptos, 0);               

        err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);      

          if (err == OS_NO_ERR)

       {                                        

            OS_ENTER_CRITICAL();

            OSTaskCtr++;                                                

            OSTaskCreateHook(OSTCBPrioTbl[prio]);                       

            OS_EXIT_CRITICAL();

            if (OSRunning) {                                            

                OSSched();                                            

            }

        } else {

            OS_ENTER_CRITICAL();

            OSTCBPrioTbl[prio] = (OS_TCB *)0;                                       OS_EXIT_CRITICAL();

        }

        return (err);

    } else {

        OS_EXIT_CRITICAL();

        return (OS_PRIO_EXIST);

    }

}

任务堆栈:

 什么是任务堆栈,每一个任务都有自己的堆栈孔家。用户可以静态的分配堆栈的孔家也可以动态分配,其实就C语言里面的空间的分配,不同的变量,常量以及malloc分配的空间的意思。 在这里给任务任务分配空间(好像是这样的)。 堆栈的声明是必须是OS_STK的类型的。

知道处理器的堆栈的存放时,是从高地址往低地址还是低地址往高地址的。

 检验:

只要把栈顶的传递给OSTaskCreate()OSTaskCreateExt()函数,OS_CPU.H文件中的OS_STK_GROWTH置为0时,用户需要将堆栈的最低内存地址传递给任务创建函数

删除任务:OSTaskDel()\

删除任务的实质不是讲这个任务删掉,而是将的任务的状态的改编为休眠的状态。

还有删除的任务不能是空闲的任务,其实删除任务其实就是就是关掉一个任务的执行的过程。

  要被删除的任务不会被其他的任务置于就绪的状态,有一个思想错了,就是关掉那个任务,我感觉更是被抛弃。而且感觉这个删除的函数,好复杂啊,还要考虑到中断店用这个任务。

没看懂。

请求删除任务,但是由于这个任务作用到的一些的内存的缓存区和信号等资源,但是其他的任务要将这个任务删除的时候的这些资源没有被释放而丢失的那么将要这些资源用完以后在删除。那么要被删除的任务需要调用OSTaskREq()函数,就是接受删除的这个任务但是还没有被删除的,

还有改变任务的优先级的,在刚刚开始的时候任务的创建的时候,有一个指针是优先级的。

但是,写的是分配这个任务的优先级,那么一个任务在建立的时候就已经有优先级了。

那么OSTaskChangePrio();这个函数单独的改变任务的优先级,刚刚在创建里面还检查了优先级的 ,这个就比较的尴尬了,如何检查到这个优先级这个歌优先级不对的时候是不是应该重新分配空闲的优先级呢,回去看了一下,好像只是检测了一下,没有进行分配啊。

那么就是进来的时候传参的时候给的优先级而已。

挂起任务:

这个和删除任务来说,只是让当前的任务结束,结束后的状态可以有多种。比如就绪啊

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值