当前位置:网站首页>初学ARM的个人心得
初学ARM的个人心得
2022-08-09 15:02:00 【翔在天上飞】
目录
1、判断寄存器某一位上的值是0还是1

UTRSTAT2是一个寄存器,寄存器往往要对位进行操作,这里就需要对该寄存器的第0位进行判断,判断是否这里的第0位为 1,如果是1,说明接收到了(其实UTRSTAT2这个寄存器的第0位是一个判断标志位)
while(!(UTRSTAT2&(1<<0)));
这句话我觉得设计的非常巧妙,借助这个while循环,既可以判断是否接收到了消息,又可以去阻塞地等待,直到接收到消息才跳出循环,进行后续的消息读取。
UTRSTAT2&(1<<0)
此处也可以通过改变偏移量,去检查其他的位。其检查原理如下:

通过移动1这个数,然后和原来的寄存器上的数据进行相与,可以确保其他的几个位置上都是0,由于和0相与都是0,所以不会影响到最终结果,其结果只与移动对应位置寄存器上的数据有关。
如果,这个位置上,寄存器的数据是1 ,则1与1是1,整体为真;
如果,这个位置上,寄存器的数据是0 ,则0与1是0,整体为假。
2、数据的移位操作
在操作硬件寄存器时,往往需要通过数值+一定的偏移量来对一个寄存器进行赋值,使用这种操作可以使得程序更加清晰,让他人知道当前操作的具体是寄存器的那一个位(通过移动的位数来判断)。
数据在硬件编程时,不管我们写的时候是以二进制、十进制还是十六进制,其最终都是以二进制补码的形式来的,所以,我们在进行移位操作时,移动多少位,移动的都是二进制数。
另,以右移为例,往右边移几位,就是在原二进制数后面补上几个0
3、volatile关键字
volatile关键字在设计到底层代码编程时,可以说是经常会被使用到
volatile是一个特征修饰符(type specifier).volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接通过所在的地址去读值,这样从事物的本源去取值,就不会出错。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
其实我们在编写程序时,所写的代码,编译器在执行的时候,不一定会按部就班的去执行,编译器会将一些步骤按照编译器的理解来优化,这种优化可能会导致某些步骤的缺失。
下面举个例子说明一下:
假设a、i均已经定义,且i是有值的。
这是我们所写的
while(1)
{
a = i;
}这是编译器优化后的
a = i;
while(1);编译器会认为,这里的值一直没有变化,不需要去一次次的赋值,赋值一次就够了。
当然,加上volatile就可避免编译器的这种优化。
4、一种调用寄存器极其方便的宏的写法
下面这种写法可以结合寄存器的初始化与赋值为一体,使程序更清晰,使用起来也更方便
#define reg_set(reg,h,l,val) (reg = reg & ~((1 << (h - l + 1) -1) << l) | (val << l))①reg是待操作的寄存器
②h是操作范围最高位
③l是操作范围最低位
④val是要写入的具体值
边栏推荐
猜你喜欢

TOPSIS优劣解距离法

Heap series _0x04: Internal structure of heap (_HEAP=_HEAP_SEGMENT+_HEAP_ENTRY)

灰色关联分析

【QT】QLayout: Attempting to add QLayout “to ***“, which already has a layout的终极解决方法

godot正确设置2d像素游戏

Vim实用技巧_3.可视模式和命令模式

idea 用不了Ctrl+Shift+F快捷键全局搜索。

堆(heap)系列_0x08:NT堆调试支持_立刻发现调试支持(DPH)

Vim实用技巧_6.复制和粘贴原理(寄存器)

Candide3 face animation model
随机推荐
如何保证测试用例的覆盖率
Data Fitting Methods Application of MATLAB in Mathematical Modeling (Second Edition)
Correlation analysis
聚集索引和非聚集索引
软件安全基本概念
Unity Shader零基础入门4:纹理贴图与法线贴图
Matlab做分布拟合及绘制频率分布直方图
云模型和Logistic回归——MATLAB在数学建模中的应用(第2版)
Cloud Models and Logistic Regression - Applications of MATLAB in Mathematical Modeling (2nd Edition)
指针常量和常量指针和类中的const
Vim实用技巧_6.复制和粘贴原理(寄存器)
gccg++基本命令简介
堆(heap)系列_0x0A:3种方法一次性解决堆溢出问题
ACL配置
【翻译】制作DEB/debian包
爬虫实战 某问答网站乎
【Postgraduate Work Weekly】(The third week)
规划问题的MATLAB求解——MATLAB在数学建模中的应用(第2版)
Vim practical skills_3. Visual mode and command mode
Detailed Explanation of Software Secure Memory Area