|
这篇文档会主要选择些API讲解,读者可以对着代码仔细理解。
1 RAW_U16 raw_task_create(RAW_TASK_OBJ *task_obj, RAW_U8 *task_name, RAW_VOID *task_arg,
RAW_U8 task_prio, RAW_U16 time_slice, PORT_STACK *task_stack_base,
RAW_U16 stack_size, RAW_TASK_ENTRY task_entry, RAW_U8 auto_start)
以上是任务创建函数的原型,有几个地方需要注意下。
1 参数time_slice 是时间片轮以tick 为单位, 如果是0的话会赋予TIME_SLICE_DEFAULT(50)可以配置。
2 task_stack_base 是PORT_STACK 类型的, stack_size 是栈空间类型的数量,不是具体多少字节,这个很重要,比如arm 上的栈大小stack_size 设置为200的话,那么具体栈空间的字节大小为200*4 =800.
3 auto_start 为 1的话任务进入就绪队列,0 的话状态改为suspend 状态,以后需要其他任务调用raw_task_resume 去恢复运行。
4 这个函数会调用移植函数port_stack_init 移植的时候一定要注意栈顶大小不能溢出!!!!
2 RAW_U16 raw_task_stack_check(RAW_TASK_OBJ *task_obj, RAW_U16 *free_stack)
这个函数主要用于检测任务的栈空间还有多少空闲栈元素,注意不是空闲字节,举个例子在arm cpu 上*free_stack =100 的话说明还有400个字节空闲可用。
3 RAW_U16 raw_enable_sche(RAW_U8 need_schedule)
这个函数的特点是抢占当中如果有唤醒了更高优先级任务的话,会发生调度。
4 RAW_U16 raw_sleep(RAW_U32 dly)
这个函数的特点是参数可以为0, 这个时候当前任务就放到同一级的就绪队列最后去
5 RAW_U16 raw_task_suspend(RAW_TASK_OBJ *task_ptr)
这个函数不支持suspend 嵌套,对一个suspend 的任务再次suspend 的话,就返回RAW_SUSPENDED_AGAIN。
6 RAW_U16 raw_task_wait_abort(RAW_TASK_OBJ *task_ptr)
这个函数相当的强大,可以中止一切block 住的任务,和睡眠的函数。
7 RAW_VOID raw_iter_block_task(LIST *object_head, RAW_VOID (*debug_function)(RAW_TASK_OBJ *), RAW_U8 opt)
这是一个很有意思的debug 函数, 能够遍历block 住的任务,遍历的时候可以调用相应的debug_function 函数把任务的具体参数全部打印出来。
Opt =1 的意思是遍历的时候全部唤醒所有block 住的任务,opt=0 则不影响。
8 RAW_U32 raw_get_system_global_space()
这是一个debug 函数会返回raw os系统所有的用到的数据空间包括data 段和BSS段的空间。
9 RAW_U16 raw_task_priority_change (RAW_TASK_OBJ *task_ptr, RAW_U8 new_priority, RAW_U8 *old_priority)
这个函数的特点是你不能改变idle 任务的优先级,你也不能把自己的任务优先级改到和idle 的一样,同时你也不能改变自己任务的优先级到原样。
10 RAW_U16 raw_task_delete(RAW_TASK_OBJ *task_ptr)
这个函数的特点是被删除的任务会从block 状态还有timeout 中移除,而且这个任务的状态会改为RAW_DELETED。
11 RAW_VOID raw_idle_task (void *p_arg)
Idle 任务的设计是很有意思的,如果RAW_TASK_STACK_CHECK被启用的话,它会永远的重复的去检测栈空间的大小,如果任务的栈空间小于原先的10%系统马上会报错,并通过RAW_ASSERT 告诉你具体是哪个任务的栈空间小了,程序员需要去加任务的栈空间了。
|
|