精华内容
下载资源
问答
  • a. 文件是什么? i. 文件是磁盘或者固态硬盘上的一段已命名的存储区 b. 什么是文本文件和二进制文件? i. 文本文件和二进制文件都是计算机文件,在计算机中的物理存储都是二进制的, ...二进制文件是

    a. 文件是什么?

    i. 文件是磁盘或者固态硬盘上的一段已命名的存储区
    

    b. 什么是文本文件和二进制文件?

    i. 文本文件和二进制文件都是计算机文件,在计算机中的物理存储都是二进制的,
       没有本质的区别;真正的区别是在逻辑上的,也就是编码层次上的差异。
    ii. 文本文件是以ASCII码、Unicode码表示的纯文本文件,只能存储字符信息,不
        能存储其他信息;二进制文件主要是图形文件和文字处理程序等计算机程序
    iii. 文本文件大多是定长编码,每个字符在具体编码中是固定的;二进制文件是基
         于值编码,根据不同的应用,代表不同的信息,自定义的编码,是变长编码,
         一个值由多少个比特代表完全由自己决定,所以不同的编辑器去打开二进制
         文件,很容易产生乱码,因为编码和译码的格式不一样
    

    c. 什么是二进制模式和文本模式?

    		i. 这个是C语言提供的两种访问文件的途径
    			1) 在二进制模式中,程序可以访问文件的每个字节,故访问的内容就是
    			   文件中存放的内容
    			2) 在文本模式中,程序所见的内容与文本实际内容不同。文本模式中,
    			   程序会把本地环境表示的行末尾或者文件末尾转换为C中的格式
    
    展开全文
  • 1.为什么计算机采用二进制? 2.进制数之间的转换   所有的其他进制数都可以用十进制表示,但反过来未必成立,比如不是所有的十进制小数都可以用二进制表示。 任意进制转换成十进制   按权展开相加法 十进制...

    一、校验码

      校验码是指能够发现或能够自动纠正错误的数据编码,也称检错纠错编码。校验码的原理是通过增加一些冗余码,来检验或纠错编码。
      关于码距:通常某种编码都由许多码字构成,任意两个合法码字之间最少变化的二进制位数,称为数据校验码的码距。对于码距不小于2的数据校验码,开始具有检错的能力。码距越大,检错、纠错的能力就越强,而且检错能力总是大于等于纠错能力。

    • 奇偶校验码:只能发现一位奇数位的出错情况,不能纠错。

    • 海明校验码:可以最多发现两位并纠正一位错位,使用很广泛,实际上是一种多重奇偶校验码。例题如下:

    在这里插入图片描述
    在这里插入图片描述

    • 循环冗余码:能发现并纠正多位错误。常用于网络层,传输大量数据。例题如下:

    在这里插入图片描述

    二、数据的存储方式

    • 大端方式和小端方式: 现在的计算机基本上按字节编址,但是一个数据未必是一个字节装得下的,也就是说一个数据可能要分好几个存储单元才装得下,先放低位再放高位就是小端方式,先放高位再放低位就是大端方式。
      在这里插入图片描述
    • 边界对齐: 假设存储字长为32位,可按字节、半字和字寻址。对于机器字长为32位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。所存储的数据不满足上述要求时,通过填充空白字节使其符合要求。这样虽然浪费了一些存储空间,但可提高取指令和取数的速度。体现的是空间换时间的思想。
      在这里插入图片描述

    三、定点数的表示和运算

    1.有符号数

    • 原码:最高位表示符号位,其余的表示绝对值。0的表示有+0=00000和-0=10000。+0和-0是同一个数并不是两个数。
    • 补码:真值为整数那么补码就是原码;若真值为负数,原码的符号位不变其余的取反,并且最低位+1,得到补码。0的表示是唯一的,尽管原码的0不唯一,求补码时低位+1的操作反而使得+0和-0相同了。另外,整数补码表示的范围是-2n—2n-1,相比原码它的下界多1。
    • 反码:和补码有一点点像但不同,如果真值是正数,反码就是原码;如果真值是负数,除符号位之外其余的取反。0的表示不唯一,因为原码0不唯一。
    • 移码:在原码的基础上加上一个偏置值就得到了移码,至于偏置值,比如一共有8位,则偏置值为270的表示是唯一的。

    2.C语言中的整型数据类型

    • 有符号数和无符号数的转换: 在计算机中,同样的数值,对于有符号数以补码形式记录真值,对于无符号数以原码形式记录真值。
    • 不同字长整数之间的转换: 长类型—>短类型,高位截肢;短类型—>长类型,高位补符号位数值。

    3.定点整数的符号扩展

      需要注意的是高位添0还是1的问题,如下:

    • 正数补0
    • 负数:原码补0,反码、补码补1。

    4.加减法

    • 原码加减法:

      加法规则∶先判符号位,若相同,则绝对值相加,结果符号位不变;若不同,则做减法,绝对值大的数减去绝对值小的数,结果符号位与绝对值大的数相同。
      减法规则∶两个原码表示的数相减,首先将减数(后面那个数)符号取反,然后将被减数(前面那个数)与符号取反后的减数按原码加法进行运算。
      注意∶运算时注意机器字长,当左边位出现溢出时,将溢出位丢掉。

    • 补码加减法(实现简单,计算机普遍使用):

      基本原理:若做加法,则两数的补码直接相加;若做减法,则将被减数与减数的机器负数相加。
      两个操作数均由补码表示;符号位与数值位按同样规则一起参与运算,符号位运算产生的进位要丢掉,结果的符号位由运算得出。

    5.溢出判断

      溢出是指运算结果超过了数的表示范围。通常,称大于机器所能表示的最大正数为上溢,小于机器所能表示的最小负数为下溢。只有两个符号相同的数相加或符号不同的数相减才可能发生溢出。

    采用一位符号: 由于减法运算在机器中是用加法器实现的,因此无论是加法还是减法,只要参加操作的两个数符号相同,结果又与原操作数符号不同,则表示结果溢出。
    双符号位法/模4补码: 运算结果的两个符号位相同,表示未溢出;运算结果的两个符号位不同,表示溢出,此时最高位符号位代表真正的符号。
    在这里插入图片描述

    6.移位运算

    • 算术移位
      在这里插入图片描述

    • 逻辑移位
      左移、右移都添0。

    • 循环移位
      在这里插入图片描述

    四、IEEE 754标准

    在这里插入图片描述
    在这里插入图片描述
      对于规格化的二进制浮点数,数值的最高位总是"1",为了能使尾数多表示一位有效位,将这个"1"隐含,因此尾数数值实际上是 24 位。隐含的"1"是一位整数。临时浮点数又称扩展精度浮点数,无隐含位。
      注意:“1”隐含后尾数不进行二次规格化。

    在这里插入图片描述
      上面两种格式,阶码最大值分别为127和1023。
      注意:阶码机器数全为1,用来表示无穷大。阶码机器数全为0,用来表示此数值为0。

    五、C语言中的类型转换

      C语言中,float型对应单精度浮点数,double型对应于双精度浮点数,long double对应于扩展双精度浮点数(但不同机器可能不同)。

    • 强制类型转换:在等式赋值和判断中出现,可能会有范围、精度的损失。

    • 隐式转换:转换过程无范围和精度损失

      char(1bit)——>int(4bit)——>long(8bit)——>float(4bit)——>double(8bit)

    其他情况可能有损失:
      总长度变小,可能会溢出;总长度一样,但有效位数变少,需要舍入,导致精度损失。

    六、浮点数的运算

      阶码和尾数要分开进行,一律采用补码形式。

    • ①对阶:小阶向大阶看齐,通过尾数不断算术右移同时增加阶数来实现升阶,直到阶数相等为止。由于有效数位可能会变少,所以可能会影响浮点数的精度。
    • ②尾数求和:补码加减
    • ③规格化:通过左规和右规(解决溢出),来保证浮点数的符号位和小数点第一位不同(因为是采用的补码形式)。
    • ④舍入:可能出现在对阶和右规的时候。因为最低有效位可能会往右移直到需要舍弃,此时,这一位的前一位需要舍入。分为0舍1入(舍弃的最高位为1则末位为1,否则为0)、末位恒置1。舍入是浮点数才有的概念,定点数没有。
    • ⑤溢出判断: 尾数溢出未必结果就溢出,此时应当右规,若右规之后阶码溢出则结果溢出。

    注意
      对阶不会引起阶码上溢,但右规可能;
      尾数舍入可能引起阶码上溢,尾数溢出结果不一定溢出;
      左规时可能引起阶码下溢。

    七、一些考察频率不高的知识点

    1.为什么计算机采用二进制?

    在这里插入图片描述

    2.进制数之间的转换

      所有的其他进制数都可以用十进制表示,但反过来未必成立,比如不是所有的十进制小数都可以用二进制表示。

    • 任意进制转换成十进制:按权展开相加法
    • 十进制转换成任意进制:整数部分用除基取余法,小数部分用乘基取余法,从小数点处往两边。

    3.BCD码

      二进制编码的十进制数通常采用四位二进制数来表示一位十进制数中的0~9这10个数码。这种编码方法使二进制数和十进制数之间的转换得以快速进行。

    • 8421码(最常用):从左到右每一位权值分别为8、4、2、1,当结果落到10-15也就是(1010)2-(1111)2之间时,需要加上6也就是(0110)2,并向高位进位。
    • 余三码:在8421码的基础上加上3也就是(0011)2
    • 2421码:四位权值从左到右是2、4、2、1。

    4.英文字符编码ASCII

      共有128个字符,每个字符用7位编码占用一个字节(所以最高位也就是第8位为0),0~ 31 是控制字符,32是空格,33~126是可打印字符,127是DEL。

    5.汉字字符编码GB

      汉字的编码分为输入编码、汉字内码、汉字字形码三种。一般用两字节表示一个汉字。

    • 输入编码:就是用于用户输入的编码方式,也就是拼音编码。

    区位码:把汉字放在94*94的格子里,行号叫区码,列叫位码。
    国标码=(区位码)16+2020H 2020H也就是32

    • 汉字内码:在计算机中编码的汉字。

    汉字内码=(国标码)16+8080H
    国标码两个字节的最高位都是0,因为每个字节只用了前7位来表示,而ASCII码的每个字节的最高位也是1,为了区分中英文,将国标码的两个字节的最高位都改为1,就成了汉字内码。也就是加上8080H。

    • 汉字字形码:也就是汉字的输出形式。
    展开全文
  • base64原理与运用

    2018-12-11 14:06:02
    其实因为该编码使用 64 个明文来编码任意 的二进制文件,它里面只使用了 A-Z,a-z,0-9,+,/这 64 个字符,有“略懂”的同学就会说了,里面还有“=”号啊,不错,不过等号不属于编码字符,而是填充字符。...

    什么是base64

    Base64 编码,首先我们应该搞清楚,为什么里面有个 64 的字样呢?其实是因为该编码使用 64 个明文来编码任意 的二进制文件,它里面只使用了 A-Z,a-z,0-9,+,/这 64 个字符,有“略懂”的同学就会说了,里面还有“=”号啊,不错,不过等号不属于编码字符,而是填充字符。

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

    用记事本打开exejpgpdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

    Base64编码是从二进制到字符的过程,可用于在http环境下传递较长的标识信息。

    如下:

    诞生原因:

    为什么发明这么个编码呢,其实这个编码的原理是很简单的,“破解”也很容易,电子邮件刚出来的 时候,只传递英文字符,这没有问题,但是后来,中国人,日本人都要发 email,这样问题就来了,因为这些字符有可能会被邮件服务器或者网关当成命令处 理,故必须得有一种编码来对邮件进行加密,但是加密的目的是为了能够使得一些原始的服务器不出问题(新得牛叉服务器已经能处理这些乱七八糟得情况了,不过 因为已经形成了一套规范,所以邮件还是得经过 Base64 编码才能传递),这样加密必须得简单(那搞个取反,异或加密吧,还是没解决根本问题 咯),加密简单,这样客户端程序加密解密也快,又要是明文 Ascii 编码,这样 Base64 就诞生了。 

    编码原理:

    64是2的6次方,所以用6bit来表示一个base64字符,然而ASCII码需要8个Bit来表示,所以正常来转换是以3个字节为单位,这样3*8=4*6三个字符就转换 成了4个base64字符,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

    以字符串"Son"为例,通过base64编码后就是:U29u,如下图

    刚刚好的情况,3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当字符数不是 3 的整数倍时,字符数/3 的余数自然就是 2 或者 1。转换的时候,结果不够 6 位的用 0 来补上相应的位置,之后再在 6 位的前面补两个 0。转换完空出的结果就用 就用“=”来补位,总之要保证最后编码出来得字节数是 4 的倍数。

    每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”通过Base64编码后为“Uw==”。这就是Base64的编码过程。

    在线Base64转换器

    在线Base64转换器

    Java中实现Base64

    实现方式有3种(3中方式编码出来的结果都是一样的),任选一种即可,正常项目中用得比较多的是用Apache Commons Codec提供的实现.

    1.jdk自带的方式

    2.(第三方)Apache Commons Codec提供的实现,需要引入依赖:

    <!-- Apache Commons Codec -->
    <dependency>
    	<groupId>commons-codec</groupId>
    	<artifactId>commons-codec</artifactId>
    	<version>1.10</version>
    </dependency>

    3.(第三方)bouncy Castle提供的实现,需要引入依赖:

    <!-- bouncy castle -->
    <dependency>
    	<groupId>org.bouncycastle</groupId>
    	<artifactId>bcprov-jdk15on</artifactId>
    	<version>1.60</version>
    </dependency>

    代码实现,我这里三种方式都有提供,各位按需取用:

    import java.io.IOException;
    import java.util.Arrays;
    
    import org.apache.commons.codec.binary.Base64;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    public class Base64Demo {
    
    		private static String src = "Son";
    
    		public static void main(String[] args) {
    			System.out.println(Arrays.toString("0".getBytes()));
    			jdkBase64();
    			System.out.println("------------------");
    			commonsCodesBase64();
    			System.out.println("------------------");
    			bouncyCastleBase64();
    		}
    		
    		/**
    		 * jdk自带的实现
    		 */
    		@SuppressWarnings("restriction")
    		public static void jdkBase64() {
    			try {
    				BASE64Encoder encoder = new BASE64Encoder();
    				String encode = encoder.encode(src.getBytes());
    				System.out.println("encode : " + encode);
    				
    				BASE64Decoder decoder = new BASE64Decoder();
    				System.out.println("decode : " + new String(decoder.decodeBuffer(encode)));
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		/**
    		 * (第三方)Apache Commons Codec提供的实现
    		 */
    		public static void commonsCodesBase64() {
    			byte[] encodeBytes = Base64.encodeBase64(src.getBytes());
    			System.out.println("encode : " + new String(encodeBytes));
    			
    			byte[] decodeBytes = Base64.decodeBase64(encodeBytes);
    			System.out.println("decode : " + new String(decodeBytes));
    		}
    		
    		/**
    		 * (第三方)bouncy Castle提供的实现
    		 */
    		public static void bouncyCastleBase64() {
    			byte[] encodeBytes = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
    			System.out.println("encode : " + new String(encodeBytes));
    			
    			byte[] decodeBytes = org.bouncycastle.util.encoders.Base64.decode(encodeBytes); 
    			System.out.println("decode : " + new String(decodeBytes));
    		}
    
    }
    

    带来的一些问题:

    1.由于标准的Base64编码后可能出现字符+/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+/分别变成-_

    /**
     * URL安全的base64编码
    */
    public static void commonsCodesBase64URLSafe() {
    	// encoder will emit - and _ instead of the usual + and / characters
    	String encode = Base64.encodeBase64URLSafeString("1245".getBytes());
    	System.out.println(encode);
    	byte[] decode = Base64.decodeBase64(encode);
    	System.out.println(new String(decode));
    }

    2.由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后要把=去掉,这里可以用URLEncoderURLDecoder来解决.

    public static void commonsCodesBase64CookieSafe() throws UnsupportedEncodingException {
    	byte[] encodeBytes = Base64.encodeBase64("12".getBytes());
    	System.out.println("base64Encode : " + new String(encodeBytes));
    	String encode = URLEncoder.encode(new String(encodeBytes), "UTF-8");
    	System.out.println("URLEncoder : " +encode);
    	String decode = URLDecoder.decode(encode, "UTF-8");
    	System.out.println("URLDecoder : " +decode);
    	byte[] decodeBytes = Base64.decodeBase64(decode);
    	System.out.println("base64Decode : " + new String(decodeBytes));
    }

    输出结果:

    base64Encode : MTI=
    URLEncoder : MTI%3D
    URLDecoder : MTI=
    base64Decode : 12
    

    一些使用案例

    先以“迅雷下载”为例: 很多下载类网站都提供“迅雷下载”的链接,其地址通常是加密的迅雷专用下载地址。

    其实迅雷的“专用地址”也是用Base64"加密"的,其过程如下:

    一、在地址的前后分别添加AA和ZZ

    二、对新的字符串进行Base64编码

    另: Flashget的与迅雷类似,只不过在第一步时加的“料”不同罢了,Flashget在地址前后加的“料”是[FLASHGET]

    QQ旋风的干脆不加料,直接就对地址进行Base64编码了

     

    参考资料:

    https://baike.baidu.com/item/base64

    https://blog.csdn.net/qq_20545367/article/details/79538530

    https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001399413803339f4bbda5c01fc479cbea98b1387390748000

    https://cloud.tencent.com/developer/article/1134508

    展开全文
  • linux设备树简析

    2020-08-24 10:07:59
    1.什么是设备树 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树...DTS 设备树源文件, DTB 将DTS 编译以后得到的二进制文件。将.c 文件编译为.o 需要用到 gcc 编译器,那么将.dts 编译为.dt

    1.什么是设备树

    设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等。

    2. DTS、 DTB 和 DTC

    DTS 是设备树源码文件, DTB 是将DTS 编译以后得到的二进制文件。将.c 文件编译为.o 需要用到 gcc 编译器,那么将.dts 编译为.dtb需要什么工具呢?需要用到 DTC 工具! DTC 工具源码在 Linux 内核的 scripts/dtc 目录下,如果要编译 DTS 文件的话只需要进入到 Linux 源码根目录下,然后执行如下命令:

    make all
    

    或者:

    make dtbs
    

    “make all”命令是编译 Linux 源码中的所有东西,包括 zImage, .ko 驱动模块以及设备
    树,如果只是编译设备树的话建议使用“make dtbs”命令。

    3.标准属性

    1.compatible : compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性! compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:

    "manufacturer,model"
    

    其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。比如 imx6ull-alientekemmc.dts 中 sound 节点是 I.MX6U-ALPHA 开发板的音频设备节点, I.MX6U-ALPHA 开发板上的音频芯片采用的欧胜(WOLFSON)出品的 WM8960, sound 节点的 compatible 属性值如下:

    compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
    

    属性值有两个,分别为“fsl,imx6ul-evk-wm8960”和“fsl,imx-audio-wm8960”,其中“fsl”表示厂商是飞思卡尔,“imx6ul-evk-wm8960”和“imx-audio-wm8960”表示驱动模块名字。 sound这个设备首先使用第一个兼容值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查。
    一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设
    备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个
    驱动。比如在文件 imx-wm8960.c 中有如下内容:

    static const struct of_device_id imx_wm8960_dt_ids[] = {
    { 	.compatible = "fsl,imx-audio-wm8960", },
    	{ /* sentinel */ }
    };
    MODULE_DEVICE_TABLE(of, imx_wm8960_dt_ids);
    static struct platform_driver imx_wm8960_driver = {
    	.driver = {
    	.name = "imx-wm8960",
    	.pm = &snd_soc_pm_ops,
    	.of_match_table = imx_wm8960_dt_ids,
    },
    	.probe = imx_wm8960_probe,
    	.remove = imx_wm8960_remove,
    }
    

    数组 imx_wm8960_dt_ids 就是 imx-wm8960.c 这个驱动文件的匹配表,此
    匹配表只有一个匹配值“fsl,imx-audio-wm8960”。如果在设备树中有哪个节点的 compatible 属
    性值与此相等,那么这个节点就会使用此驱动文件。
    2.modle:model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的,比
    如:

    model = "wm8960-audio";
    

    3.status:status 属性看名字就知道是和设备状态有关的, status 属性值也是字符串,字符串是设备的
    状态信息,可选的状态如表 43.3.3.1 所示:

    描述
    “okay” 表明设备是可操作的
    “disabled” 表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档
    “fail” 表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
    “fail-sss” 含义和“fail”相同,后面的 sss 部分是检测到的错误内容

    4.#address-cells 和#size-cells:这两个属性的值都是无符号 32 位整形, #address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。 #address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位), #size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。 #address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, reg 属性的格式一为:

    reg = <address1 length1 address2 length2 address3 length3……>
    

    每个“address length”组合表示一个地址范围,其中 address 是起始地址, length 是地址长
    度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用
    的字长,比如:

    spi4 {
    	compatible = "spi-gpio";
    	#address-cells = <1>;
    	#size-cells = <0>;
    	gpio_spi: gpio_spi@0 {
    		compatible = "fairchild,74hc595";
    		reg = <0>;
    	};
    };
    
    aips3: aips-bus@02200000 {
    	compatible = "fsl,aips-bus", "simple-bus";
    	#address-cells = <1>;
    	#size-cells = <1>;
    
    	dcp: dcp@02280000 {
    		compatible = "fsl,imx6sl-dcp";
    		reg = <0x02280000 0x4000>;
    	};
    };
    

    节点 spi4 的#address-cells = <1>, #size-cells = <0>,说明 spi4 的子节点 reg 属性中起始地址所占用的字长为 1,地址长度所占用的字长为 0。
    子节点 gpio_spi: gpio_spi@0 的 reg 属性值为 <0>,因为父节点设置了#addresscells = <1>, #size-cells = <0>,因此 addres=0,没有 length 的值,相当于设置了起始地址,而没有设置地址长度。

    设置 aips3: aips-bus@02200000 节点#address-cells = <1>, #size-cells = <1>,说明 aips3: aips-bus@02200000 节点起始地址长度所占用的字长为 1,地址长度所占用的字长也为 1。

    子节点 dcp: dcp@02280000 的 reg 属性值为<0x02280000 0x4000>,因为父节点设置了#address-cells = <1>, #size-cells = <1>, address= 0x02280000, length= 0x4000,相当于设置了起始地址为 0x02280000,地址长度为 0x40000。

    5.reg:reg 属性的值一般是(address, length)对。 reg 属性一般用于描
    述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息,比如在 imx6ull.dtsi 中有
    如下内容:

    uart1: serial@02020000 {
    	compatible = "fsl,imx6ul-uart",
    	"fsl,imx6q-uart", "fsl,imx21-uart";
    	reg = <0x02020000 0x4000>;
    	interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
    	clocks = <&clks IMX6UL_CLK_UART1_IPG>,
    			 <&clks IMX6UL_CLK_UART1_SERIAL>;
    	clock-names = "ipg", "per";
    	status = "disabled";
    };
    

    上述代码是节点 uart1, uart1 节点描述了 I.MX6ULL 的 UART1 相关信息,重点是第 326 行的 reg 属性。其中 uart1 的父节点 aips1: aips-bus@02000000 设置了#address-cells = <1>、 #sizecells = <1>,因此 reg 属性中 address=0x02020000, length=0x4000。查阅《I.MX6ULL 参考手册》可知, I.MX6ULL 的 UART1 寄存器首地址为 0x02020000,但是 UART1 的地址长度(范围)并没有 0x4000 这么多,这里我们重点是获取 UART1 寄存器首地址。
    6.ranges:ranges属性值可以为空或者按照(child-bus-address,parent-bus-address,length)格式编写的数字矩阵, ranges 是一个地址映射/转换表, ranges 属性每个项目由子地址、父地址和地址空间长度
    这三部分组成:
    hild-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
    parent-bus-address: 父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。
    length: 子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换,对于我们所使用的 I.MX6ULL 来说,子地址空间和父地址空间完全相同,因此会在 imx6ull.dtsi中找到大量的值为空的 ranges 属性,如下所示:

    soc {
    	#address-cells = <1>;
    	#size-cells = <1>;
    	compatible = "simple-bus";
    	interrupt-parent = <&gpc>;
    	ranges;
    	......
    }
    

    定义了 ranges 属性,但是 ranges 属性值为空。
    ranges 属性不为空的示例代码如下所示:

    soc {
    	compatible = "simple-bus";
    	#address-cells = <1>;
    	#size-cells = <1>;
    	ranges = <0x0 0xe0000000 0x00100000>;
    	serial {
    		device_type = "serial";
    		compatible = "ns16550";
    		reg = <0x4600 0x100>;
    		clock-frequency = <0>;
    		interrupts = <0xA 0x8>;
    		interrupt-parent = <&ipic>;
    	};
    };
    

    节点 soc 定义的 ranges 属性,值为<0x0 0xe0000000 0x00100000>,此属性值指定了一个 1024KB(0x00100000)的地址范围,子地址空间的物理起始地址为 0x0,父地址空间的物理起始地址为 0xe0000000。
    serial 是串口设备节点, reg 属性定义了 serial 设备寄存器的起始地址为 0x4600,寄存器长度为 0x100。经过地址转换, serial 设备可以从 0xe0004600 开始进行读写操作,0xe0004600=0x4600+0xe0000000。

    展开全文
  • 当然已知的不利之处在于PHP由于开放源码项目,没有什么商业支持,并且由此而带来的执行速度缓慢(直到PHP4之前)。但是PHP的邮件列表很有用而且除非你正在运行像Yahoo!或者Amazon.com这样的极受欢迎的站点,你...
  • Python访问Mysql数据库

    2011-10-13 10:12:30
    Python 语言写的程序不需要编译成二进制代码,可以直接 从源代码运行程序。在计算机内部,Python 解释器把源代码 转换成称为字节的中间形式,然后再把它翻译成计算机使用 的机器语言并运行。事实上,由于不再需要...
  • 偏移地址指段内某个存储单元相对该段首地址的差值,一个16位的二进制代码。物理地址8086芯片引线送出的20位地址,用来指出一个特定的存储单元。 7.给定一个存放数据的内存单元的偏移地址20C0H,(DS)=0C...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 ...1.1.1 什么是.NET 2000 年 6 月 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    <<page 1>> page begin==================== 目 ...1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出了其下一代...
  • php高级开发教程说明

    2008-11-27 11:39:22
    后在适当的地方加以例外处理,当写一个应用程序时,应该知道你的代码从事的是什么工作, 能够快速地从一点转到另一点—但其他人可能认为这并不容易。如果你从开发组的某个人手 中获得一个源文件并需要添加一些特征,...
  • 辑器编译连接生成单片机可执行的二进制文件(.HEX),然后通过单片机的烧 写软件将HEX 文件烧入单片机内。3 2.2.3 单片机仿真软件:PROTEUS Proteus 目前最好的模拟单片机外围器件的工具。可以仿真51 系列、 AVR,...
  • 各自含义是什么? 各 1)容量:交换单元所有入线可以同时送入的总的信息量 2)接口:即交换单元自己的信号接口标准 3)功能:点到点动能、同发功能,播功能。 4)质量:包括文换单元完成交换功能的况和信息经过交换单元的损份 ...
  • IBM大型机汇编语言

    2010-02-22 19:03:40
    1.3.2二进制数 .................................................................................................................. 7 1.3.3逻辑数 ............................................................
  • f) 如果在 WinRAR 3.90 的“查找”命令和控制台 RAR“ih”命令进行 16 进制搜 索时的字符串首字节大于 127, 则找不到匹配。 版本 3.90 1. 64 位版本的 WinRAR 可用了。如果你使用的 64 位 Windows 操作系统, ...
  • 4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCP-IP技术大全

    2011-12-01 16:46:51
    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCP/IP详解

    2013-07-25 11:17:06
    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCP-IP协议详解

    热门讨论 2008-11-24 20:46:50
    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCP/IP教程TCP/IP基础

    热门讨论 2009-11-23 20:58:46
    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCP/IP技术大全

    2010-03-10 10:25:24
    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    什么是开放手机联盟? 开放手机联盟, Open Handset Alliance :美国 Google 公司与 2007 年 11 月 5 日宣布组建的一个全球性的联 盟组织。这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,...
  • 4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCP IP教程 part1

    2008-08-26 09:18:48
    4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 4.3.1 无类地址 38 4.3.2 强化路由汇聚 39 4.3.3 超网化 39 4.3.4 ...
  • TCPIP协议详解(4-1)

    2008-01-16 14:49:35
    命名和寻址 第4章 IP网络中的名字和地址 29 4.1 IP寻址 29 4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

二进制基码是什么