工作总结日志<一> 有关实时线程的
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( );
}
}
在申请线程前 需要初始化线程需要的内存 以便在线程初始化后 线程执行函数可以第一时间使用到有意义的全局变量 共享内存变量等
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( );
}
}
在申请线程前 需要初始化线程需要的内存 以便在线程初始化后 线程执行函数可以第一时间使用到有意义的全局变量 共享内存变量等
相关文章推荐
- 工作总结日志<二> 有关PCI的
- jsp和java工作中经验总结<一>
- 工作总结日志<三> 数控系统RTLinux内核上几个系统类型和函数在RTAI内核上的对应
- 【android初学日志】Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverf<一>
- 面面向对象过程总结笔记<一>
- linux查找搜索命令<一>(总结)
- 高性能分布式计算与存储系统设计概要——暨2012年工作3年半总结(上) <转>
- 工作中遇到的一个有关<textarea></textarea>换行的问题
- 关于C++const关键字的一些总结<一>
- Android学习之多线程开发总结<一>
- 实时开发框架Meteor 实际应用系列<一>---文件的上传和下载
- Android学习之 有关图片缓存问提的代码封装<一>
- 实时开发框架Meteor基础入门系列<一>--安装与HelloWorld
- Delphi-IOCP学习笔记<三>====工作线程和Listener
- 实时开发框架Meteor API解读系列<一> Meteor.methods
- linux查找搜索命令<一>(总结)
- DLL封装框架视图经验总结<一>
- 链表<总结一>
- JSON 学习总结 <一>:什么是JSON
- 实时开发框架Meteor 实际应用系列<一>---文件的上传和下载[补充]