rtx任务管理

2013-11-07
--luoqindong
内核初始化函数:
<1> void os_sys_init (
    void (*task)(void) );  /* Task to start */
    初始化并启动RTX内核,内核起来后运行传进来的task任务.该任务的优先级为1, 堆栈大小在rtx_config.c文件中配置,默认为512字节.
<2> void os_sys_init_prio (
    void (*task)(void),   /* Task to start */
    U8 priority);         /* Task priority (1-254) */
  与os_sys_init功能一样, 多了配置task任务优先级的功能.
    priority范围为1~254, 0留给idle task使用,255为保留值.如果设置priority为0,内核自动调整为1.


<3> void os_sys_init_user (
    void (*task)(void),    /* Task to start */
    U8    priority,        /* Task priority (1-254) */
    void* stack,           /* Task stack */
    U16   size);           /* Stack size */
    与os_sys_init_prio功能一样, 多了配置task任务堆栈的功能.
    任务堆栈必须是8字节对齐,可以这样定义任务堆栈:
    static U64 stk1[400/8];    /* 400-byte stack */
    因为unsigned long long变量在cortex-m3内核是8字节对齐的.
    也可以这样定义:
    static __align(8) u8  stk1[400];


任务创建:


<1> OS_TID os_tsk_create (
    void (*task)(void),    /* Task to create */
    U8    priority );      /* Task priority (1-254) */
    
    返回值:
    成功返回任务ID号,失败时返回0.
    
    参数priority指定任务的优先级,如果为0,内核会将优先级调整为1(优先级0给idle task使用),255应该给优先级最高的任务使用,建议不要使用该优先级。
    如果新建任务的优先级比当前任务的大,会立即切换到新任务去运行,否则将新任务放到就绪队列中(任务状态为READY).任务使用默认的堆栈大小(512Byte),
    在rtx_confg.c中定义.


<2> OS_TID os_tsk_create_ex (
    void (*task)(void *),    /* Task to create */
    U8    priority,          /* Task priority (1-254) */
    void* argv );            /* Argument to the task */


    返回值:
    成功返回任务ID号,失败时返回0.


    在新任务启动时,可以将argv参数传递给任务,其他功能与os_tsk_create函数一样.


<3> OS_TID os_tsk_create_user(
    void (*task)(void),    /* Task to create */
    U8    priority,        /* Task priority (1-254) */
    void* stk,             /* Pointer to the task's stack */
    U16   size );          /* Number of bytes in the stack */
    
    返回值:
    成功返回任务ID号,失败时返回0.


    该函数可以配置任务的堆栈大小,其他功能与os_tsk_create函数一样.
    任务堆栈必须是8字节对齐,可以这样定义任务堆栈:
    static U64 stk1[400/8];    /* 400-byte stack */
    因为unsigned long long变量在cortex-m3内核是8字节对齐的.
    也可以这样定义:
    static __align(8) u8  stk1[400];


<4> OS_TID os_tsk_create_user_ex (
    void (*task)(void *),    /* Task to create */
    U8    priority,          /* Task priority (1-254) */
    void* stk,               /* Pointer to the task's stack */
    U16   size,              /* Size of stack in bytes */
    void* argv );            /* Argument to the task */
    
    返回值:
    成功返回任务ID号,失败时返回0.


    该函数是os_tsk_create_ex和os_tsk_create_user的合并版本,可以传argv参数给任务又可以定制任务堆栈大小,其他功能与os_task_create一样.
    
argv的使用例子:


同时创建两个task2任务,通过传进去的参数argv区别是哪一个任务.


#include <rtl.h>


OS_TID tsk1, tsk2_0, tsk2_1;
int param[2] = {0, 1};


__task void task1 (void) {
   ..
  tsk2_0 = os_tsk_create_ex (task2, 1, &param[0]);
  tsk2_1 = os_tsk_create_ex (task2, 1, &param[1]);
   ..
}


__task void task2 (void *argv) {
   ..
  switch (*(int *)argv) {
    case 0:
      printf("This is a first instance of task2.\n");
      break;
    case 1:
      printf("This is a second instance of task2.\n");
      break;
  }
   ..
}


其他相关函数


<1> OS_RESULT os_tsk_delete (
    OS_TID task_id );    /* Id of the task to delete */
    
    返回值:
  OS_R_OK: 要删除的任务已停止并已被删除
    OS_R_NOK: 删除任务出错,如任务不存在。
   
    该函数用于删除一个任务,task_id为要删除的任务ID号.task_id=0表示删除当前任务,当前任务被删除后,
    会从就绪对例中取出优先级最高的任务运行。


<2> void os_tsk_delete_self (void);
    
    该函数用于删除当前任务,当前任务被删除后,会从就绪对例中取出优先级最高的任务运行。


<3> void os_tsk_pass (void);
    
    主动将CPU控制权转交给就绪队例中同优先级的任务.如果就绪队例中有和当前任务优先级(任务A)一样的任务(任务B),
    内核会切换到任务B去运行.如果没有与当前任务优先级一样的任务,当前任务会继续运行.
    因为RTX允许任务的优先级一样,同优先级的任务可以调用该函数主动放弃CPU,让其他同优先级的任务运行.


<4> OS_RESULT os_tsk_prio (
    OS_TID task_id,       /* ID of the task */
    U8     new_prio );    /* New priority of the task (1-254) */


    返回值:
    OS_R_OK   任务优先级修改成功
    OS_R_NOK  修改优先级失败
   
    该函数修改任务的优先级,task_id为要修改的任务ID, new_prio为新优先级,new_prio范围为1~254, 0为idle task的
  优先级,如果new_prio为0,内核自动调整为1。如果task_id = 0,修改的是当前任务的优先级.如果新任务的优先级比当前
  任务要高,则切换到新任务运行。
    
<5> OS_RESULT os_tsk_prio_self (
    U8 new_prio );    /* New priority of task (1-254) */
    
    返回值:
    OS_R_OK   任务优先级修改成功
    OS_R_NOK  修改优先级失败
    
    功能与os_task_prio(0, new_prio)一样,修改的是当前任务的优先级.


<6> OS_TID os_tsk_self (void)
    
    返回值:
    当前任务的ID号
    
    获取当前任务的ID号.


<7> OS_TID isr_tsk_get (void);
    
    返回值:
    当前被中断的任务ID号


  该函数在中断处理程序中使用,获取当前被中断的任务的ID号



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值