寄存器的位操作
一般内核中存储器指的是寄存器。
汇编指令集直接操作的是寄存器。
CPU处理的位数,就是一个寄存器的空间大小,即一个寄存器可以存储的数据宽度。
位操作
(1)位运算符:作用对象是对单个位bit操作
与:&
或: |
非(取反): ~
异或: ^
位左移: <<
位右移: >>
(2)位置1 、位清零操作
eg:
4字节32位:
0b0000 0000 0000 0000 0000 0000 0000 0000
第31位------------------------… -------------------------第0位
- 位置1
-
unsigned int a; 将第3位置1,保证其他位不变
0x8 = 0000 1000
a = a | 0x8; 或 a |= 0x8;
a |= (0x1 << 3); -
unsigned int a; 将第27位置1,保证其他位不变
a = a | (0x1 << 27); 或 a |= (0x1 << 27);
- 位清零
-
unsigned int a; 将第3位清零,保证其他位不变
a &= (~0x8);
a = a & (~(0x1 << 3));
a &= (~(0x1 << 3)); -
unsigned int a; 将第27位清零,保证其他位不变
a = a & (~(0x1 << 27));
a &= (~(0x1 << 27));
-
异或 ^:不同为1,相同为0
0 ^ 1 = 1
1 ^ 1 = 00 ^ 0 = 0
1 ^ 0 = 1
位域操作
位域:几个连续的位,称为位域
0011 1000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0111
(1)unsigned int a; 将第[29:27]位置1,保证其他位不变
a = a | (0x7 << 27);
a |= (0x7 << 27);
0000 0000 0000 0000 0000 0000 0000 0111
0011 1000 0000 0000 0000 0000 0000 0000
1100 0111 1111 1111 1111 1111 1111 1111
(2)unsigned int a; 将第[29:27]位清零,保证其他位不变
a = a & (~(0x7 << 27));
a &= (~(0x7 << 27));
(3)unsigned int a; 将第[29:27]位修改101,保证其他位不变
0010 1000 0000 0000 0000 0000 0000 0000
ox7 = 0b0000 0111
0x5 = 0b0000 0101
- 把[29:27]位域先清零
a = a & (~(0x7 << 27)); - 把0x5左移27位
a = a | (0x5 << 27);
书写误区:注意运算符的优先级:& > |
a = a & (~(0x7 << 27)) | (0x5 << 27);正确
a &= (~(0x7 << 27)) | (0x5 << 27); 错误
电路图分析
电路图分析的顺序:从下到上.
外设 -》 丝印 -》 网络标号 -》 核心板(SOC) -》 数据手册datasheet -》 寄存器
-
丝印:电路板上器件的标识,通过标识可以在原理图上找到器件对应的局部电路原理图。
R-电阻:R1,R3
C-电容:C1,C2
L-电感:L1,L4
U-芯片:U0,U1
X-晶振:X1,X2
J-接插件 :J0,J2 -
网络标号:网络标号相同,表示两个引脚通过导线相连,具有相同的电气连接属性。
Keil
Keil简介
(1)Keil是美国Keil Software公司出品的基于C语言软件开发的集成开发环境IDE(与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势)。Keil公司2005年由ARM公司收购,而后ARM Keil推出基于μVision界面,用于调试ARM7,ARM9,Cortex-M内核的MDK-ARM开发工具,用于为控制领域的开发。
(2)Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。
注:集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。
Keil 5.0工程创建
按照一下步骤执行:
或者使用一下方式添加 程序.c
Keil 5.0链接脚本配置
Keil 5.0交叉编译工具配置
工程创建 start.s 调试
.text
.globl _start
_start:
mov r0,#0x1
loop:
b loop
.end