logo资料库

nuttx操作系统任务管理切换机制.docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
二、任务接口函数:
三、任务调度接口函数:
四、任务切换接口函数
五、线程
muttx 的任务和任务 任务是 二、任务接口函数: 注意:int task_create(),前几个函数都是有返回值且是 int 型 1、task_init()和 task_action()函数时提供给操作系统内部的, 正常情况下不推荐使用。task_create()的初始化优选机制和启动 一 个新任务。 2、int task_delete(pid_t pid)要谨慎使用,当前任务持有资 源,例如其他任务也需要的分配内存或者信号量,那么调用 task_delete()可以解困这些资源。 使用 task_delete(),任务的堆栈和 TCB 都会释放。 3、void exit(int code)没有返回值 exit()函数释放当前被调用任务的堆栈和 TCB。 4、int task_restart(pid_t pid)重新开始任务,任务必须是: 被停止的任务,重新用与首次启动相同的 ID,优先级初始化,原来 的入口点,堆栈大小和参数 5、pid_t getpid(void) 获取当前被调用任务的 PID 号。 三、任务调度接口函数: 6、int sched_setparam(pid_t pid, const struct sched_param *param) 该功能设置任务的优先级,任务由 pid 输入参数中指定。 param: 参数。一个结构体指针,其成员 sched_priority 是
整数优先级 返回值:成功返回值是0,失败返回值是error或者-1.errno 已经定义: 1)EINVAL:对于当前调度策略参数无效 2)EPERM:调度任务内有相应特权 3)ESRCH:PID号找不到 7、int sched_getparam (pid_t pid, struct sched_param *param) 该功能获取任务的优先级,任务由 pid 输入参数中指定。 8、int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param) 该功能同时设置调度政策和由 pid 标识的任务的优先级。 如果 pid 等于零,调用任务的调度将被设置。该参数'参数' 根据新保持的任务的优先政策 poicy:参数,调度策略要求(无论是 SCHED_FIFO 或者 SCHED_RR) param:参数,一个结构,其成员 sched_priority 是整数优先 级。有效的优先级号的范围是从 SCHED_GET_PRIORITY_MIN 到 SCHED_GET_PRIORITY_MAX。
9、int sched_getscheduler (pid_t pid) 该功能获取当前任务调度策略,由 pid 标识确定任务。 10、int sched_yield( void ) 该功能该功能强制调用任务放弃 CPU(仅适用于其他任务在同一 优先级情况下) ????????相当于 freeRTOS 下的 taskDleay()阻塞函数。 11、int sched_get_priority_max (int policy) 该功能返回最高可能的任务的优先级的值在指定的调度策略 poicy:参数,调度策略要求(无论是 SCHED_FIFO 或者 SCHED_RR) 12、int sched_get_priority_min (int policy) 该功能返回最低可能的任务的优先级的值在指定的调度策略 poicy:参数,调度策略要求(无论是 SCHED_FIFO 或者 SCHED_RR) 13、int sched_get_rr_interval (pid_t pid, struct timespec *interval) 该功能写由 pid 确定的任务时间片间隔到 timespec 结构间隔指 针指向。如果 pid 为零,时间片调用进程被写入“区间”。 标识的过程应该是在 SCHED_RR 调度策略下运行。
interval:参数,一个结构体,被用来返回时间片。 四、任务切换接口函数 14、int sched_lock( void ) 此功能通过禁用增加了新的禁用上下文切换任务现成的运行任 务列表。调用这个函数的任务将是唯一的任务被允许直到它运行任呼 叫 sched_unlock(适当数量的倍),或直至它的块本身。 15、int sched_unlock( void ) 这个函数递减抢占锁定计数。 通常与 sched_lock 配对()并得出结论代码的临界部。抢占不 会解锁直到 sched_unlock()被调用多次 sched_lock()。当锁定计 数递减到零,即有资格的任务能够抢占当前任务将被执行。 16、int32_t sched_lockcount( void ) 此函数返回 LockCount 的当前值。如果为零,抢占启用;如果非 零,此值指示的次数即 sched_lock()被调用这个任务执行。 五、线程 1、NuttX 不支持 Linux 的一些处理方式。NuttX 仅支持简单线程 或同一个地址空间中运行的任务。在大多数情况下,线程和任务是可 互换的,并且主要不同是在诸如文件描述符的继承。 基本上,线程被初始化和未初始化比任务共享一些更多的资源。
补充:sched policy 1、SCHED_FIFO: 先进先出 调度策略允许一个任务运行直到有更 高优先级的任务准备好,或者直到它自愿阻塞自己(比如调用 pthread_yield 之类的函数)。在该调度策略下,当有一个更高优先 级的任务准备好时,它将立即开始执行。 此外 SCHED_FIFO 是一个非分时的简单调度策略,当一个任务变 成可运行状态,它将被追加到对应优先级队列的尾部((POSIX 1003.1)。当所有高优先级的任务终止或者阻塞时,它将被运行。对 于相同优先级别的任务,按照简单的先进先运行的规则运行。我们考 虑一种很坏的情况,如果有若干相同优先级的任务等待执行,然而最 早执行的任务无终止或者阻塞动作,那么其他任务是无法执行的,除 非当前任务调用如 sched_yield 之类的函数,所以在使用 SCHED_FIFO 的时候要小心处理相同级别任务的动作。(百度百科) 2、SCHED_RR:轮循 调度策略,除了考虑优先级之外,还加入了 时间片的限制。当一个任务执行完了一个时间片,并且有其它的 SCHED_RR 或者 SCHED_FIFO 调度策略的相同优先级的任务准备好时, 运行任务将被准备好的任务抢占。 鉴于 SCHED_FIFO 调度策略的一些缺点,SCHED_RR 对 SCHED_FIFO 做出了一些增强功能。从实质上看,它还是 SCHED_FIFO 调用策略。 它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最
大运行时间的时候,当前任务将被切换并放置于相同优先级队列的最 后。这样做的好处是其他具有相同级别的任务能在“自私“任务下执 行。(百度百科) 3、SCHED_OTHER:是 Linux 默认的分时调度策略。 它是默认的任务分时调度策略,所有的任务的优先级别都是 0, 任务的调度是通过分时来完成的。简单地说,如果系统使用这种调度 策略,程序将无法设置任务的优先级。请注意,这种调度策略也是抢 占式的,当高优先级的任务准备运行的时候,当前任务将被抢占并进 入等待队列。这种调度策略仅仅决定任务在可运行任务队列中的具有 相同优先级的任务的运行次序。(百度百科)
分享到:
收藏