在进行C语言程序设计,常常需要进行数据转换,例如将4个8BIT的数据组合成1个32BIT,或者将32BIT的数据拆分成4个8BIT的数据。在汇编语言这些都很简单,在C语言中常用到的方法是移位,加,乘等方法。在IAR EW430编译环境下,用MSP430作低功耗设计,在数据转换时能否象汇编一样轻松呢,节省指令条数来提高系统运行效率进一步节省功耗,能否象汇编一样来完成数据转换,节省指令运行周期,我采取了如下的方法:
1)4个8BIT组合成32BIT:
unsigned char temp0[4];
unsigned long int temp;
temp0[3] = varHigh;
temp0[2] = varHighM;
temp0[1] = varLowM;
temp0[0] = varLow;
temp = *(unsigned long int *)temp0;
2)32BIT拆分成4个8BIT:
unsigned char mathData[4];
unsigned long int var;
*(unsigned long int *)mathData = var;
但上面的方法有一定的局限性,当变量存放在RAM中,地址为奇数时会发生转换错误,
如:若mathData 存放地址为奇数
mathData[0] = 0x11;
mathData[1] = 0x22;
mathData[2] = 0x33;
mathData[3] = 0x44;
则转换结果 var = 0x33221100,当变量存放在RAM中地址为偶数,或变量存于寄存器中时操作正确。具体原因与MSP430中硬件有关。利用MSP430 IAR EW430 优化,局部变量是存放于寄存器中,所以是可以正确完成数据转换的。
若移植到其他单片机上,还要考虑到存储器结构等硬件因素。
各位网友,在这方面你们又有什么高招呢?
文章评论(0条评论)
登录后参与讨论