
orocos
风竹夜
github: https://github.com/fengzhuye
开源软件, github,c/c++, linux,orocos,ros,ethercat,canopen, matlab etc.
展开
-
orocos Logger 类的设计
单例模式: 通过 local static 创建全局对象(非local static 可能带来的初始化问题)通过#ifdef, #ifndef, #if defined,等条件编译来选择其中一个实现(std::cerr, printf, file)通过环境变量来设置某些默认值if ( getenv( "ORO_LOGLEVEL" ) != 0 ){...}使用嵌套类来管理内部实现 log lev原创 2015-08-17 16:43:02 · 3187 阅读 · 0 评论 -
Lock-Free,无锁数据结构 & 无锁编程 Orocos — Muliti Writer Single Reader Queue
无锁数据结构无锁的数据结构应用越来越广泛,现在几乎所有的多核cpu都提供了 CAS 操作。实现无锁的 Muliti Writer Single Reader Queue 的关键还是 实现指针的 CAS( gcc: __sync_val_compare_and_swap ).这里有一个 Single Writer Mulity Reader 的 无锁实现 see link实现过程:创建一个数组 _bu原创 2016-06-03 15:59:21 · 3726 阅读 · 2 评论 -
c++11 条件变量 std::condition_variable,多线程同步
一般来说,多线程中如果需要等待一个变量或者条件为true 或者同步多个线程,有两种方法:1 . 忙等待,不停地检查该变量是否满足条件while(pre) // polling loop{}该方式有很多缺点:占用cpu资源,变量 pre 必须多线程安全,或者为 atomic 类型。在while中sleep可以解决cpu占用为题,但是在变量满足条件时又不能及时的唤醒该线程。2 . 使用条件变量 st原创 2016-06-29 13:13:24 · 9154 阅读 · 0 评论 -
orocos 类型系统分析
其实代码分析是完整的,需要点耐心才能看完。。。在 orocos 中所有类型的信息是通过一个叫 TypeInfo 的结构体来保存的,每增加一种类型就会 new 一个 TypeInfo 对象来表示该类型的信息:/** * A class for representing a user type, and which can build * instances of that type. Once y原创 2017-05-26 11:28:04 · 1794 阅读 · 3 评论 -
orocos xenomai dlopen 内存权限问题:
前两天遇到一个很头疼个问题,就是需要执行一个类似 JIT 的代码,但是一直出现segFault错误。问题可能存在于: 1.系统cache没有被清空,导致执行的时候读取到了错误的代码。尝试使用以下清空cpu cahce的方法:1. __clear_cache(start, end); // gcc buitin2. __builtin___clear_cache(start, end); //原创 2017-09-26 10:52:53 · 1094 阅读 · 0 评论 -
Orocos OperationCaller 解析
在 Orocos 中 OperatoinCaller 表示一个可以调用其他模块的函数的对象, 如果一个模块添加了一个 Operation,则该 Operation 表示的函数可以被其他模块的 OperationCaller 调用。 在连接 ( connectService ) 调用端(OperationCaller)和被调用端(Operation)之后,该 OperatoinCaller 就能够原创 2016-06-02 11:10:38 · 3805 阅读 · 0 评论 -
orocos 模块的构造 和 析构 顺序
在 deployer-xenomai 中,各个 component 的析构顺序是与构造顺序相反的。原创 2017-02-17 16:23:30 · 688 阅读 · 0 评论 -
Virtual Table — RTTI — typeinfo & dynamic_cast & 模板编程 & orocos OperationCaller 类的设计
dynamic_cast 判断该基类指针到底指向哪一类派生类: dynamic_cast 就是运用 RTTI 来判断该指针所指的对象的 typeinfo (一般位于 virtual table 的第一项 see book: Inside The C++ Object Model) 是否能在指定类的继承树中找到匹配的,如果找不到则返回空指针(see link: http://www.stroust原创 2015-09-10 09:23:36 · 3502 阅读 · 0 评论 -
Orocos ExecutionEngine 对函数Operation调用的实现
在 Orocos 中每一个 ExecutionEngine 可以属于一个线程,其拥有一个成员变量,指向 Activity 类(表示一个线程)。 该 ExecutionEngine 负责函数的调用,数据的传输等等(如下图所示) 其中每一个 ExecutionEngine 中都有一个无锁的队列 MWSRQueue 类 see linkinternal::MWSRQueue<base::Dispos原创 2016-06-03 11:04:24 · 3646 阅读 · 0 评论 -
Orocos Activity&ExecutionEngine 解析
Orocos 每一个TaskContext 类表示一个完整的模块,该模块有configure,start,stop,clean,setPeriod等等方法来控制这个模块的运行。如果使用了该模块的setActivity方法,将该模块放在一个单独的线程中运行,该模块内便独立于其他模块,根据自己的周期频率执行各个函数,读写dataport等。setActivity 方法如下:bool TaskContex原创 2016-06-01 13:47:20 · 3415 阅读 · 0 评论 -
orocos 的数据表示(模板template): DataObject (还有一条主线为 DataSource)
数据有不同的type(int,double,struct…),还有 c-v qualifier, 还可以是 reference、pointer、array等等。因此,在处理数据的时候要正确区分每一种数据类型的处理方法。例如——不能对引用再取引用,不能对右值取引用等等:typedef typename boost::remove_const<typename boost::remove_referen原创 2015-12-07 15:14:23 · 3190 阅读 · 0 评论 -
Orocos DataPort 解析: orocos lock free data object
Orocos有两种 dataPort (Input, Output),在 conncet(Output, Input) 之后,往 Output 中写的数据能够传递到 Input 中并读取, 一个OutputPort可以连接多个InputPort(类似于ROS中的Pub&Sub),这极大地提高了模块化设计的数据交换。 其中能够实现数据交换的关键是 ChannelDataElement 数据结构,在原创 2016-05-06 10:31:40 · 3897 阅读 · 0 评论