u-boot 学习笔记
u-boot 学习笔记 u-boot分类 1.1. api 1.1.1. api.md 1.2. arch 1.2.1. arm 1.2.1.1. arm.md 1.2.1.2. assembly.md 1.2.2. arch.md 1.3. boot 1.3.1. bootm.md 1.3.2. bootretry.md 1.3.3. bootz.md 1.3.4. image.md 1.4. cmd 1.4.1. cmd.md 1.5. common 1.5.1. autoboot.md 1.5.2. board.md 1.5.3. cli.md 1.5.4. command.md 1.5.5. console.md 1.5.6. dmalloc.md 1.5.7. event.md 1.5.8. export.md 1.5.9. log.md 1.5.10. main.md 1.6. dm 1.6.1. adc.md 1.6.2. button.md 1.6.3. clock.md 1.6.4. core.md 1.6.5. dts.md 1....
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环 摘要:把阶段 06~09 的运行机制转成可重复验证证据:拆分纯 C++ 逻辑与 ROS 包装层,用 gtest、rostest、rqt 和 rosbag 建立最小回归闭环。 @[toc] 第 09 章已经把 callback 执行链追到了用户函数:消息进入 SubscriptionQueue、再进入 CallbackQueue,最终由 Spinner worker 调用用户 callback。到这里,我们已经能解释“程序为什么这样运行”,但还没有回答另一个工程问题: 当代码修改以后,怎样证明原有行为没有被破坏;当 Node 看起来能运行时,又怎样把“我看到了正常日志”升级成可重复、可自动执行的测试证据? 第 10 章不把 gtest、rostest、rqt、rosbag 分别写成四份工具说明,而是围绕一条测试主线展开: 123456789101112131415纯 C++ 逻辑 ↓gtest ↓ROS Node 包装层 ↓...
ROS教程09:从 CallbackQueue 追到 Spinner——Callback 执行、阻塞与 roscpp 线程模型
ROS教程09:从 CallbackQueue 追到 Spinner——Callback 执行、阻塞与 roscpp 线程模型 摘要:沿 CallbackQueue 与 Spinner 源码主线,结合真实阻塞、并发与自定义队列日志,解释 callback 的执行线程、串行边界、适用场景与驱动线程模型。 @[toc]第 08 章已经把一条 TCPROS 消息追到 Subscriber 侧:网络线程完成收包和组帧以后,消息进入 Subscription::handleMessage(),随后由 SubscriptionQueue 和 CallbackQueue 接管。到那里为止,还没有回答一个对驱动开发非常关键的问题: 消息已经到达当前进程以后,用户 callback 为什么是在现在执行、由哪个线程执行;一个 callback 阻塞以后,又会拖住谁? 第 09 章只围绕这个问题展开。主线从第 08 章的终点继续,不再重复 Master、XML-RPC、TCPROS Header、序列化和 Socket 收发。 本章使用新的实验 package: 12345678910ro...
ROS教程08:从 TransportTCP
ROS教程08:从 TransportTCP::connect() 追到 TCPROS Connection Header、序列化与 Socket 数据传输 摘要:沿 ROS1 Noetic roscpp 的 TCPROS 数据面源码,追踪连接握手、Header 校验、消息序列化、发送队列、Socket 收发与接收侧组帧。 @[toc]第 07 章已经完成 ROS1 Topic 的控制面与发现流程:Publisher/Subscriber 向 Master 注册,Subscriber 通过 registerSubscriber 返回值或 publisherUpdate 得到 Publisher Node API URI,再通过 requestTopic 与 Publisher 协商 TCPROS,最终进入: 123Subscription::pendingConnectionDone() ↓TransportTCP::connect(pub_host, pub_port) 第 08 章从这里继续。为了避免 pendingConnectionDone() ...
ROS教程07:从 ros-start 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现
ROS教程07:从 ros::start() 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现 摘要:沿 ros::start() 的真实调用顺序逐层阅读 Poll、XML-RPC、Topic、Service 与 callback 源码,再回看 Publisher/Subscriber 的注册发现全过程。 @[toc]本章继续使用现有工程: 123ros_ws/src/ros1_hello/src/hello_node.cppros_ws/src/ros1_hello/src/hello_listener.cppros_debug_ws/src/ros_comm 第 06 章已经确认第一条启动链: 1234567ros::init() ↓第一个 ros::NodeHandle ↓NodeHandle::construct() ↓ros::start() 第 07 章直接从 ros::start() 的源码入口继续向下阅读。阅读顺序遵循真实调用关系:先认识 roscpp 在启动阶段创建或注册的 Manager、线程、监听端...
06_ROS1_Node启动与生命周期
ROS教程06:ROS1 Node 启动与停止流程 摘要:围绕 ROS1 roscpp 的 Node 生命周期,说明共享库与 main 前静态初始化、ros::init、NodeHandle、ros::start、shutdown 的关系,并在 Docker 中接入 rqt GUI。 @[toc]这一章只建立一个整体模型:一个 roscpp Node 从进程启动、ROS 初始化、内部运行设施启动,到 shutdown 和资源释放,依次发生什么。 实验继续使用: 12ros_ws/src/ros1_hello # 业务 Noderos_debug_ws # ROS1 Noetic 上游源码 overlay 先看整条生命周期,后文只展开需要掌握的节点。 需要先抓住四个边界: main() 之前可能已经执行共享库中的全局/静态对象构造; ros::init() 只把 roscpp 初始化到 initialized; 第一个 NodeHandle 在 NodeHandle::construct() 中触发 ros...
05:阅读 roscpp 源码,并用 F12、F5、GDB 进入
05:阅读 roscpp 源码,并用 F12、F5、GDB 进入 ros::init() 摘要:这一章把“能看 ROS 头文件”和“运行时真的进入 ROS 源码”分成两条独立链路。你会准备 ros_debug_ws,构建带 Debug 信息的 libroscpp.so,让业务 ros_ws 链接这份 overlay,再用 ldd、readelf、纯 GDB 和 VS Code F5 逐层证明调试链路正确。 @[toc] 本章目标完成本章后,你应该能够: 区分 F12 源码导航和 F5/GDB 运行时调试; 知道 ros::init() 声明与实现分别在哪里; 把 ros_comm、roscpp_core、rosconsole、std_msgs、ros_comm_msgs 放入 Debug workspace; 使用 merged devel 构建 Debug roscpp; 理解源码 header、生成 header、系统 header 三种来源; 用 readelf 判断 libroscpp.so 是否包含 Debug 信息; 让业务 workspace -...
04:使用 VS Code Remote-SSH 与 Dev Container 建立 ROS1 开发工作流
04:使用 VS Code Remote-SSH 与 Dev Container 建立 ROS1 开发工作流 摘要:这一章不把 VS Code 当成“装几个插件就结束”。我们会先确定 IDE 到底运行在哪一层,再建立两套互补工作流:Remote-SSH Host 负责日常编辑、Git、Docker 和 Host→Container GDB;Dev Container 负责最准确的 ROS1 C++ IntelliSense、/opt/ros/noetic 浏览和 Container 内调试。 @[toc] 本章目标完成本章后,你应该能够: 解释 Windows VS Code、Remote-SSH Host、Docker Container 三层关系; 知道 VS Code Extension Host 在不同模式下运行在哪里; 会使用 ROS1 Container Bash Terminal Profile; 会使用 Container Tools 查看 Container 文件; 会 Reopen in Container,并理解它与普通 docker exec 的...
03:让 Node 真正通信——Topic、Parameter、日志与 roslaunch
03:让 Node 真正通信——Topic、Parameter、日志与 roslaunch 摘要:这一章把上一章“已经编译好的两个 ELF”真正放进 ROS1 运行时。你会先手工启动 roscore、Publisher 和 Subscriber,再用 rosnode、rostopic、rosparam 观察系统,最后把多终端操作收敛成一个 hello.launch。 @[toc] 本章目标完成本章后,你应该能够: 理解 roscore、ROS Master、Parameter Server、rosout 的关系; 会使用 rosrun 启动单个 Node; 会使用 rosnode list/info 查看 Node; 会使用 rostopic list/info/echo/hz 查看 Topic; 理解 Topic 数据为什么不是由 Master 转发; 理解 private parameter ~publish_rate; 会使用 roslaunch 一次启动多个 Node; 会区分终端日志、/rosout 和 ~/.ros/log。 为什么先手工开多个终端rosl...
02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node
02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node 摘要:这一章从空的 catkin workspace 思维出发,逐步理解 src/、package.xml、CMakeLists.txt、catkin init、catkin config 和 catkin build。然后从最小 main() 开始,一步步写出 hello_node Publisher,并确认它最终被编译成可执行 ELF。 @[toc] 本章目标完成本章后,你应该能够: 解释 workspace、package、Node、CMake target 四个概念的关系; 知道 package.xml 和 CMakeLists.txt 分别负责什么; 会初始化 catkin_tools workspace; 会创建 ROS1 package,并声明 roscpp、std_msgs 依赖; 能读懂 ros::init()、NodeHandle、Publisher、ros::Rate; 会把 .cpp 文件加入 CMake,生成可执行程序; 会用 catkin bui...








