- 博客(1515)
- 资源 (33)
- 收藏
- 关注
原创 百度自动驾驶apollo源码解读22:/cyber/node模块和/cyber/service模块
为什么要同时解读两个模块?因为:原作者把service单独领出来做了个模块,个人感觉没必要,此部分逻辑放在node模块之下更贴切。本篇文章做了统一解读。
2023-06-08 15:16:49
1303
原创 百度自动驾驶apollo源码解读21:/cyber/component 模块
成员属性有四个is_shutdown_、node_、config_file_path_、readers_,前三个都好理解的,其中的node_成员要说一下,所有Component都自带了Node成员指针,无需自己新建一个,一个Component对应一个Node对于最后一个成员readers_,不是很好理解,既然有了reader列表那是不是writer也安排一下?TimerComponent类是一个普通类,他默认提供了一个定时器的功能,就是可以在配置文件里面写一下多长时间回调一次Proc()。
2023-05-31 15:25:00
704
原创 百度自动驾驶apollo源码解读20:/cyber/mainboard 模块
该模块主要包含3部分:进程主函数、ModuleArgument类、ModuleController类。
2023-05-30 10:58:37
627
原创 百度自动驾驶apollo源码解读19:/cyber/class_loader 模块
简单来讲这个模块是干什么用的:大型系统一般不是由单个可执行程序代码组成的,而是夹杂了很多动态库,linux下的就是so文件,如何把这些so里面的类导出来,可执行程序如何动态的加载他们,比如一共写了6个so,只想动态的加载其中3个,运行过程中甚至想卸载掉其中的几个用以释放相关的资源,这个模块就是干这个工作的。
2023-05-29 17:31:52
491
原创 百度自动驾驶apollo源码解读18:cyber通讯系统
这些通讯方式是不是仍有优化点?我们现在清晰的知道,第三种通讯方式当数据量大的时候是非常不太稳定,是不是设计有问题呢,或者说fastrtps库已经到达了极限,看清楚源代码有助于解决这些问题。今天开始研究cyber的通讯模块,这个东西网上分析和解说有一大堆,想要自己真正理解还是要读懂源代码,通讯模块是最复杂的模块吧。以下模块都是通讯模块的一员,其实有了前面的基础,这些代码难倒不是很难,就是体量大,需要梳理和总结。
2023-05-09 14:48:38
612
2
原创 百度自动驾驶apollo源码解读17:/cyber/python 模块
我们从上述pyton写的talker说起,分析来分析去,最后的结果就是格式为proto的ChatterBenchmark数据最后被当做message::PyMessageWrap类型写出去了,或者更确切的说是ChatterBenchmark先调用了SerializeToString(), 这个字符串作为PyMessageWrap的成员data_,最后将PyMessageWrap发布到了cyber里面,怪不得叫做Wrap就是再给包裹一层,这么做的意义是什么呢?系统要安装基本的编译库,和python开发库。
2023-04-27 15:49:03
769
1
原创 百度自动驾驶apollo源码解读16:/cyber/message 模块
google::protobuf::Message,并且会自带很多接口函数,比如查询、设置字段值的,查询设置整体proto属性值的,比如SetTypeName、ByteSizeLong等,有静态函数,也有成员函数,还有序列化、反序列化的。消息头,序列化的时候将次头放在protobuf形成的内存前面,主要记录一些属性值,比如消息序列号、消息体的大小等,message_traits里面有两个接口ParseFromHC和SerializeToHC。于实现不同的消息种类,最后给外面呈现的统一接口名字。
2023-04-26 13:59:02
781
1
原创 百度自动驾驶apollo源码解读14:接口存在判定宏DEFINE_TYPE_TRAIT
首先是有一个模板类(使用的是struct),有一个模板参数T,它里面有一个成员变量value类型为bool,和两个成员重载模板函数Test,然后value的值是通过调用Test函数获取到的,具体调用那个函数呢?按照编译规则(个人猜测)应该首先尝试调用Test(decltype(&Class::func)*),如果调用了此函数,就会返回true,如果没有调用此函数就调用后补函数Test(...),返回false,为什么叫他后补函数呢,因为他的参数很特殊,三个点,可传递任意参数,当然意味着他的优先级比较低。
2023-04-24 17:36:29
249
原创 百度自动驾驶apollo源码解读12:线程池
在激光雷达里面看到了一个线程池的代码,默认项目里面没有,是激光雷达厂商提供的吧。仅用一个头文件去实现,此处贴出来源码吧。utility.cpp实现文件。utility.h头文件。写一个简单的测试例子。
2023-03-16 14:18:26
1598
4
原创 百度自动驾驶apollo源码解读11:无锁哈希表AtomicHashMap
直接上源代码吧,代码是阿波罗团队写的源代码,我这边给加了注释。简单写了个main.cpp对一些功能进行测试。
2023-03-10 13:15:46
618
1
原创 linux下给CPU增加指定百分比的压力
一台计算机会因为当前CPU的占率不同情况表现出不同的稳定性和实时性以及其他性能情况。需要编写一个程序将一个CPU或者多个CPU占用到指定值的占用率,比如50%。很多工具都是直接一颗CPU占满,意义不大。故此特地写一个代码。
2023-01-27 15:09:12
1328
1
原创 百度自动驾驶apollo源码解读10:信号槽机制
大家都知道Qt的信号槽机制给编程带来了极大的便利,阿波罗通讯主要通过同一channel的读写,简而言之就是发布订阅模型,这个时候信号槽的机制就显得极为实用,阿波罗在cyber基础类库里面用C++模板类自己写了一套信号槽机制,值的学习。1.和qt的信号槽差不多,不处理返回值,即发送信号函数没有返回值,槽函数执行不处理返回值2.信号、槽、连接都封装成了类3.推荐信号和槽参数一致4.主要用到地方:底层通信机制来看看怎么使用...
2022-07-08 16:32:09
737
原创 百度自动驾驶apollo源码解读9:无锁有界队列BoundedQueue
在此贴出来apollo源代码,本篇只是源码解读,想要看此文件依赖的相关文件可访问:https://github.com/ApolloAuto/apollo/tree/master/cyber/base1.整个类是个数组,指定大小的数组,意味着数据是连续存储的。2.Init的时候会申请好相关的内存,大小为(N+2)*单个大小,为什么是n+2?想不通3.数据的存储如下图所示 队列大小是固定的,超过指定数量再进行加入会失败。数据是循环往复利用的,感觉上就是环形内存池4.之所以是无锁队列是因为底层有原子操作5
2022-07-07 13:53:06
856
原创 百度自动驾驶apollo源码解读8:/cyber/sysmo 模块
SysMo是一个用DECLARE_SINGLETON宏实现的单例类,在公开函数cyber::Init里面执行了SysMo::Instance进行实例化,SysMo构造函数执行了自己的Start函数,检测环境变量sysmo_start的值是否为1,若为1则开启一个线程不停的调用scheduler::Instance()->CheckSchedStatus,调用间隔为100毫秒,上述CheckSchedStatus函数执行逻辑是遍历所有执行器的快照状态,是否为空闲,若在干活则输出干了多长时间了以及协程的名字,线
2022-07-01 13:05:15
644
原创 百度自动驾驶apollo源码解读7:/cyber/scheduler 模块
cyber提供的三大功能:调度功能、通讯功能、组件。其中调度功能最核心的逻辑在/cyber/scheduler下面,本篇文章主要自己对该模块的研读和理解,可能会有错误,看到的朋友帮忙点播一下。首先看下牵涉到协程的一些基本概念图谱,对协程有些基本的概念和了解 再次看下阿波罗设计的协程-调度系统类关系图谱,这个理解这个图谱会对阅读源代码有所帮助,推荐边看源代码边看图谱 里面有两大调度方案:classic(经典)和choreography(编排),图谱如下 进入正文cyber主要提供了两种协程的调度方案class
2022-06-24 16:11:28
2664
原创 百度自动驾驶apollo源码解读6:/cyber/croutine 模块
本篇解读一下/cyber/croutine模块,该模块文件比较少,detail文件夹,CRoutine类,RoutineFactory模板类1.detail文件夹主要实现类似linux下的ucontext_t结构和其四个关联函数getcontext、setcontext、makecontext、swapcontext.实现堆栈的创建保存和切换,为什么不使用linux自带api而是要自己用汇编实现呢?有博主文章说linux那一套api最终要牵扯到系统内核里面,cyber自己实现这一套完全是应用层的,可以进一
2022-06-17 16:45:57
1079
2
原创 百度自动驾驶apollo源码解读5:cyber的Service踩坑笔记
1.坑描述:不用临时变量接收函数node->CreateService返回值导致服务创建失败2.前戏:cyber作为ROS的替代品提供了主要两大功能:调度功能和通讯功能.通讯功能包括订阅发布模式和一问一答的Service模式.本篇主要讲的是Service模式下的一个坑.Service的主要实现代码在/cyber/service下面,仅4个文件(两个头文件两个实现文件).可谓相当的精巧.怎么使用呢?源代码里面/cyber/examples/service.cc.50多行代码展示了如何使用他的Service功能
2022-06-08 16:15:26
872
2
原创 百度自动驾驶apollo源码解读4:/cyber/task 模块
在这里就不贴源代码,太占空间了,源码连接:https://github.com/ApolloAuto/apollo/tree/master/cyber/taskcyber下面的task包是使用cyber协程的入口包,共有5个文件如下:BUILD文件:构建文件task_manager.h文件:任务管理头文件task_manager.cc文件:任务管理主文件task_test.cc文件:任务管理测试文件task.h文件对task_manager封装使用的文件构建文件和测试文件不再赘述,和其他包类似,比
2022-06-01 13:43:58
1300
原创 百度自动驾驶apollo源码解读3:进程或线程设置调度策略、优先级
1.利用setpriority调整“进程”优先级,测试优先级对进程的影响(注:是进程而不是线程)定义函数 int setpriority(int which,int who, int prio);参数1 : PRIO_PROCESS who为进程识别码 PRIO_PGRP who 为进程的组识别码 PRIO_USER who为用户识别码参数2 :参数3 :prio介于-20至20之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)
2022-05-27 14:22:21
1508
原创 百度自动驾驶apollo源码解读2:进程或线程绑定指定CPU
1.简介CPU绑定指的是在多CPU的系统中将进程或线程绑定到指定的CPU核上去执行。在Linux中,我们可以利用CPU affinity属性把进程绑定到一个或多个CPU核上。CPU Affinity是进程的一个属性,这个属性指明了进程调度器能够把这个进程调度到哪些CPU上。 该属性要求进程在某个指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器。CPU Affinity分为2种:soft affinity和hard affinity。soft affinity只是一个建议,如果不可避免,调
2022-05-20 17:26:59
1121
原创 百度自动驾驶apollo源码解读1:std::atomic实现读写锁
直接上源代码吧,代码是阿波罗团队写的源代码,我这边给加了注释/*1.有一说一这个读写锁的设计还是很牛逼的,以我自己感觉atomic和读写完全不相干的东西竟然可以用前者实现后者2.这个设计理念是不是百度阿波罗团队自创的呢?好像不是,这有个连接,设计理念很相似,15年的博客: https://blog.csdn.net/10km/article/details/49641691*/#ifndef CYBER_BASE_ATOMIC_RW_LOCK_H_#define CYBER_BASE_
2022-05-12 15:39:27
1890
原创 38.借用与引用
/*1.rust中借用和引用的附带功效都一样,就是都有生命周期。借用使用&关键字,引用使用ref关键字。借用的对象是必须存在的,引用的对象可以虚拟的,后期附上对象。2.match的模式匹配上只能使用 ref,在函数声明上只能使用&来表示引用类型3.非要给区分ref和&到底哪个是引用,哪个是借用。我们可以先从词性划分,引用我归类为名词,而借用归类为动词。&A在表达式上 表示借用A,这是一个动作,那结果就是产出一个引用类型。所以let ref B表示声明了一个引用类型,它.
2021-03-12 11:05:42
1108
原创 37.rust属性.txt
=====================================================================================================================================元素 在Rust中,Item是Crate(库)的一个组成部分。它包括 extern crate声明 use声明 模块(模块是一个Item的容器) 函数 type定义 结构体定义 枚举类型定义 常量定义 静.
2021-03-09 12:53:36
393
原创 36.rustc编译参数.txt
/* --cfg SPEC - 传入自定义的条件编译参数,使用方法如:rustc --cfg hello main.rs--crate-type - 指定编译输出类型,它的参数包括 rustc --crate-type staticlib myhello.rs 链接库生成.a的链接库 bin - 二进行可执行文件 -> bin或者lib二选一 lib - 编译为库 -> rlib - Rust库 .
2021-03-09 12:53:02
931
原创 35.cargo配置参数.txt
######################################################################## 详细教程地址:https://learnku.com/docs/cargo-book/2018/# https://www.jianshu.com/p/22a467204def?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_so.
2021-03-09 12:52:05
1137
原创 34.rust宏.txt
/*更多请看:http://blog.hubwiz.com/2020/01/30/rust-macro/https://github.com/rooat/RustLearn/blob/master/src/appendix-04-macros.mdhttps://rustcc.gitbooks.io/rustprimer/content/macro/macro.htmlhttps://rust-by-example.budshome.com/macros.html定义:Rust宏让你可以发.
2021-03-09 12:51:34
423
原创 33.文件与 IO.rs
use std::fs;use std::fs::File;use std::fs::OpenOptions;use std::io::prelude::*;use std::io::stdin;fn main() { //Rust 中主函数是个无参函数,环境参数需要开发者通过 std::env 模块取出 let args = std::env::args(); println!("{:?}", args); for arg in args { .
2021-03-09 12:50:40
277
原创 32.生命周期注释.rs
/*更多文章参考:https://github.com/rooat/RustLearn/blob/master/src/ch10-03-lifetime-syntax.mdhttps://github.com/rooat/RustLearn/blob/master/src/ch19-02-advanced-lifetimes.md*///返回的是新生成的String,有自己的生命周期,如果使用&str的话生命周期跟随他人fn longer1(s1: String, s2: String.
2021-03-09 12:49:55
730
原创 31.错误处理.rs
/*程序中一般会出现两种错误:可恢复错误和不可恢复错误可恢复错误:可恢复错误的典型案例是文件访问错误,如果访问一个文件失败,有可能是因为它正在被占用,是正常的,我们可以通过等待来解决不可恢复错误:由编程中无法解决的逻辑错误导致的,例如访问数组末尾以外的位置对于可恢复错误用 Result<T, E> 类来处理,对于不可恢复错误使用 panic! 宏来处理。enum Result<T, E> { Ok(T), Err(E),}在 Rust 标准库中可能产生.
2021-03-09 12:48:57
256
原创 30.并发.rs
/*安全高效的处理并发是 Rust 诞生的目的之一,主要解决的是服务器高负载承受能力。并发(concurrent)的概念是只程序不同的部分独立执行,这与并行(parallel)的概念容易混淆,并行强调的是"同时执行"。Rust 中通过 std::thread::spawn 函数创建新线程.*/use std::sync::mpsc;use std::thread;use std::time::Duration;fn spawn_function() { for i in 0..
2021-03-09 12:48:19
218
原创 29.rust类型转换.rs
/*1.基本类型可以通过显示类型转换机制(as)来实现相互之间的转换。2.Rust通过使用trait来处理定制类型(enum、struct)之间的类型转换。3.通用的类型转换一般使用的trait为From和To。Rust孤儿原则:在声明trait和impl trait的时候,Rust规定了一个Orphan Rule(孤儿规则):impl块要么与trait的声明在同一个的crate中,要么与类型的声明在同一个crate中。也就是说,不能在一个crate中,针对一个外部的类型,实现一个外部的tr.
2021-03-09 12:47:16
1144
原创 28.特性trait.rs
/*特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同。特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法trait Descriptive { fn describe(&self) -> String;}Descriptive 规定了实现者必须有是 describe(&self) -> String 方法。(必须实现所有方法)几个非常有用的标准库特性: Drop提供了当一个值退出作用域后执行代.
2021-03-08 12:43:54
232
原创 27.泛型generics.rs
/*fn max(array: &[i32]) -> i32 { let mut max_index = 0; let mut i = 1; while i < array.len() { if array[i] > array[max_index] { max_index = i; } i += 1; } array[max_index].
2021-03-08 12:43:19
186
1
原创 26.PhantomData幽灵数据.rs
/*它在标准库中的定义如下:#[lang = "phantom_data"]#[stable(feature = "rust1", since = "1.0.0")]pub struct PhantomData<T: ?Sized>;可以到它只是一个不占用任何空间的单元结构体,#[lang = "phantom_data"], 也表明了它是一个语言项,供 Rust 编译器本身使用。https://blog.csdn.net/wowotuo/article/details/931.
2021-03-08 12:42:42
626
原创 25.智能指针.rs
/*参考文章:https://zhuanlan.zhihu.com/p/112307245https://rustcc.cn/article?id=76e5f3fb-20b9-48c9-8fc6-a0aad40ced8chttps://www.codercto.com/a/27950.htmlhttps://www.twle.cn/c/yufei/rust/rust-basic-smart-pointers.htmlhttps://www.cnblogs.com/dream397/p/1418.
2021-03-08 12:42:05
185
原创 24.内存操作Copy-Move-Clone.rs
/*详细请看:https://zhuanlan.zhihu.com/p/21730929https://zhuanlan.zhihu.com/p/184907190Clone VS Copy VS Move首先看一下这个两个trait的关系:pub trait Sized { // Empty.}pub trait Clone: Sized { fn clone(&self) -> Self; fn clone_from(&mut self,.
2021-03-08 12:41:28
390
原创 23.所有权.rs
/* 所有权1.Rust 中的每个值都有一个变量,称为其所有者。2.一次只能有一个所有者。3.当所有者不在程序运行范围时,该值将被删除。变量与数据交互方式主要有移动(Move)和克隆(Clone)两种。可以引用租借*/fn main() { { // 在声明以前,变量 s 无效 let _s = "runoob"; // 这里是变量 s 的可用范围 } // 变量范围已经结束,变量 s 无效 test1.
2021-03-08 12:40:49
222
SSDTHook实现进程保护
2017-06-09
SkinSharp开发库+百款皮肤+皮肤编辑器
2017-05-24
minhook-1.3.2
2017-05-09
python2.7.8 32
2016-05-25
AStar 算法实例
2015-07-18
Visual Assist X补丁
2015-06-18
cmake-3.14.3-win64-x64.zip
2019-09-05
跨平台高性能TCP服务器框架 &boost;
2018-06-25
网狐IOCP压缩版
2018-06-22
用C++实现的壳
2017-09-14
像加载DLL一样加载EXE
2017-09-10
protobuf-2.61最新版
2017-08-28
Gh0stVC6到VS2010迁移所有问题的解决方法
2017-08-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人