内核初始化函数:
<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, ¶m[0]);
tsk2_1 = os_tsk_create_ex (task2, 1, ¶m[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号
|