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,
任务的调度是通过分时来完成的。简单地说,如果系统使用这种调度
策略,程序将无法设置任务的优先级。请注意,这种调度策略也是抢
占式的,当高优先级的任务准备运行的时候,当前任务将被抢占并进
入等待队列。这种调度策略仅仅决定任务在可运行任务队列中的具有
相同优先级的任务的运行次序。(百度百科)