您的位置:首页 > 运维架构 > Linux

工作总结日志<一> 有关实时线程的

2014-06-07 21:10 281 查看
变量

pthread_t  TASK;  实时任务的句柄
pthread_attr_t  attr; 一个线程对象的属性
struct sched_param  sched_param;  用来描述调度参数的结构体

hrtime_t rtperiod;周期 周期线程需要用到
 
 

函数

 pthread_attr_setschedparam (&attr, &sched_param);将调度参数传递给线程对象的属性 如果是实时的FIFO和RR调度 只需要用到sched_param.sched_priority参数 此参数1优先级最高

 pthread_attr_getschedparam 同理 从attr里得到调度参数
 pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);申请一个线程 实时内核里 申请的线程为实时线程 具体看系统API接口 

 pthread_setfp_np ( )设置浮点计算标志
 pthread_make_periodic_np ( )如果为实时线程 设置线程的周期 个人理解周期线程执行的概念为 以设定的周期为该周期线程分配CPU

 
 

一个具体实时周期线程功能的一般C写法

pthread_attr_init (&attr);//首先初始化一个线程对象属性 attr需定义

sched_param.sched_priority = 1;//将线程调度参数结构体中的调度极性设置为1 也可以为2或其他数 一般实时  任务的优先级要求很高

pthread_attr_setschedparam (&attr, &sched_param);//然后将设置好的调度参数传给线程对象的属性变量

attr.use_fp = 1;1代表可以在线程中使用浮点计算 前提是内核需支持

attr.stack_size = EMCMOT_TASK_STACK_SIZE;线程使用的堆栈大小 如果太小 线程初始化会失败 具体大小看实际情况

然后调用 pthread_create()函数 其中线程执行函数必须定义为 void* XXXX(void *)

然后执行  pthread_make_periodic_np(emcmotTask, gethrtime() + rtperiod, rtperiod);该函数让上面创建的线程周期执行 参数1 线程句柄 参数2 第一次周期执行的起始时间 参数3 周期 参数2为获得当前CPU时钟加上一个周期为第一次启动周期线程时间 也可以根据情况具体设置

线程的周期执行函数void* XXXX(void *)的写法

周期线程的基本含义是周期执行 也就是说一直需要执行 永远执行不完 所以线程执行函数必须为死循环

while(1)和for(;;)是两种实现方式 个人使用后一种方式 内核周期线程倾向使用for(;;) 用户空间周期进程倾向使用while(1) 原因不太清楚 个人感觉无所谓

在一次周期循环结束,也就是for循环的最后 用挂起函数将线程挂起 意思是说一次周期执行完毕 让出CPU 等待下一个周期再次得到CPU

void * XXXX(void *)

{

for(;;){

          .....................

          .....................

          pthread_wait_np( );

          }

}

在申请线程前 需要初始化线程需要的内存 以便在线程初始化后 线程执行函数可以第一时间使用到有意义的全局变量 共享内存变量等

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息