<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[bj318318的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/bj318318</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; bj318318]]></copyright><item><title><![CDATA[常见的总线连接结构]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/124375524</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/124375524</guid><author>bj318318</author><pubDate>Sun, 24 Apr 2022 09:40:13 +0800</pubDate><description><![CDATA[常见的总线连接结构（soc互连）：


]]></description><category></category></item><item><title><![CDATA[gdb调试命令]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/117074014</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/117074014</guid><author>bj318318</author><pubDate>Thu, 20 May 2021 13:59:22 +0800</pubDate><description><![CDATA[总览
本文为GDB调试指南，参考GDB调试手册，但加入了很多实例，目前已有的篇目：
启动调试
断点设置
变量查看
单步调试
源码查看
每个篇目都加入了示例，可操作性强。
启动调试
前言
GDB（GNU Debugger）是UNIX及UNIX-like下的强大调试工具，可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。本文以C程序为例，介绍GDB启动调试的多种方式。
哪类程序可被调试
对于C程序来说，需要在编译]]></description><category></category></item><item><title><![CDATA[关于c++ boost::bind的一些理解]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/116200356</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/116200356</guid><author>bj318318</author><pubDate>Tue, 27 Apr 2021 14:32:09 +0800</pubDate><description><![CDATA[1 介绍
一般来说boost::bind有两种方式的调用，一种是对自由方法，也取非类方法， 一种是对类方法。
方式一：
直接boost::bind(函数名, 参数1，参数2，…)
方式二：
对类方法来说，直接boost::bind(&amp;类名::方法名，类实例指针，参数1，参数2）
而boost::function也是一种函数对象。
需要注意的一点是，boost::bind里的参数个数一定要与被bind的函数相同。
2 用法
【bind】
一般用法：bind用于一般普通函数（ 以非类、结构的成员函数 ）]]></description><category></category></item><item><title><![CDATA[编码规范学习笔记（九）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/115527470</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/115527470</guid><author>bj318318</author><pubDate>Thu, 08 Apr 2021 17:58:14 +0800</pubDate><description><![CDATA[1、	三思而后行（需求分析迭代、技术难点、编程语言选择、设计）
2、	伪代码编程（注释规范）
3、	防御性编程
4、	变量定义初始化与命名




]]></description><category></category></item><item><title><![CDATA[Uboot学习笔记（八）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/115527368</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/115527368</guid><author>bj318318</author><pubDate>Thu, 08 Apr 2021 17:55:09 +0800</pubDate><description><![CDATA[Linux启动时进入倒计时  可以通过空格键 进入uboot   通过help、？查看哪些command
通过 &lt;？command&gt;查看具体命令的详细解释



在u-boot中从bootcmd中设置从flash读取内核的地址

分区代码里规定好的，关键是起始地址，然后大小



设置好这些参数之后，内核从地址0x3000d开始读取参数




...]]></description><category></category></item><item><title><![CDATA[Linux驱动学习笔记（七）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/115527297</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/115527297</guid><author>bj318318</author><pubDate>Thu, 08 Apr 2021 17:52:30 +0800</pubDate><description><![CDATA[驱动完成结构体注册，
可以想象内核中是一个数组，存放设备号，驱动程序通过入口函数注册设备号并携带结构体与name
驱动程序的三种方式：
1、传统驱动模型
2、总线设备驱动模型
3、总线设备驱动+设备树模型
内核运行时会去解析Dts设备树文件
传统的驱动程序由于硬件的配置信息的改变，针对同一芯片或者不同芯片，会有大量基本重复的驱动程序（只是硬件配置信息不一样），为了避免内核的臃肿，采用了设备树模型
设备树指定硬件资源  完全取决于写驱动程序的人
设备树compatible为了找驱动程序，如果和驱动程序不一样.]]></description><category></category></item><item><title><![CDATA[Linux开机自启动脚本设置]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/115526973</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/115526973</guid><author>bj318318</author><pubDate>Thu, 08 Apr 2021 17:41:54 +0800</pubDate><description><![CDATA[方式一：此方法比较通用
在/etc/init.d目录下找到rc.local文件，在此文件中添加开机要启动脚本的路径
例如 设置PATH环境变量直接开机时就设定好了

方式二：此方法可区分启动优先级
在/etc/init.d目录下可以看到如下文件夹

例如进入到rcS.d下可以看到很多脚本的软链接文件以及其特殊的前缀命名。

关于优先级具体含义及设置请查看
添加链接描述

...]]></description><category></category></item><item><title><![CDATA[单片机学习笔记（六）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/114304504</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/114304504</guid><author>bj318318</author><pubDate>Wed, 03 Mar 2021 11:35:29 +0800</pubDate><description><![CDATA[单片机内存资源比较小

用途主要是一些专用的功能

应用处理器在MCU的基础上，扩展了一些模块由于芯片内部ram flash比较小可外接DDR 和flash,芯片内部可扩展lcd GPU dsp等模块功能。可以装各种操作系统linux ios windows等，有了操作系统可以开发各种应用。

发展路线：

对于复杂的外设cpu内部有相应的控制器
板子上电后，cpu会执行第一条指令，如果是sd卡启动，cpu是不能直接访问sd，需通过芯片内部的rom(only read),

Pc主板不是so...]]></description><category></category></item><item><title><![CDATA[根文件系统学习笔记（五）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/114304385</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/114304385</guid><author>bj318318</author><pubDate>Wed, 03 Mar 2021 11:26:08 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[内核启动流程学习笔记（四）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/114304234</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/114304234</guid><author>bj318318</author><pubDate>Wed, 03 Mar 2021 11:24:14 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[C语言时间超时设置]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/113311131</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/113311131</guid><author>bj318318</author><pubDate>Thu, 28 Jan 2021 10:54:15 +0800</pubDate><description><![CDATA[关于C语言超时时间的设置问题，废话不多说，直接上代码
#include &lt;stdio.h&gt;
#include &lt;sys/time.h&gt;
 
 


void main()
{
	int time_use=0;
	struct timeval start;
	struct timeval end;//struct timezone tz; 
	gettimeofday(&amp;start,NULL); //gettimeofday(&amp;start,&amp;tz);
 
	wh]]></description><category></category></item><item><title><![CDATA[C++ Template模板]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/111654208</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/111654208</guid><author>bj318318</author><pubDate>Thu, 24 Dec 2020 20:24:13 +0800</pubDate><description><![CDATA[https://wenku.baidu.com/view/c93d6551a55177232f60ddccda38376baf1fe01e.html

]]></description><category></category></item><item><title><![CDATA[进制之间的转换]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/110953213</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/110953213</guid><author>bj318318</author><pubDate>Thu, 10 Dec 2020 15:09:34 +0800</pubDate><description><![CDATA[本文以二进制与十进制的互转为核心，八进制与二进制、十六进制与二进制的互转为基础，作为其他进制相互转换的桥梁，只要你会以上三种进制的互转，那么二、八、十、十六任意进制之间的互转都没问题。
基本约定
B（Binary)表示二进制，O（Octal）表示八进制，D（Decimal）或不加表示十进制，H（Hexadecimal）表示十六进制。例如：(1111)B = (17)O = 15 = (F)H
二进制与十进制的相互转换( Binary &lt;&lt;==&gt;&gt; Decimal )
**基础量表：*]]></description><category></category></item><item><title><![CDATA[Linux解压tar、gz、zip、rar等文件]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/110485939</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/110485939</guid><author>bj318318</author><pubDate>Wed, 02 Dec 2020 16:05:42 +0800</pubDate><description><![CDATA[1、tar格式（tar是打包，不是压缩）：
【打包】：tar cvf 目录文件名.tar 目录文件名
【解包】：tar xvf 目录文件名.tar
2、tar.gz格式：
【压缩】：tar -zcvf 目录文件名.tar.gz 目录文件名
【解压】：tar -zxvf 目录文件名.tar.gz
3、zip格式：
【压缩】：zip -r 目录文件名.zip 目录文件名
【解压】：unzip 目录文件名.zip
4、rar格式：
【压缩】：rar a 目录文件名.rar 目录文件名
【解压】：unrar x 目]]></description><category></category></item><item><title><![CDATA[PCIe设备枚举]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/110481963</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/110481963</guid><author>bj318318</author><pubDate>Wed, 02 Dec 2020 15:07:21 +0800</pubDate><description><![CDATA[枚举是什么?
枚举就是从设备读取一些信息，知道设备是什么样的设备，如何进行通信，这样主机就可以根据这些信息来加载合适的驱动程序。
硬盘是大家都很熟悉的设备，一路走来，从HDD到SSD，从SATA到NVMe，作为NVMe SSD的前端接口，PCIe再次进入我们的视野。作为x86体系关键的一环，PCIe标准历经PCI，PCI-X和PCIe，走过近30年时光。其中Host发现与查找设备的方式却一脉沿袭，今天我们先来聊一聊PCIe设备在一个系统中是如何发现与访问的。
首先我们来看一下在x86系统中，PCIe是什么样]]></description><category></category></item><item><title><![CDATA[学习笔记（三）（c++）]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/109994155</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/109994155</guid><author>bj318318</author><pubDate>Mon, 23 Nov 2020 13:53:55 +0800</pubDate><description><![CDATA[程序运行之后才会有栈区、堆区。
函数体内的变量都为局部变量，只要没写进函数体内的变量都为全局变量。
常量除了const修饰，只要“”双引号都是字符串常量













构造函数与析构函数（程序初始化和清理）

...]]></description><category></category></item><item><title><![CDATA[王牌飞行员带你彻底搞懂C++的虚函数和纯虚函数]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/109993779</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/109993779</guid><author>bj318318</author><pubDate>Mon, 23 Nov 2020 13:48:29 +0800</pubDate><description><![CDATA[首先，我们要搞清楚女神的所作所为，即语法规范。然后再去探究她背后的逻辑道理。她的语法说来也不复杂，概括起来就这么几条：
1.在类成员方法的声明（不是定义）语句前面加个单词：virtual，她就会摇身一变成为虚函数；
　　2.在虚函数的声明语句末尾中加个 =0 ，她就会摇身一变成为纯虚函数；
　　3.子类可以重新定义基类的虚函数，我们把这个行为称之为复写（override）；
　　4.不管是虚函数还是纯虚函数，基类都可以为他们提供实现（implementation），如果有的话子类可以调用基类的这些实现；
　]]></description><category></category></item><item><title><![CDATA[编译指定库路径与程序运行指定库路径的异同]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/109678345</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/109678345</guid><author>bj318318</author><pubDate>Fri, 13 Nov 2020 17:19:17 +0800</pubDate><description><![CDATA[关于编译指定库路径与程序运行指定库路径很多初学者理解有误，现通过下面的例子来更直观的说明问题
主程序
#include &lt;stdio.h&gt;
#include "add.h"

int main()
{
	int a = 10;
	int b = 10;
       printf("%d\n",add(a,b));

}

libadd.so的内容
#include "add.h"

int add(int m,int n)

{

	int s = m + n;
	return s;

}

]]></description><category></category></item><item><title><![CDATA[Linux下QT程序打包]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/109675258</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/109675258</guid><author>bj318318</author><pubDate>Fri, 13 Nov 2020 15:25:23 +0800</pubDate><description><![CDATA[一、准备两个脚本
ldd.sh脚本
#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
    cp "$Variable" $LibDir
done


xxxx.sh脚本
注意该脚本的名称必须和程序名一致。
#!/bin/sh
a]]></description><category></category></item><item><title><![CDATA[Qt打开文件对话框同时选中多个文件或单个文件]]></title><link>https://blog.youkuaiyun.com/bj318318/article/details/109675144</link><guid>https://blog.youkuaiyun.com/bj318318/article/details/109675144</guid><author>bj318318</author><pubDate>Fri, 13 Nov 2020 15:03:14 +0800</pubDate><description><![CDATA[打开多个文件
QString strs;
QStringList file_list, output_name;
QStringList str_path_list = QFileDialog::getOpenFileNames(this, tr("选择转码文件"), tr("/home"), tr("视频文件(*.mp4 *.m3u8);;所有文件（*.*);;"));
	for (int i = 0; i &lt; str_path_list.size(); i++){
		QString str_pa]]></description><category></category></item></channel></rss>