本帖最后由 kami03372 于 2010-8-16 08:20 编辑
11111111
11111111
11111111
11111111
上面是四个字节的源数据,需要转换成下面的8个字节的数据输出
Tempdata1:10101010(源数据的Bit7组成)
Tempdata2:10101010 (源数据的Bit6组成)
Tempdata3:10101010 (源数据的Bit5组成)
Tempdata4:10101010 (源数据的Bit4组成)
Tempdata5:10101010 (源数据的Bit3组成)
Tempdata6:10101010 (源数据的Bit2组成)
Tempdata7:10101010 (源数据的Bit1组成)
Tempdata8:10101010 (源数据的Bit0组成)
tempdata1-8只是为了表达功能示意,使用的变量。
实际上只使用两个变量暂存输出就可以了。函数如下
for (RowCount=0;RowCount<4096;RowCount++)
{
tempdata1=((*psrc)&0x80)|(((*psrc1)&0x80)>>2);
tempdata2=(((*psrc2)&0x80)>>4)|(((*psrc3)&0x80)>>6);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x40)<<1)|(((*psrc1)&0x40)>>1);
tempdata2=(((*psrc2)&0x40)>>3)|(((*psrc3)&0x40)>>5);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x20)<<2)|(((*psrc1)&0x20));
tempdata2=(((*psrc2)&0x20)>>2)|(((*psrc3)&0x20)>>4);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x10)<<3)|(((*psrc1)&0x10)<<1);
tempdata2=(((*psrc2)&0x10)>>1)|(((*psrc3)&0x10)>>3);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x08)<<4)|(((*psrc1)&0x08)<<2);
tempdata2=(((*psrc2)&0x08))|(((*psrc3)&0x08)>>2);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x04)<<5)|(((*psrc1)&0x04)<<3);
tempdata2=(((*psrc2)&0x04)<<1)|(((*psrc3)&0x04)>>1);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x02)<<6)|(((*psrc1)&0x02)<<4);
tempdata2=(((*psrc2)&0x02)<<2)|(((*psrc3)&0x02));
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
tempdata1=(((*psrc)&0x01)<<7)|(((*psrc1)&0x01)<<5);
tempdata2=(((*psrc2)&0x01)<<3)|(((*psrc3)&0x01)<<1);
GPIOA->ODR =tempdata1|tempdata2;
CS_H;
CS_L;
psrc++;
psrc1++;
psrc2++;
psrc3++;
}
这种方法,1秒钟,大概可以执行160次,距离目标差很多。
利用MDK看了下汇编,M3核心有UBFX,BFI,BFC这几个位段
操作指令,汇编里面并没有使用。所以在这里请教下各位大侠有办法能
提高执行速度吗? |