立题简介:
内容:对"bit位编程"的基本操作-综合分析;
来源:实际得出;
作用:对"bit位编程"的基本操作-综合分析;
仿真环境:Windows10+Visual Studio 2013;
日期:2019-04-11;
=====================分割线========================
立题详解:
本次介绍“对"bit位编程"的基本操作-综合分析”,在嵌入式或是基础数据处理中,主要需要构建以下4种:“某位置0”、“某位置1”、“某位取反”、“得到某位值”,实现方法主要有2种:“常规方法”(bit位操作)和“优化方法”(预定义);
同时注意:对计算机而言:其内部实际运作时,本质也为bit操作;因此对代码而言:使用“bit操作方式”比使用“数据类型操作方式”快很多;
原因:使用函数、变量操作,其多了将“函数、变量”转换为“汇编、二进制运算”的中间环节;
1、基本说明
对“stm8”、“stm32”、“avr”、“msp430”、“fpga”等等微控制器,其均需要涉及到“某位置0”、“某位置1”、“某位取反”、“得到某位值”4种操作,其中使用最多为“某位置0”、“某位置1”,其在“底层驱动代码编写”时,作用极大;
2、常规方法
对“常规方法”(bit位操作)而言:其通过直接对bit位操作,实现以上4类基本运算;
优点:其无需消耗额外的存储空间,直接读数据进行bit位操作;
缺点:相对而言,去可读性较低、维护难度大、修正麻烦、后续debug排查难度较大,对接手的新人要求较高;
3、优化方法
对“常规方法”(bit位操作)而言:其通过直接对bit位操作,实现以上4类基本运算;
对“优化方法”(预定义)而言:通过“以空间换时间”的思路进行设计,有效提高程序的可读性、可维护性等;核心思想为:预先设定“固定位bit常量”,使用不同的“常量”实现所需的“bit位操作”;对4bit操作,口诀为:“从高至低,8、4、2、1;从低到高,E、D、B、7”;
优点:可行性高、便于维护、修正方便、所定义宏参量可反复调用,便于在不同平台上进行移植;
缺点:其会占用固定字节的存储空间,消耗额外的内存空间;
举例常量如下:
首先,对“置位”,使用“#define”举例为:
#define SETBIT0 0x0001
#define SETBIT1 0x0002
#define SETBIT2 0x0004
#define SETBIT3 0x0008
#define SETBIT4 0x0010
#define SETBIT5 0x0020
#define SETBIT6 0x0040
#define SETBIT7 0x0080
其次,对“复位”,使用“#define”举例为:
#define CLRBIT0 0xFFFE
#define CLRBIT1 0xFFFD
#define CLRBIT2 0xFFFB
#define CLRBIT3 0xFFF7
举例代码为:“a |= SETBIT0”;
代码定义如下所示:
特别注意:从低到高,E、D、B、7的顺序,切忌不可写反,各自“二进制对应关系”为:
“E”----“1110”;“D”----“1101”;“B”----“1011”;“7”----“0111”;
3、实例演示
首先,对“某位置0”,使用代码如下:
注意:其中的“CLRBIT_02”已“被宏定义为0xFB”,同时操作符为“按位与&”;
然后,对“某位置1”,使用代码如下:
注意:其中的“SETBIT_02”已“被宏定义为0x04”,同时操作符为“按位或|”;
4、综合对比意见
对“常规方法”(bit位操作)和“优化方法”(预定义),其有各自的优缺点,需根据实际情况进行选择:
i)、对“内存空间紧张”时:此类情况多为“初代目单片机”,如“STC89C51”、“AVR单片机”等,其内存空间很小,自身RAM、ROM的容量极为有限,范围大概是“数十byte~数十KB”,此时若是在代码中建立过多的“define常量”、“const常量”等固定字节参量,其会对代码的最大容积率产生影响;此时可使用“bit位操作”进行运算,有效节省空间、提高执行效率,但在允许条件下,也可考虑“预定义法”;
实例:对“STC89C52”编写“逻辑代码”时,当引入“GPIO”、“ADC”、“DAC”、“I2C”、“IT/TIM”、“USART”后,经常出现代码超出“8kb容量限制”的错误,导致“外设使用”出现“捉襟见肘”的局面;
ii)、对“内存空间相对充裕”时:此类情况现在较为普遍,如现在常用的“STM8单片机”、“STM32单片机”、“i.MX RT1052”(借助外扩资源)等,其可用的RAM、ROM容量相当丰富,即使定义的“define常量”、“const常量”等固定字节参量所占空间达到“KB级别”,对整体代码量也不会有较大影响;此时可使用“预定义法”进行设置,可有效提高代码的可读性、可为维护性;
实例:对“STM32F103”上“UCOS系统”时,开始使用“bit位操作”,由于使用次数太多,导致在动辄数十行“bit位操作”代码段内debug时,无法有效发现错误,尤其对新人而言,对代码经常陷入一头雾水的状态;之后使用“预定义法”,代码可读性大幅提高,debug时也更加容易发现问题;
iii)、对“内存空间极位充裕”时:此类情况也有很多,如上到ARM的linux、SoC平台、计算机python编程、C-Shape代码编程等,其开发平台已经变为“ARM平台”、“SoC平台”、“PC机平台”,此时的RAM、ROM空间是宏观可变、宏观可控的,其自由度远比单片机要高得多,此时的开发已经与“底层开发”完全不同,需要根据“程序化要求”、“定制化”的要求走;对此部分,并未深入了解,不好妄自评论,若有不妥,敬请见谅;