搜索
bottom↓
回复: 3

ucos 请求删除任务 用法求解!

[复制链接]

出0入0汤圆

发表于 2014-11-22 15:40:11 | 显示全部楼层 |阅读模式
本帖最后由 lanfeng0107 于 2014-11-22 15:41 编辑

   单任务执行完后用函数
   OSTaskDel (OS_PRIO_SELF); 删除自己,但是这样不能释放任务所占用的资源!
  而请求删除任务据说可以释放资源!
  OSTaskDelReq(OS_PRIO_SELF);
  但是,不明白,这个函数是自己释放的资源还是要自己手动释放!
  看函数的源代码,貌似它里边没有释放资源的代码啊!???
  请过来人明示! 谢谢!
  同求相关实例代码!

出870入263汤圆

发表于 2014-11-22 16:24:10 | 显示全部楼层
你说的的资源是指什么?关于任务的结束,是跟移植密切相关的,目前的ARM移植,都是把OS_TaskReturn函数指针赋给LR。这样你的任务结束前可以先释放自己占有的资源,然后直接return就可以了,就像main一样。因为当你return之后,任务函数返回,也就是回到OS_TaskReturn了,这个函数会负责删除任务的TCB控制块。
具体的知识你参看移植代码os_cpu_c.c文件。
ARM7,ARM9的参考代码:
  1. OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
  2. {
  3.   OS_STK *stk;
  4.   INT32U  task_addr;
  5.   
  6.   opt       = opt;                          /* 'opt' is not used, prevent warning                     */
  7.   stk       = ptos;                         /* Load stack pointer                                     */
  8.   task_addr = (INT32U)task & ~1;            /* Mask off lower bit in case task is thumb mode          */
  9.   *(stk)    = (INT32U)task_addr;            /* Entry Point                                            */
  10.   *(--stk)  = (INT32U)OS_TaskReturn;        /* R14 (LR)                                               */
  11.   stk      -= 12;                           /* R12 - R1                                               */
  12.   *(--stk)  = (INT32U)p_arg;                /* R0 : argument                                          */
  13.   if ((INT32U)task & 0x01) {                /* See if task runs in Thumb or ARM mode                  */
  14.     *(--stk) = (INT32U)ARM_SVC_MODE_THUMB;  /* CPSR  (Enable both IRQ and FIQ interrupts, THUMB-mode) */
  15.   } else {
  16.     *(--stk) = (INT32U)ARM_SVC_MODE_ARM;    /* CPSR  (Enable both IRQ and FIQ interrupts, ARM-mode)   */
  17.   }
  18.   
  19.   return (stk);
  20. }
复制代码


Cortex-M系列参考代码:
  1. OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
  2. {
  3.     OS_STK *stk;

  4.     (void)opt;                                 /* 'opt' is not used, prevent warning                     */
  5.     stk       = ptos + 1;                      /* Load stack pointer                                     */
  6.     stk       = (OS_STK *)((INT32U)stk & ~7u); /* 为了兼容AEABI规范,使堆栈指针8字节对齐                 */
  7.                                                /* Registers stacked as if auto-saved on exception        */
  8.     *(--stk)  = (INT32U)0x01000000L;           /* xPSR                                                   */
  9.     *(--stk)  = (INT32U)task;                  /* Entry Point                                            */
  10.     *(--stk)  = (INT32U)OS_TaskReturn;         /* R14 (LR) (init value will jump to OS_TaskReturn())     */
  11.     stk      -= 4;                             /* R12, R3, R2, R1                                        */
  12.     *(--stk)  = (INT32U)p_arg;                 /* R0 : argument                                          */
  13.                                                /* Remaining registers saved on process stack             */
  14.     stk      -= 8;                             /* R11 - R4                                               */

  15.     return (stk);
  16. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-11-22 16:35:30 | 显示全部楼层
本帖最后由 lanfeng0107 于 2014-11-22 16:36 编辑

  恩,先谢谢!
   其实我不明白这里
void Task(void * p_arg)
{
   while(1)
    {
        OSTimeDlyHMSM(0, 0,0,1);
        if(OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)
        {
               //释放资源和动态内存代码  --- 是否还有我手动添加操作的内容
               OSTaskDel(OS_PRIO_SELF);
        }
    }
}

出0入0汤圆

 楼主| 发表于 2014-11-22 16:39:58 | 显示全部楼层
我大概明白了,是不是这样!
其删除任务思路 首先把任务从就绪列表中去除(如果处于就绪列表中),当然如果处于其它的比如说事件,邮箱等等待表中,也要把他们给删除,避免死锁;同时任务的时钟节拍延迟清0,以增强其余任务的实时性,同时把该任务的控制块中的OSTCBStat标志为OS_STAT_RDY,防止待会开中断时其它任务调用OSTaskResume()。接下来就是把要删除的任务控制块放回空任务控制块链表中。

我自己申请的任务堆栈数组可以给别的任务再使用!
也就是说,在那里不用再添加什么操作了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 22:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表