pthread_arrt_XXXX:
线程属性相关:
头文件:
#include <rtl_sched.h>
函数定义:
设置/得到cpu相关属性:
int pthread_attr_setcpu_np(pthread_attr_t *attr, int cpu);
int pthread_attr_getcpu_np(pthread_attr_t *attr, int *cpu);
此函数为不可移植的 RTLinux 扩展函数。在存在多个CPU的机器上,可以指定线程在一特定CPU上运行。RTLinux的调度器并不猜测线程与CUP的对应关系。默认情况下,线程在哪个CPU上创建即在哪里运行,但RTLinux还是建议应用程序向调度器指定运行线程的CPU.
pthread_arrt_setcpu_np()函数修改了线程的属性对象,attribute,这样在pthread_create()创建线程时,线程就会被调度到由attr所定的CPU上去执行。在此之前线程属性对象attr必须首先由pthread_attr_init()来进行初始化。
pthread_attr_getcpu_np()函数中,指针cpu将指向attr结构中的CPU id域。
设置/得到浮点运算支持属性:
int pthread_attr_setfp_np(pthread_attr_t *attr, int use_fp);
int pthread_attr_getfp_np(pthread_attr_t *attr, int *use_fp);
此函数为不可移植的 RTLinux 扩展函数。
参数:usr_fp为0代表不允许浮点操作,非零值表示允许浮点操作。
int*use_fp参数指向attr结构中的use_fp标识位。
创建线程:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
这函数是标准posix线程功能的RTLinux版本。
参数:attr指定创建线程的属性,若为NULL则使用默认的属性。start_routine指定线程执行函数。
标准的线程属性设置函数支持包括:
pthread_attr_setshedparam,
pthread_arrt_setdetachstate,
pthread_attr_setstacksize,
pthread_attr_setstackaddr.
另外还有两具线程属性设置函数:
pthread_attr_setcup_np,
pthread_attr_setfp_np.
pthread_attr_setstackaddr()允许用户为线程堆栈分配内存,因此线程可以使用预先分配好的内存来在RT操作模式下被创建。这时,应该使用pthread_join来安全地同步释放包括内存在内的线程资源。
产生周期实时线程:
int pthread_make_periodic_np(pthread_t thread, hrtime_t start_time, hrtime_t period);
此函数为不可移植的RTlinux扩展。
此函数标识线程thread为准备好ready状态。线程将会在start_time时开始执行,并以period作为周期循环执行。
建议配合使用clock_nanosleep()来产生周期线程。
删除实时线程:
int pthread_delete_np(pthread_t thread);
此函数为不可移植的 RTLinux 扩展函数。
等待中止线程:
int pthread_join(pthread_t thread, void **arg);
这一功能是标准POSIX线程功能的RTLinux版。
pthread_join将挂起调用线程,直至目标线程(thread)中止。如果arg为非NULL值,则目标线程的返回值也将是(*arg).如果目标线程己经中止,pthread_join则会立即返回。如果该函数正确执行,那么可以确定目标线程己经中止了。当然,这一调用将会用去多长时间,也是没有上限的。
挂起实时线程的执行:
int pthread_suspend_np(pthread_t thread);
此函数为不可移植的RTLinux扩展。此函数挂起线程,直至pthread_wakeup_np()被调用。
如果目标线程运行于另一处理器,则不保证立即被挂起。
调用pthread_suspend_np(pthread_self())会立即执行。
注意:pthread_suspend_np可在信号或中断处理中调用,但应小心。RTLinux硬信号处理(interrupt handlers)是在被中断所打断的任意的线程中的上下文中运行的。如果当中断处理开始运行时,线程A正在运行,并且在中断处理中调用了pthread_suspend_np函数,则调度器会保存线程A,然后运行其它线程。
如果是在linux的上下文中运行了中断处理,并调用了pthread_suspend_np,则所有linux中的操作和进程都将被停止直到线程被唤醒。
唤醒实时线程:
int pthread_wakeup_np(pthread_t thread);
注意:这一函数可以在中断处理或线程中调用,但不可以用内核中调用。调用这一函数时,如果被唤醒的线程有更高的优先级,则将会引起一个线程的转换。被唤醒的线程将会立即挂起调用pthread_wakeup的线程。当没有更高优先级的线程执行时,才会继续这个处理。
例如,有一个非常简单的中断,但在中断后有非常复杂的处理。可以将这个处理线程指定最高优先级。当中断发生,并执行pthread_wakeup后,将会立即转换线程至处理线程。(应该在调用之前完成重要的硬件处理)
挂起当前线程直至下一周期:
int pthread_wait_np(void);
使用此函数前须调用pthread_make_periodic_np来使线程周期运行。
中止取消线程(不建议使用):
头文件:
#include <rtl_signal.h>
#include <rtl_sched.h>
int pthread_cancel(pthread_t thread);
这个函数是标准的POSIX线程功能,然而也是POSIX线程规范中最薄弱的部分。原因是:
pthread_cancel()将请求中止目标线程,而这中止或者会被不同步地执行,或者会由于目标线程的cancel state而被忽略。如果目标线程处于disabled状态,中止动作将会被挂起,直至线程达到enable状态。如果目标线程处于enabled状态,则其或者处于deferred或是asynchronous模式。deferred模式下将会推迟中止动作直至线程处于一个中止点(对应于线程的睡眠状态)。语法很复杂。
中止动作有一个灾难性的副作用。如果线程正在试图中止,它将使用pthread_cleanup_push()来处理所有进栈的内容。然而,持有互拆信号量的被中止的线程并不被强制清除互斥锁(mutex lock),因此会留下可怕的后果。因此建议不要使用此函数。
得到Linux thread的线程标识符:
pthread_t pthread_linux(void);
向线程发送信号:
#include <rtl_signal.h>
#include <rtl_sched.h>
int pthread_kill(pthread_t thread,signo);
这是标准POSIX线程功能。pthread_kill发送信号signo给线程thread. 如果called on threads与calling on threads 或interrupt handler在同一处理器上运行,则pthread_kill是一个快速的,确定性的功能。
pthread_kill()无论从signal handler或是从thread 或是从Linux kernel code访问,都很安全。
pthread_kill()是向通用操作系统(linux)发送信号的主要方法之一。
调用:pthread_kill(pthread_linux(),RTL_LINUX_MIN_SIGNA+n),n是一个整数值 ,将会在Linux thread(我觉得此处应该是linux系统,即优先级最低的linux系统)中产生n号中断的。
pthread_kill(pthread_linux(),RTL_SIG_SUSPEND_LINUX)将会给在the highest numbered 处理器上的linux thread发送一个中断,这中断将会强制linux来挂起自己并通知硬件来忽略所有的non-RTlinux的中断。
这一功能可以使多处理器系统中的一个处理器专用于RTlinux. 使用RTL_SIG_RESTART_LINUX选项来恢复被挂起的linux threads.
在线程中允许使用浮点操作:
int pthread_setfp_np(pthread_t thread, int flag);
此函数为不可移植的RTLinux扩展。用来在实时线程中允许或禁止使用浮点算术运算。flag为0则不允许浮点操作,flag为非0值则允许。
此函数不适于指定其它cpu上的线程,建议用pthread_arrt_setfp_np.
默认下,RT线程不允许进行浮点操作。