20211111 update
This commit is contained in:
parent
2dfd219d7c
commit
0e0d7eff50
|
@ -44,6 +44,8 @@ word$ # 行尾匹配
|
|||
\b # 单词边缘的空字符串
|
||||
\w # 相当于[:alnum:]
|
||||
\W # 相当于[^_[:alnum:]]
|
||||
\n # 在vim里搜索的时候代表换行,在vim替换的时候代表0x00
|
||||
\r # 在vim里搜索的时候代表CR,在vim里替换的时候代表换行
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
```c
|
||||
// 作用:创建连接的端点
|
||||
// 返回值:一个指向网络插座的文件描述符
|
||||
// domain:定义连接域,即协议族。
|
||||
// AF_INET - IPv4协议
|
||||
// type:网络插座的类型,也叫通信语义。
|
||||
// SOCK_STREAM - 提供顺序的、可靠的、双向的、基于连接的字节流。
|
||||
// SOCK_DGRAM - 支持数据报(无连接的,不可靠的,消息有最大长度)。
|
||||
// protocol:指定网络插座要用的协议。通常一个网络插座的类型对应唯一的协议,此时此参数可指定为0;但若存在对应多个协议的情况,此时必须指定协议号。
|
||||
int socket(int domain, int type, int protocol);
|
||||
```
|
||||
|
||||
结构体
|
||||
|
||||
```c
|
||||
/* 网络插座的地址 */
|
||||
struct sockaddr {
|
||||
__SOCKADDR_COMMON (sa_); /* 通用数据: 地址族和长度 */
|
||||
// 注,上一行展开后是:unsigned short int sa_family;
|
||||
char sa_data[14]; /* 地址数据,包含了端口号和地址 */
|
||||
};
|
||||
|
||||
/* Internet网络插座的地址 */
|
||||
struct sockaddr_in {
|
||||
__SOCKADDR_COMMON (sin_);
|
||||
// 注,上一行展开后是:unsigned short int sin_family;
|
||||
in_port_t sin_port; /* 端口号 */
|
||||
// 注,in_port_t即uint16_t
|
||||
// 注,可以使用htons()把端口号由主机字节序转换为网络字节序
|
||||
struct in_addr sin_addr; /* 地址 */
|
||||
// 注,inet_addr()可以把IP地址的点分十进制形式转换为网络字节序
|
||||
// 注,htonl()可以把IP地址由主机字节序转换为网络字节序
|
||||
/* sin_zero是为了和`struct sockaddr'对齐,仅占位不使用 */
|
||||
unsigned char sin_zero[sizeof (struct sockaddr)
|
||||
- __SOCKADDR_COMMON_SIZE
|
||||
- sizeof (in_port_t)
|
||||
- sizeof (struct in_addr)];
|
||||
};
|
||||
// 关于struct in_addr的定义
|
||||
typedef uint32_t in_addr_t;
|
||||
struct in_addr {
|
||||
in_addr_t s_addr;
|
||||
};
|
||||
```
|
||||
|
|
@ -45,10 +45,17 @@ $ # 变量参数
|
|||
{} # 在子shell执行括号内的一组命令
|
||||
[...] # 匹配括号内的任意一个字符
|
||||
[!...] # 不包含括号内的所有字符
|
||||
> # 输出重定向
|
||||
> # 标准输出重定向
|
||||
cmd 2> file # 把标准错误重定向到file
|
||||
2>&1 # 把标准错误和标准输出都作为标准输出,然后重定向。其实现原理是把标准输出的文件描述符复制给标准错误。
|
||||
>> # 标准输出追加
|
||||
cmd 2>> file # 把标准错误追加到file
|
||||
# cmd >> file 2>&1,把标准输出和标准错误都追加到file里,等同于cmd &>> file
|
||||
< # 输入重定向
|
||||
>> # 追加
|
||||
# cat < abc.txt 意思就是把abc.txt作为cat命令的输入
|
||||
命令 << 分界符 # 从标准输入设备读入,直到分界符才停止
|
||||
# cat << 0 意思是从键盘(标准输入)输入字符到cat命令,直到0才停止
|
||||
cmd < file1 > file2 # file1的内容作为cmd命令的输入,cmd命令的输出放在file2里。
|
||||
|
||||
# shell可识别4种引字符号:
|
||||
' # 单引号。两个单引号之间的特殊字符均被识别为普通字符。
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
> 系统:Ubuntu 18.04.6
|
||||
>
|
||||
> 内核版本:5.4.0-87-generic
|
||||
|
||||
#### 1 下载内核与补丁
|
||||
|
||||
```
|
||||
# 内核下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/
|
||||
# 补丁下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
|
||||
# 通过与本地内核版本对比,最接近的应该是5.4.154,故下载此版本的内核与补丁
|
||||
mkdir rt_kernel && cd rt_kernel
|
||||
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.154.tar.xz
|
||||
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.154-rt65.patch.xz
|
||||
tar xf linux-5.4.154.tar.xz
|
||||
cd linux-5.4.154
|
||||
xzcat ../patch-5.4.154-rt65.patch.xz | patch -p1
|
||||
```
|
||||
|
||||
#### 2 配置内核
|
||||
|
||||
```
|
||||
cp /boot/config-5.4.0-87-generic linux-5.4.154/.config
|
||||
sudo apt install libncurses-dev bison flex bc libelf-dev libssl-dev
|
||||
make oldconfig # 选Fully Preemptible Kernel (RT)
|
||||
```
|
||||
|
||||
#### 3 编译内核
|
||||
|
||||
```
|
||||
vim .config # 可注释掉CONFIG_DEBUG_INFO,以减少内核大小
|
||||
make -j4 deb-pkg # 我的CPU是4核,故选-j4
|
||||
```
|
||||
|
||||
##### 错误解决
|
||||
|
||||
```
|
||||
##### 错误1
|
||||
# 错误描述:No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'
|
||||
# 解决方法:编辑.config,将CONFIG_SYSTEM_TRUSTED_KEYS置为空。
|
||||
```
|
||||
|
||||
#### 4 安装deb包
|
||||
|
||||
```
|
||||
sudo dpkg -i ../*.deb
|
||||
```
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#### boot
|
||||
|
||||
kernel/arch/x64/boot.S
|
||||
|
||||
#### bsp_early_init
|
||||
|
||||
kernel/arch/x64/boot.rs
|
||||
|
||||
#### boot_kernel
|
||||
|
||||
kernel/arch/x64/boot.rs
|
|
@ -1,27 +1,26 @@
|
|||
#### 1
|
||||
#### 编译过程
|
||||
|
||||
`make rv64-image`
|
||||
```bash
|
||||
make rv64-image # 从Makefile可见,是使用rcore-fs-fuse命令创建文件系统riscv64.img,文件系统的内容来自于rootfs目录。
|
||||
cd zCore && make build linux=1 arch=riscv64 # 从Makefile可见,最终执行的是cargo build $(build_args)
|
||||
# $(build_args)默认自带-Z build-std=core,alloc --target $(arch).json,还会附加其它参数,这是由make build的参数引入的,比如linux=1会引入--features linux,比如arch=riscv64且没有指定board的值会引入--features board_qemu等
|
||||
# $(arch).json指定了链接脚本,对于riscv64它是linker64.ld,对于x86_64它是linker.ld,在链接脚本里指定内核入口点为_start
|
||||
```
|
||||
|
||||
使用`rcore-fs-fuse`命令创建文件系统riscv64.img,文件系统的内容来自于rootfs目录。
|
||||
#### 执行过程
|
||||
|
||||
#### 2
|
||||
##### _start
|
||||
|
||||
`make run linux=1 arch=riscv64`
|
||||
对于riscv64,入口点`_start`定义在`entry64.asm`,通过`global_asm!`把这段汇编代码嵌入到`main.rs`。从`_start`开始先设置`satp`寄存器以映射虚拟地址,然后在虚拟空间里设置`sp`寄存器,跳转到`rust_main`。(`rust_main`仅有一个,是针对riscv64平台的)
|
||||
|
||||
依赖于`build`和`justrun`。`build`先执行了`kernel`,后执行了`kernel_bin`。
|
||||
对于x86_64,入口点`_start`定义在`main.rs`,它最后跳转到`main`。(`main`有两个,是针对linux和zircon两种情况)
|
||||
|
||||
`build`的参数有:`-Z build-std=core,alloc --target $(arch).json`,这是默认自带的;`--features linux`,这是`linux=1`引入的。
|
||||
##### rust_main
|
||||
|
||||
`arch=riscv64`则规定了`build_args, build_path, qemu, OBJDUMP, OBJCOPY, ARCH, qemu_opts`。
|
||||
`rust_main`仅针对riscv64平台,位置在`main.rs`。它的两个参数是来自于opensbi,由`fw_platform_init`函数设置`a0,a1`两个寄存器得到的。
|
||||
|
||||
#### 3
|
||||
`rust_main`初始化日志系统,可以打印字符。初始化内存,重新映射内核。然后跳转到`main`开始执行。(`main`有两个,是针对linux和zircon两种情况)
|
||||
|
||||
`build`的参数`rsicv.json`里指定了链接的方式,即`lnker64.ld`。它说入口点为`_start`。
|
||||
##### main
|
||||
|
||||
#### 4
|
||||
|
||||
对于riscv64,入口点`_start`在`entry64.asm`。它设置`satp`寄存器以映射虚拟地址,然后在虚拟空间里设置`sp`寄存器,跳转到`rust_main`。
|
||||
|
||||
#### 5
|
||||
|
||||
`rust_main`在`main.rs`。初始化日志系统,可以打印字符。初始化内存,重新映射内核。然后跳转到`main`开始执行。
|
||||
`main`最后执行`run`函数开始调度用户态进程。
|
|
@ -54,3 +54,14 @@ git submodule update # 更新子模块
|
|||
|
||||
```
|
||||
|
||||
#### 错误解决
|
||||
|
||||
1. could not get a repository handle for submodule 'rboot'
|
||||
|
||||
```
|
||||
# git submodule update出错此错误提示,删除了rboot目录下的.git文件即可,原因未知。
|
||||
# 曾尝试过git submodule deinit,无效
|
||||
# 曾尝试过rm -rf .git/modules/rboot,无效
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
是catkin仓库下,bin目录下的一个python脚本。
|
||||
|
||||
执行步骤:
|
||||
|
||||
1. 在安装catkin或覆盖之前catkin版本的时候,找到相关的可导入的模块。
|
||||
2. 通过`if __name__ == '__main__'`执行main函数
|
||||
3. 使用`parse_args()`函数解析传入的参数
|
||||
4. `apply_platform_specific_defaults()`来自于catkin包的builder模块,用于为win32平台添加特定的参数
|
||||
5. `handle_cmake_args()`函数,如果定义了参数列表里的cmake参数`XXX_PREFIX`,则转化为其它参数
|
||||
6. 设置参数列表里的`no_color`参数。
|
||||
7. 解析参数列表,给相关变量赋值。
|
||||
8. 使用相关的变量,执行`build_workspace_isolated()`函数。这个函数也来自于`catkin.builder`,它通过cmake和make命令执行构建的过程。
|
||||
|
|
@ -0,0 +1,256 @@
|
|||
#### 编译安装
|
||||
|
||||
##### 准备
|
||||
|
||||
```
|
||||
# 1 安装bootstrap工具
|
||||
sudo apt-get install python3-rosdep2 python3-rosinstall-generator python3-vcstool python3-rosinstall build-essential
|
||||
pip3 install python3-nose # for test
|
||||
pip3 install vcstool # for cmd : vcs
|
||||
|
||||
rosdep init
|
||||
rosdep update
|
||||
```
|
||||
##### 安装ros_comm
|
||||
|
||||
```bash
|
||||
# 2 安装
|
||||
mkdir -p ros_catkin_ws/src && cd ros_catkin_ws
|
||||
# 选项1:ros_comm,基本库,无GUI
|
||||
rosinstall_generator ros_comm --rosdistro melodic --deps --tar > melodic-ros_comm.rosinstall
|
||||
vcs import src < melodic-ros_comm.rosinstall
|
||||
# 选项2:desktop,建议安装
|
||||
rosinstall_generator desktop --rosdistro melodic --deps --tar > melodic-desktop.rosinstall
|
||||
vcs import src < melodic-desktop.rosinstall
|
||||
# 选项3:desktop_full
|
||||
rosinstall_generator desktop_full --rosdistro melodic --deps --tar > melodic-desktop-full.rosinstall
|
||||
vcs import src < melodic-desktop-full.rosinstall
|
||||
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
|
||||
# 安装依赖
|
||||
```
|
||||
|
||||
> ERROR: the following packages/stacks could not have their rosdep keys resolved
|
||||
> to system dependencies:
|
||||
> rosconsole: No definition of [log4cxx] for OS version []
|
||||
> cpp_common: No definition of [boost] for OS version []
|
||||
> message_filters: No definition of [boost] for OS version []
|
||||
> rostest: No definition of [boost] for OS version []
|
||||
> rosbag_storage: No definition of [libgpgme-dev] for OS version []
|
||||
> class_loader: No definition of [boost] for OS version []
|
||||
> pluginlib: No definition of [boost] for OS version []
|
||||
> catkin: No definition of [python-argparse] for OS version []
|
||||
> xmlrpcpp: No definition of [boost] for OS version []
|
||||
> rostime: No definition of [boost] for OS version []
|
||||
> rosbag: No definition of [boost] for OS version []
|
||||
> rospack: No definition of [boost] for OS version []
|
||||
|
||||
```
|
||||
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
|
||||
```
|
||||
|
||||
> classloader 问题一:
|
||||
>
|
||||
> can not find lpthreads
|
||||
>
|
||||
> 解决方法:apt install libevent-pthreads-2.1-7
|
||||
>
|
||||
> classloader问题二:
|
||||
>
|
||||
> CMake Error at /usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:165 (message):
|
||||
> Could NOT find Boost (missing: Boost_INCLUDE_DIR thread system)
|
||||
> Call Stack (most recent call first):
|
||||
> /usr/share/cmake-3.18/Modules/FindPackageHandleStandardArgs.cmake:458 (_FPHSA_FAILURE_MESSAGE)
|
||||
> /usr/share/cmake-3.18/Modules/FindBoost.cmake:2177 (find_package_handle_standard_args)
|
||||
> CMakeLists.txt:12 (find_package)
|
||||
>
|
||||
> 解决方法:apt install libboost-all-dev
|
||||
>
|
||||
> classloader问题三:
|
||||
>
|
||||
> CMake Error at CMakeLists.txt:19 (find_package):
|
||||
> By not providing "Findconsole_bridge.cmake" in CMAKE_MODULE_PATH this
|
||||
> project has asked CMake to find a package configuration file provided by
|
||||
> "console_bridge", but CMake did not find one.
|
||||
>
|
||||
> 解决方法:apt install libconsole-bridge-dev
|
||||
>
|
||||
> classloader问题四:
|
||||
>
|
||||
> CMake Error at /root/Code/ros_catkin_ws/install_isolated/share/cmake_modules/cmake/Modules/FindPoco.cmake:189 (MESSAGE):
|
||||
> Poco was not found. Set the Poco_INCLUDE_DIR cmake cache entry to the
|
||||
> top-level directory containing the poco include directories. E.g
|
||||
> /usr/local/include/ or c:\poco\include\poco-1.3.2
|
||||
> Call Stack (most recent call first):
|
||||
> CMakeLists.txt:23 (find_package)
|
||||
>
|
||||
> 解决方法:apt install libpoco-dev
|
||||
>
|
||||
> rospack问题五:
|
||||
>
|
||||
> CMake Error at /usr/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
|
||||
>
|
||||
> Could NOT find TinyXML2 (missing: TinyXML2_LIBRARY TinyXML2_INCLUDE_DIR)
|
||||
>
|
||||
> 解决方法:apt install libtinyxml2-dev
|
||||
>
|
||||
> rosconsole问题六:
|
||||
>
|
||||
> CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
|
||||
> Please set them or make sure they are set and tested correctly in the CMake files:
|
||||
> LOG4CXX_LIBRARIES
|
||||
> linked by target "rosconsole-utest" in directory /root/Code/ros_catkin_ws/src/rosconsole
|
||||
> linked by target "rosconsole-thread_test" in directory /root/Code/ros_catkin_ws/src/rosconsole
|
||||
>
|
||||
> 解决方法: apt install liblog4cxx-dev
|
||||
>
|
||||
> roslz4问题七:
|
||||
>
|
||||
> CMake Error at CMakeLists.txt:13 (message):
|
||||
> lz4 includes not found
|
||||
>
|
||||
> 解决方法:apt install liblz4-dev
|
||||
>
|
||||
> roscpp问题八:
|
||||
|
||||
```
|
||||
In file included from /root/Code/ros_catkin_ws/src/ros_comm/roscpp/src/libros/wall_timer.cpp:29:
|
||||
/root/Code/ros_catkin_ws/src/ros_comm/roscpp/include/ros/timer_manager.h: In member function ‘int32_t ros::TimerManager<T, D, E>::add(const D&, const boost::function<void(const E&)>&, ros::CallbackQueueInterface
|
||||
*, const VoidConstPtr&, bool)’:
|
||||
/root/Code/ros_catkin_ws/src/ros_comm/roscpp/include/ros/timer_manager.h:344:70: error: ‘_1’ was not declared in this scope
|
||||
344 | waiting_.sort(boost::bind(&TimerManager::waitingCompare, this, _1, _2));
|
||||
解决方法:在wall_timer.cpp里把_1替换为boost::placeholder::_1,把_2替换为boost::placeholders::_2。
|
||||
原因分析:可能是编译器版本过高,使用_1,_2作为bind占位符的方法已被弃用。请看提示,#pragma message: The practice of declaring the Bind placeholders (_1, _2, ...) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.
|
||||
```
|
||||
|
||||
> rosbag_storage问题九:
|
||||
>
|
||||
> CMake Error at /usr/share/cmake-3.21/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
|
||||
> Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR)
|
||||
>
|
||||
> 解决方法:apt install libbz2-dev
|
||||
>
|
||||
> rosbag_storage问题十:
|
||||
>
|
||||
> Linking CXX shared library /root/Code/ros_catkin_ws/devel_isolated/rosbag_storage/lib/librosbag_storage.so
|
||||
>
|
||||
> /usr/bin/ld: cannot find -lGPGME_LIBRARY-NOTFOUND
|
||||
>
|
||||
> 解决方法:apt install libgpgme-dev libgpgme-dev-dbgsym libcrypto++-dev
|
||||
>
|
||||
> 修改CMakeFiles/rosbag_storage.dir/link.txt,把-lGPGME_LIBRARY-NOTFOUND删掉
|
||||
>
|
||||
> 修改./CMakeFiles/rosbag_default_encryption_plugins.dir/link.txt,把-lGPGME_LIBRARY-NOTFOUND删掉
|
||||
>
|
||||
> 问题分析:-lGPGME_LIBRARY-NOTFOUND太奇怪了,不可能有这样的库吧
|
||||
|
||||
```
|
||||
source install_isolated/setup.bash # 让安装的包生效
|
||||
```
|
||||
|
||||
##### 安装mavros
|
||||
|
||||
```bash
|
||||
# 1 创建工作区
|
||||
mkdir -p mavros_ws/src && cd mavros_ws
|
||||
catkin_init_workspace
|
||||
wstool init src
|
||||
# 2 安装mavlink
|
||||
rosinstall_generator --tar --deps --rosdistro melodic mavlink | tee mavros.rosinstall
|
||||
# 3 安装mavros
|
||||
rosinstall_generator --tar --deps --upstream --rosdistro melodic mavros | tee -a mavros.rosinstall
|
||||
# 4 创建工作区
|
||||
vcs import src < mavros.rosinstall # 如存在下载错误,则手动下载并解压到src目录
|
||||
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
|
||||
# 安装依赖
|
||||
```
|
||||
|
||||
> ERROR: the following packages/stacks could not have their rosdep keys resolved
|
||||
> to system dependencies:
|
||||
> tf2_kdl: No definition of [eigen] for OS version []
|
||||
> xmlrpcpp: No definition of [boost] for OS version []
|
||||
> tf_conversions: No definition of [eigen] for OS version []
|
||||
> rostest: No definition of [boost] for OS version []
|
||||
> diagnostic_aggregator: No definition of [bondpy] for OS [debian]
|
||||
> class_loader: No definition of [boost] for OS version []
|
||||
> ros_comm: No definition of [roslisp] for OS [debian]
|
||||
> libmavconn: No definition of [boost] for OS version []
|
||||
> actionlib: No definition of [boost] for OS version []
|
||||
> tf2_eigen: No definition of [eigen] for OS version []
|
||||
> catkin: No definition of [python-argparse] for OS version []
|
||||
> rospack: No definition of [boost] for OS version []
|
||||
> trajectory_msgs: No definition of [rosbag_migration_rule] for OS [debian]
|
||||
> pluginlib: No definition of [boost] for OS version []
|
||||
> cpp_common: No definition of [boost] for OS version []
|
||||
> orocos_kdl: No definition of [eigen] for OS version []
|
||||
> rostime: No definition of [boost] for OS version []
|
||||
> eigen_conversions: No definition of [eigen] for OS version []
|
||||
> mavros_extras: No definition of [urdf] for OS [debian]
|
||||
> message_filters: No definition of [boost] for OS version []
|
||||
> test_rosbag: No definition of [boost] for OS version []
|
||||
> rosbag: No definition of [boost] for OS version []
|
||||
> tf2_sensor_msgs: No definition of [eigen] for OS version []
|
||||
> rosconsole: No definition of [log4cxx] for OS version []
|
||||
> python_orocos_kdl: No definition of [eigen] for OS version []
|
||||
> test_mavros: No definition of [control_toolbox] for OS [debian]
|
||||
> rosbag_storage: No definition of [libgpgme-dev] for OS version []
|
||||
> mavros: No definition of [boost] for OS version []
|
||||
|
||||
```
|
||||
# 5 安装GeographicLib数据集
|
||||
./src/mavros/mavros/scripts/install_geographiclib_datasets.sh
|
||||
# 6 编译
|
||||
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
|
||||
# catkin问题一:
|
||||
CMake Warning at /usr/share/cmake/GMock/GMockConfig.cmake:68 (message):
|
||||
Could not detect GTest version, Assuming v1.7.0 (or compatible) and hoping for the best
|
||||
CMake Error at /usr/share/cmake-3.21/Modules/ExternalProject.cmake:2866 (message):
|
||||
No download info given for 'GMock' and its source directory:
|
||||
/usr/src/gmock
|
||||
# 解决方法:apt install libgmock-dev libgtest-dev
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 更新
|
||||
|
||||
```
|
||||
mv -i melodic-desktop-full.rosinstall melodic-desktop-full.rosinstall.old
|
||||
rosinstall_generator desktop_full --rosdistro melodic --deps --tar > melodic-desktop-full.rosinstall
|
||||
diff -u melodic-desktop-full.rosinstall melodic-desktop-full.rosinstall.old # 比较差异
|
||||
vcs import src < melodic-desktop-full.rosinstall
|
||||
./src/catkin/bin/catkin_make_isolated --install # 重新构建
|
||||
source install_isolated/setup.bash
|
||||
```
|
||||
|
||||
#### 初级教程
|
||||
|
||||
##### 配置
|
||||
|
||||
```
|
||||
source /opt/ros/noetic/setup.bash
|
||||
mkdir -p catkin_ws/src && cd catkin_ws
|
||||
catkin_make # 在当前目录下创建工作空间
|
||||
source devel/setup.bash # 把当前工作空间设置在环境变量的最顶层
|
||||
echo $ROS_PACKAGE_PATH # 确认上一条source命令生效
|
||||
```
|
||||
|
||||
##### 文件系统工具
|
||||
|
||||
```
|
||||
rospack find roscpp # 查找roscpp包所在路径
|
||||
rospack list # 列出所有已安装的包
|
||||
rospack depends roscpp # 递归检查出roscpp所有的依赖包
|
||||
rospack depends1 roscpp # 递归检查出roscpp的一级依赖
|
||||
roscd roscpp # 切换到roscpp包所在路径
|
||||
roscd log # 如运行过ros程序,则切换到存储ros日志的目录。否则报错。
|
||||
rosls roscpp # 显示roscpp包所在路径下的文件
|
||||
```
|
||||
|
||||
##### 创建ros软件包
|
||||
|
||||
```
|
||||
cd catin_ws/src
|
||||
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp # 创建ros软件包beginner_tutorials,它依赖于std_msgs、roscpp、rospy。
|
||||
# package.xml
|
||||
```
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
```
|
||||
rosinstall_generator [options] --rosdistro <ROSDISTRO> [pkgnames]
|
||||
```
|
||||
|
||||
#### 选项
|
||||
|
||||
```
|
||||
--deps # 对依赖进行递归包含
|
||||
--deps-up-to [DEPS_UP_TO...] #
|
||||
--tar # 使用tarball而不是catkin包(rosbuild栈总是tarball)
|
||||
```
|
||||
|
|
@ -11,13 +11,19 @@ tar {A|c|d|r|t|u|x}[GnSkUWOmpsMBiajJzZhPlRvwo] [ARG...]
|
|||
#### 操作
|
||||
|
||||
```
|
||||
# A:append
|
||||
# c:create
|
||||
# d:differences
|
||||
# r:append
|
||||
# t:list
|
||||
# u:update
|
||||
# x:extract
|
||||
tar {-A|--catenate|--concatenate} [options] <archive> <archive>: 把归档文件添加到其它的归档文件
|
||||
tar {-c|--create} [-f <achive>] [options] [file...] : 创建归档文件
|
||||
tar {-d|--diff|--compare} [-f <achive>] [options] [file...] : 查找归档文件与文件系统的差别
|
||||
tar --delete [-file <achive>] [options] [member...]: 从归档文件中删除。
|
||||
tar {-r|--append} [-f <achive>] [options] [file...] : 向归档文件中添加文件
|
||||
tar {-t|--list} [-f <achive>] [options] [member...] : 列出归档文件的内容
|
||||
--test-label:测试归档文件的卷标
|
||||
tar {-u|--update} [-f <achive>] [options] [file...] : 更新归档文件的内容(即用新文件替代归档文件里的内容)
|
||||
tar {-x|--extract|--get} [-f <achive>] [options] [member...]: 从归档文件中释放文件
|
||||
--show-defaults : 打印默认值
|
||||
-?, --help : 打印帮助信息
|
||||
--usage :打印可用的选项
|
||||
--version : 打印版本信息
|
||||
```
|
||||
|
||||
#### 选项
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
#### 编译安装
|
||||
|
||||
##### 准备
|
||||
|
||||
```
|
||||
# 安装bootstrap工具
|
||||
sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstool python3-rosinstall build-essential
|
||||
|
||||
rosdep init
|
||||
rosdep update
|
||||
```
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
rt-tests是一个用于测试各种Linux的实时特性的测试套件。包含的程序:
|
||||
|
||||
##### [cyclictest](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start)
|
||||
|
||||
通过精确测量线程的预期唤醒时间和实际唤醒时间,以提供系统时延的统计信息。这些时延是由硬件、固件和操作系统引起的。
|
||||
|
||||
cyclictest通过运行一个非实时的主线程(调度类型SCHED_OTHER)来测试时延,它会启动固定数量的度量线程,这此度量线程有固定的实时优先级(调度类型SCHED_FIFO)。度量线程被在固定间隔内被计时器周期性地唤醒。随后,预期唤醒时间和实际唤醒时间通过共享内存传给主线程。主线程追踪时延的值并打印出它们。
|
||||
|
||||
```
|
||||
cyclictest [options]
|
||||
# 选项
|
||||
-a, --affinity[=PROC-SET] # 指定哪些核来运行线程。不指定[PROC-SET],则使用所有的核。
|
||||
-d, --distance=<DIST> # 线程间隔之间的距离,单位us,默认值500。当每个核上只有1个线程,建议设置为0.当每个核上有多个线程,用来隔开线程唤醒的时间,这个值会累加到interval的值上。
|
||||
-h, --histogram=<US> # 输出时延直方图(latency histogram)的数据,这些数据可以用来生成一个时延直方图。<US>是要跟踪的最大时延,以毫秒为单位。此选项会使所有线程的优先级相等。
|
||||
-i, --interval=<INTV> # 线程间的基本间隔,单位微秒,默认值1000。即线程多久被唤醒1次。
|
||||
-l, --loops=<LPS> # 设定循环的次数。默认为0(无限循环)。
|
||||
-m, --mlockall # 锁定当前及未来的内存分配,以防止被换页的时候换出
|
||||
-n, --nanosleep # 使用clock_nanosleep运行测试,这样精度就更高了。如不用此选项,则使用posix间隔计数器。
|
||||
-p, --priority=<PRIO> # 设置第一个线程的优先级。
|
||||
-S, --smp # 对SMP系统的标准测试选项。相当于"-t -a -n",且让所有线程的优先级保持相等
|
||||
-t, --threads[=num] # 设置测试线程的数量。如果不指定[num],则为处理器的核心数。若不使用此选项,则线程数为1.
|
||||
# 示例
|
||||
sudo cyclictest -t 5 -p 80 -n # 5个线程,最高优先级80,无限循环
|
||||
sudo cyclictest -t 1 -p 99 -n -l 1000 -m -i 2 -h 100 # 1个线程,优先级99,循环1000次,输出时延直方图
|
||||
sudo cyclictest -m -S -p 80 -i 200 -d 0 # 测试smp系统的时延
|
||||
```
|
||||
|
||||
结果的含意:
|
||||
|
||||
| 缩写 | 含义 | 描述 |
|
||||
| ---- | -------- | ---------------------------------- |
|
||||
| T | Thread | 线程索引和线程ID |
|
||||
| P | Priority | RT线程的优先级 |
|
||||
| I | Interval | 度量线程的预期唤醒周期,单位us |
|
||||
| C | Count | 时延被测量的次数,例如:迭代次数 |
|
||||
| Min | Minimum | 测量到的最小时延,单位us |
|
||||
| Act | Actual | 最近完成的迭代测量到的时延,单位us |
|
||||
| Max | Maximum | 测量到的最大时延,单位us |
|
||||
|
||||
|
||||
|
||||
##### cyclicdeadline
|
||||
|
||||
##### deadline_test
|
||||
|
||||
##### [hackbench](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/hackbench)
|
||||
|
||||
hackbench用来定位系统中的瓶颈,这些瓶颈应该被消除或优化。
|
||||
|
||||
hackbench测试的是内核里的调度器。它还可以通过重复设置和删除线程来对内存子系统进行压力测试。此外,它还可以在一定程度上对进程间通信(如本地的网络插座,管道等)进行压力测试。
|
||||
|
||||
它可以测试系统的负载,但不能精确测试应用的负载,因为它不测试与设备的通信。
|
||||
|
||||
它创建若干对可调度实体(进程或线程),每对调度实体之间通过网络插座或管道通信,它会记录每对之间来回发送数据的时间。
|
||||
|
||||
```
|
||||
hackbench [options]
|
||||
# 选项
|
||||
-p, --pipe # 使用管道发送数据。(默认用网络插座发送数据。)
|
||||
-s, --datasize=<SIZE> # 每条消息的大小。默认100字节。
|
||||
-l, --loops=<NUM> # 每个实体发送消息的数量。默认100条。
|
||||
-g, --groups=<NUM> # 指定可调度实体的对数。默认10对。
|
||||
-f, --fds=<NUM> # 每个实体要用的文件描述符数量。默认40个。
|
||||
-T, --threads # 创建的是线程。
|
||||
-P, --process # 创建的是进程。默认参数。
|
||||
--help
|
||||
# 示例
|
||||
hackbench # 创建10对进程,每个进程都通过网络插座发100条数据,每条数据包含100字节,每个进程使用40个文件描述符。
|
||||
hackbench -p -T # 创建10对线程,每个线程都通过管道发100条数据,每条数据包含100字节,每个线程使用40个文件描述符。
|
||||
hackbench -s 512 -l 200 -g 15 -f 25 -P # 创建15对进程,每个进程都通过网络插座发200条数据,每条数据包含512字节,每个进程使用25个文件描述符。
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### pip_stress
|
||||
|
||||
##### pi_stress
|
||||
|
||||
对互斥锁的优先级继承的压力测试。它作为时间优先级任务运行,并启动inversion machine thread groups。每个inversion group都会导致优先级反转条件,这样如果优先级继承不起作用则会死锁。
|
||||
|
||||
注:pi_stress线程是作为SCHED_FIFO或SCHED_RR线程运行的,这意味着它们可以使系统关键线程饥饿。建议在pi_stress之前把系统关键线程的调度策略改为SCHED_FIFO,并使用10以上的优先级,以避免pi_stress使这些线程饥饿。
|
||||
|
||||
```
|
||||
pi_stress [options]
|
||||
# 选项
|
||||
-i, --inversions=<n> # 指定反转条件的数量,即所有inversion group可以反转条件的总数。默认是-1代表无限次。
|
||||
-t, --duration=<n> # 指定测试运行时间为n秒。
|
||||
-g, --groups=<n> # inversion group的数量,默认10.
|
||||
-d, --debug # 调试模式,会输出大量信息
|
||||
-v, --verbose # 输出详细信息
|
||||
-s, --signal # 在接收到SIGTERM信号(Ctrl+C)后结束。默认按下任意键结束。
|
||||
-r, --rr # 让inversion threads作为SCHED_RR(round-robin)线程运行。默认是SCHED_FIFO。
|
||||
-p, --prompt # 在真正进行压力测试之前进行提示
|
||||
-u, --uniprocesor # 用一个处理器运行所有的线程。默认是inversion threads在一个处理器,admin threads在其它的处理器。
|
||||
-m, --mlockall # 锁定当前及未来的内存分配,以防止被换页的时候换出
|
||||
-h
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### pmqtest
|
||||
|
||||
##### ptsematest
|
||||
|
||||
##### queuelat
|
||||
|
||||
##### rt-migrate-test
|
||||
|
||||
##### signaltest
|
||||
|
||||
##### sigwaittest
|
||||
|
||||
##### ssdd
|
||||
|
||||
##### svsematest
|
||||
|
||||
#### 编译与安装
|
||||
|
||||
```
|
||||
sudo apt-get install build-essential libnuma-dev # 安装编译环境和必需的库
|
||||
git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
|
||||
cd rt-tests
|
||||
git checkout stable/v1.0 # master分支不是稳定版,所以要切换到stable分支
|
||||
make all
|
||||
make install
|
||||
```
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
```
|
||||
install [options] [-T] <src> <dst> # 把src复制为dst
|
||||
install [options] <srcs> <dir> # 把srcs复制到dir目录
|
||||
install [options] -t <dir> <srcs> # 把srcs复制到dir目录
|
||||
install [options] -d <dirs> # 为dirs创建所有的组件
|
||||
```
|
||||
|
||||
#### 选项
|
||||
|
||||
```
|
||||
-d, --directory # 把所有参数都视为目录名,并给这些目录创建所有的组件
|
||||
-D # 创建组件(对于-T选项是除了dst的所有先导组件,对于-t选项是所有组件),然后把src复制到dst
|
||||
-m, --mode=<MODE> # 指定权限模式(就像chmod命令那样,比如0755代表rwxr-xr-x)
|
||||
-t, --target-directory=<dir> # 把所有的src都复制进dir目录里
|
||||
-T, --no-target-directory # 把dts视为普通文件
|
||||
```
|
||||
|
|
@ -54,6 +54,9 @@ sed -i "s/oldstr/newstr/g" `grep oldstr -rl path`
|
|||
|
||||
#
|
||||
sed -n 's/ magicmagicmagic/ /p' file1 > file2
|
||||
|
||||
# 把file1里278-280行的内容重定向到file2里
|
||||
sed -n '278,280p' file1 > file2
|
||||
```
|
||||
|
||||
#### 参考文档
|
||||
|
|
|
@ -12,7 +12,15 @@ sudo [option] <command> # 以其它用户的权限来执行命令
|
|||
#### 添加sudo权限
|
||||
|
||||
```
|
||||
# 方法一
|
||||
visudo # 或vi /etc/sudoers
|
||||
# 模仿root ALL=(ALL) ALL,添加新行user_name ALL=(ALL) ALL
|
||||
# 模仿root ALL=(ALL) ALL,添加新行user_name ALL=(ALL) ALL
|
||||
|
||||
# 方法二
|
||||
usermod -aG sudo <user_name>
|
||||
# 在/etc/sudoers可以看到,admin和sudo两个组都有sudo权限,故可把用户加到这些个组以获得sudo权限
|
||||
|
||||
# 方法三
|
||||
vi /etc/group # 直接修改/etc/group命令把用户加到admin或sudo组
|
||||
```
|
||||
|
||||
|
|
|
@ -96,3 +96,7 @@ cd .ssh && touch config # 创建config文件
|
|||
> 如允许root登陆,则“PermitRootLogin yes”不能注释
|
||||
>
|
||||
> 如允许使用密钥登陆,则“PubkeyAuthentication yes”和“AuthorizedKeysFile .ssh/authorized_keys”不能注释
|
||||
|
||||
2. 提示对方机器"Connection refused"
|
||||
|
||||
> 经查是目标机器没有运行sshd,故sudo apt install openssh-server
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
```
|
||||
hash [options] [name...] # 显示或记住命令的位置。Linux每次启动会创建一个哈希表,用来记住执行过的命令。执行命令的时候是先查哈希表,再查PATH路径。这样就可以提高命令的调用效率。
|
||||
```
|
||||
|
||||
选项
|
||||
|
||||
```
|
||||
-d
|
||||
-l
|
||||
-p <pathname>
|
||||
-r
|
||||
-t
|
||||
```
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
```
|
||||
unset [options] [name...] # 在shell变量和函数里,取消其值或属性的设置。即对于每个name,删除其对应的变量或函数。
|
||||
```
|
||||
|
|
@ -7,6 +7,8 @@ apt-cache [options] <command> # 检索apt缓存
|
|||
```
|
||||
depends <pkgs> # 列出pkg所依赖的包
|
||||
rdepends <pkgs> # 列出所有依赖pkg的包
|
||||
search <regex...> # 通过正则表达式搜索
|
||||
show <pkg...> # 显示包的记录,类似于dpkg --print-avail的功能
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -40,3 +40,18 @@ sudo apt install xxxx:i386 # 安装软件包并指定其架构为i386
|
|||
# 原因分析:设置了代理
|
||||
```
|
||||
|
||||
#### sources.list文件
|
||||
|
||||
- 以`#`开头:注释
|
||||
|
||||
- 以deb开头:二进制仓库
|
||||
|
||||
```
|
||||
deb URI section1 section2
|
||||
# URI:库所在的地址。dists目录包含了所有软件包的索引,其下的子目录名即为sections1,其中security代表重要的安全更新、updates代表建议的更新、proposed代表预释放的更新、backports代表不支持的更新。打开任意一个子目录,其下的子目录名即为section2,其中main代表完全的自由软件,restricted代表不完全的自由软件,universe代表ubuntu官方不支持,仅靠社区支持的软件,multiverse代表非自由软件,完全不提供支持和补丁。
|
||||
```
|
||||
|
||||
|
||||
|
||||
- 以deb-src开头:源码仓库
|
||||
|
||||
|
|
|
@ -25,3 +25,42 @@ diff [options] <files>
|
|||
diff -ruN lab1/kern lab2/kern > lab2.patch # 递归比较lab2/kern文件夹与lab1/kern文件夹中所有文件不同之处,结果输出到lab2.patch文件中。注:生成的.patch文件是与patch命令配合使用的
|
||||
```
|
||||
|
||||
#### 输出格式
|
||||
|
||||
由于历史原因,一共有三种输出格式:
|
||||
|
||||
- 普通格式
|
||||
|
||||
c:改变
|
||||
|
||||
a:增加
|
||||
|
||||
d:删除
|
||||
|
||||
<:前一个文件中某行的内容
|
||||
|
||||
<:后一个文件中某行的内容
|
||||
|
||||
- 上下文格式:使用了-c选项
|
||||
|
||||
***:第一个文件
|
||||
|
||||
---:第二个文件
|
||||
|
||||
-:第一个文件中的此行在第二个文件中已被删除
|
||||
|
||||
+:此行在第一个文件中没有,但在第二个文件中有
|
||||
|
||||
!:两个文件都有此行,且内容有差别
|
||||
|
||||
- 合并格式:使用了-u选项
|
||||
|
||||
---:第一个文件
|
||||
|
||||
+++:第二个文件
|
||||
|
||||
-:同上下文格式
|
||||
|
||||
+:同上下文格式
|
||||
|
||||
@@:标记两个文件的行号、要显示的行数
|
||||
|
|
|
@ -27,6 +27,8 @@ build [options] # 编译一个包。
|
|||
## 属性选项
|
||||
## 编译选项
|
||||
--traget <triple> # 指定编译的架构(默认是主机的架构)。triple的格式为<arch><sub>-<vendor>-<sys>-<abi>。
|
||||
# 也可以在配置文件里通过设置build.target实现同样的功能。
|
||||
# 注:编译结果会放在不同的目录中。
|
||||
## 输出选项
|
||||
## 显示选项
|
||||
## Manifest选项
|
||||
|
@ -77,6 +79,7 @@ test # 对包执行单元和集成测试。用`--`分隔,传给cargo的放前
|
|||
##### manifest命令
|
||||
|
||||
```
|
||||
update [options] # 把Cargo.lock里的依赖更新到最新的版本。Cargo.lock如不存在则创建。
|
||||
```
|
||||
|
||||
|
||||
|
@ -84,6 +87,7 @@ test # 对包执行单元和集成测试。用`--`分隔,传给cargo的放前
|
|||
##### 包命令
|
||||
|
||||
```
|
||||
init [options] [path] # 创建Cargo包
|
||||
install # 构建和安装一个rust库。
|
||||
new # 创建一个cargo包
|
||||
--bin # 默认选项。包里会有src/main.rs(二进制目标)。
|
||||
|
@ -227,3 +231,4 @@ registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
|
|||
- [cargo](https://doc.rust-lang.org/cargo/commands/cargo.html)
|
||||
- `rustup doc --cargo`
|
||||
- `cargo help <cmd>`
|
||||
-
|
||||
|
|
|
@ -1,31 +1,81 @@
|
|||
#### 简介
|
||||
|
||||
`cmake`的核心功能就是生成一个构建系统。构建系统,描述了如何使用构建工具自动从源码构建可执行文件和库。比如,Makefile就是一个构建系统,它的构建工具就是`make`命令。`cmake`使用CMake语言,通过一个叫生成器的后端,来生成这个构建系统。
|
||||
|
||||
要生成一个构建系统,必须要指定的是:源码树、构建树、生成器。源码树在`CMakeLists.txt`里指定,构建树在`CmakeCache.txt`里指定,生成器通过`-G`选项指定,可以通过`cmake --help`查看当前都支持哪些生成器。
|
||||
|
||||
#### 用法
|
||||
|
||||
```bash
|
||||
# 生成一个项目的构建系统
|
||||
cmake [options] <path-to-source>
|
||||
cmake [options] <path-to-existing-build>
|
||||
cmake [options] -S <path-to-source> -B <path-to-build>
|
||||
# 构建一个项目
|
||||
cmake --build <dir> [<options>] [-- <build-tool-options>]
|
||||
# 安装一个项目
|
||||
cmake --install <dir> [<options>]
|
||||
# 打开一个项目
|
||||
cmake --open <dir>
|
||||
# 运行一个脚本
|
||||
cmake [{-D <var>=<value>}...] -P <cmake-script-file>
|
||||
# 运行命令行工具cmd
|
||||
cmake -E <cmd> [options]
|
||||
# 运行find-package工具
|
||||
cmake --find-package [options]
|
||||
# 帮助信息
|
||||
cmake --help [-topic]
|
||||
```
|
||||
|
||||
#### 选项
|
||||
|
||||
##### 生成构建系统
|
||||
|
||||
```bash
|
||||
-S <path-to-source> # 指定源码目录
|
||||
-B <path-to-build> # 指定构建目录
|
||||
-G <generator-name> # 指定生成器
|
||||
|
||||
-E # cmake命令模式
|
||||
```
|
||||
|
||||
##### 构建项目
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 安装项目
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 运行命令行工具
|
||||
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 帮助信息
|
||||
|
||||
```
|
||||
--help # 打印帮助信息
|
||||
--help-command <cmd> # 打印命令<cmd>的帮助信息。
|
||||
```
|
||||
|
||||
#### 生成器
|
||||
|
||||
- Unix Makefiles - 生成标准的UNIX makefiles。
|
||||
|
||||
#### cmake命令
|
||||
#### 参考信息
|
||||
|
||||
```
|
||||
|
||||
man cmake
|
||||
man 7 cmake-language
|
||||
man 7 cmake-buildsystem
|
||||
man 7 cmake-generators
|
||||
https://cmake.org
|
||||
```
|
||||
|
||||
|
|
|
@ -8,6 +8,12 @@ gdb [选项] prog core # 调试程序prog并指定core文件(core文件是异
|
|||
|
||||
#### 选项
|
||||
|
||||
```
|
||||
-ex <cmd> # 执行GDB命令<cmd>
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 命令
|
||||
|
||||
##### 别名类
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
-j [jobs], --jobs[=jobs] # 指定并行的任务数量为[jobs]。如不写[jobs],则尽最大可能并行。
|
||||
--jobserver-fds [R,W]
|
||||
-k, --keep-going
|
||||
-l [load], --load-average[=load]
|
||||
-l [load], --load-average[=load] # 如果有其它任务在运行,且平均负载至少为[load](一个浮点数),则不启动新任务(命令)。如不带参数,则删除以前的负载限制。
|
||||
-L, --check-symlink-times
|
||||
-n, --just-print, --dry-run, --recon # 只打印命令而不执行它们
|
||||
-o file
|
||||
|
|
Loading…
Reference in New Issue