嵌入式C语言位操作的移植与优化
发布时间:2007/4/23 0:00:00 访问次数:497
|
您现在的位置:下载 ,285002K | 80C196MC 的货源和报价 80C196MC 的相关技术信息 | 其他型号 | 北京欣宏伟业商贸中心联系人:李小姐 电话:010-82617818-809/13141430887 | 深圳市赛华达电子有限公司联系人:邓女士/刘小姐 电话:0755-8304765/83047653 | 一東先科電子發展有限公司联系人:陈 电话:0755-33082040/33083040 | 深圳市新亚洲新联兴电子销售部联系人:小陈 电话:0755-61306250 | |||
>>更多供应商 |
嵌入式C语言位操作的移植与优化
上海芯兆电子科技有限公司 王东征
引言
单片机的应用越来越广泛,种类也越来越多。由于嵌入式C语言可读性强、移植性好,与汇编语言相比大大减轻了软件工程师的劳动强度,因而越来越多的单片机工程师开始使用C语言编程。但C语言的可移植性仅限于与硬件无关的子程序,而与具体硬件有关的子程序则无法移植。在单片机应用中,位操作(特别是对引脚的位操作)非常普遍,如EEPROM数据和IC卡数据的读写、字段式LCD显示等,很多带串口的集成电路都需要单片机用软件来做I/O口读写程序。如何让这些子程序既有很好的通用性,生成代码的效率又高,是很多软件工程师都在考虑的问题。这里介绍两种C语言位操作的移植方法。
1 用逻辑运算实现位操作
请看下面这个子程序:
INT8U Card102RdByte(void) {
INT8U Temp8U, n = 8;
do{ Temp8U <<= 1;
if( PIN_CARD_SDA_RD() ) Temp8U |= 0x01;
PIN_CARD_CLK_H();PIN_CARD_CLK_L();
}while(--n);
return Temp8U;
}
这是通过单片机引脚从88SC102卡中读一个字节的子程序。程序采用μC/OSII中的书写风格,即变量和函数采用“驼峰”写法,由define定义的常量和内联函数采用全部大写加下划线的写法。
此程序驱动一个引脚输出CARD_CLK高低信号,从另一个引脚一位一位读取CARD_SDA数据。
1.1 用于MSP430系列单片机
此程序应用到MSP430单片机上(本文用的是MSP430F413单片机),头文件中要有如下定义:
typedefunsigned charINT8U;
#include<MSP430x41x.h>
#definePIN_CARD_SDA_RD()(P6IN & 0x01)
#definePIN_CARD_CLK_H()P6OUT |=0x04
#definePIN_CARD_CLK_L()P6OUT &= ~0x04
汇编结果如下:
In segment CODE, align 2, keepwithnext
__code unsigned char Card102RdByte(void)
Card102RdByte:
0000007E42MOV.B#0x8, R14
??Card102RdByte_0:
0000024C5CRLA.BR12
000004D2B33400BIT.B#0x1, &0x34
0000080128JNC??Card102RdByte_1
00000A5CD3BIS.B#0x1, R12
??Card1
|
您现在的位置:下载 ,285002K | 80C196MC 的货源和报价 80C196MC 的相关技术信息 | 其他型号 | 北京欣宏伟业商贸中心联系人:李小姐 电话:010-82617818-809/13141430887 | 深圳市赛华达电子有限公司联系人:邓女士/刘小姐 电话:0755-8304765/83047653 | 一東先科電子發展有限公司联系人:陈 电话:0755-33082040/33083040 | 深圳市新亚洲新联兴电子销售部联系人:小陈 电话:0755-61306250 | |||
>>更多供应商 |
嵌入式C语言位操作的移植与优化
上海芯兆电子科技有限公司 王东征
引言
单片机的应用越来越广泛,种类也越来越多。由于嵌入式C语言可读性强、移植性好,与汇编语言相比大大减轻了软件工程师的劳动强度,因而越来越多的单片机工程师开始使用C语言编程。但C语言的可移植性仅限于与硬件无关的子程序,而与具体硬件有关的子程序则无法移植。在单片机应用中,位操作(特别是对引脚的位操作)非常普遍,如EEPROM数据和IC卡数据的读写、字段式LCD显示等,很多带串口的集成电路都需要单片机用软件来做I/O口读写程序。如何让这些子程序既有很好的通用性,生成代码的效率又高,是很多软件工程师都在考虑的问题。这里介绍两种C语言位操作的移植方法。
1 用逻辑运算实现位操作
请看下面这个子程序:
INT8U Card102RdByte(void) {
INT8U Temp8U, n = 8;
do{ Temp8U <<= 1;
if( PIN_CARD_SDA_RD() ) Temp8U |= 0x01;
PIN_CARD_CLK_H();PIN_CARD_CLK_L();
}while(--n);
return Temp8U;
}
这是通过单片机引脚从88SC102卡中读一个字节的子程序。程序采用μC/OSII中的书写风格,即变量和函数采用“驼峰”写法,由define定义的常量和内联函数采用全部大写加下划线的写法。
此程序驱动一个引脚输出CARD_CLK高低信号,从另一个引脚一位一位读取CARD_SDA数据。
1.1 用于MSP430系列单片机
此程序应用到MSP430单片机上(本文用的是MSP430F413单片机),头文件中要有如下定义:
typedefunsigned charINT8U;
#include<MSP430x41x.h>
#definePIN_CARD_SDA_RD()(P6IN & 0x01)
#definePIN_CARD_CLK_H()P6OUT |=0x04
#definePIN_CARD_CLK_L()P6OUT &= ~0x04
汇编结果如下:
In segment CODE, align 2, keepwithnext
__code unsigned char Card102RdByte(void)
Card102RdByte:
0000007E42MOV.B#0x8, R14
??Card102RdByte_0:
0000024C5CRLA.BR12
000004D2B33400BIT.B#0x1, &0x34
0000080128JNC??Card102RdByte_1
00000A5CD3BIS.B#0x1, R12
??Card1