rtx任务管理

内核初始化函数:
<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号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值