原创 ARM7/9下的 位反转函数的 C与汇编实现。

2009-4-12 18:23 5054 11 11 分类: MCU/ 嵌入式

位反转 指令是DSP扩展指令。 在ARM9E、CORTEX-M3等有DSP扩展的ARM系列CPU上有, RBIT指令实现单周期的字内位反转。ARM7没有位反转指令。


最近把 STM32的RADIX-4 FFT  汇编文件 cr4_fft_64_stm32.s 移植到ARM7下。当中一项工作是要完成DSP 位反转的指令 RBIT  cntrbitrev,index    


刚开始用C写了个函数给汇编调用,后来直接用汇编写了个宏。


//RBIT  cntrbitrev,index    
void RBIT( register unsigned int cntrbitrev,register  unsigned int x)
{
   register  unsigned int y = 0x55555555;
    x = (((x >> 1) & y) | ((x & y) << 1));
    y = 0x33333333;
    x = (((x >> 2) & y) | ((x & y) << 2));
    y = 0x0f0f0f0f;
    x = (((x >> 4) & y) | ((x & y) << 4));
    y = 0x00ff00ff;
    x = (((x >> 8) & y) | ((x & y) << 8));
    cntrbitrev=((x >> 16) | (x << 16));
}



 MACRO
        MYRBIT  $temp2
        ADRL    $temp2, TableRBIT_V1   ;   
        LDR      r2,[$temp2]    ;//0x6ac  0x55555555
        AND      r3,r2,r1,LSR #1
        AND      r12,r1,r2
        ORR      r1,r3,r12,LSL #1        
        LDR      r2,[$temp2,#4] ;//0x6b0  0X33333333
        AND      r3,r2,r1,LSR #2
        AND      r12,r1,r2
        ORR      r1,r3,r12,LSL #2
        LDR      r2,[$temp2,#8] ;//0x6b4  0f0f0f0f
        AND      r3,r2,r1,LSR #4
        AND      r12,r1,r2
        ORR      r1,r3,r12,LSL #4
        LDR      r2,[$temp2,#12] ;//0x6b8  00ff00ff
        AND      r3,r2,r1,LSR #8
        AND      r12,r1,r2
        ORR      r1,r3,r12,LSL #8
        MOV      r3,r1,LSR #16
        ORR      r0,r3,r1,LSL #16
        
        MEND

TableRBIT_V1
        DCD  0x55555555,0x33333333,0x0f0f0f0f,0x00ff00ff


MYRBIT使用方法:



        进栈
        MOVS   R0,cntrbitrev
        MOVS   R1,index        
        MYRBIT tmp2
        MOV    tmp2,R0
        出栈

文章评论1条评论)

登录后参与讨论

用户504624 2009-7-13 09:09

博主你好,在21IC版面上看到你的关于STM32的FFT 讨论,STM32的FFT库只提供基4的FFT运算,现在我需要做128点FFT,能否将你的基2 FFT代码发一份给我,谢谢。 我的邮箱:262492820@qq.com
相关推荐阅读
用户479664 2009-12-30 17:07
CRC校验之 MSP430与STM32通吃版
CRC是一个必备工具。在工程上,特别是通信。好比网卡芯片,无效RF CC500 CC1100等芯片内部都有CRC电路。...
用户479664 2009-09-01 17:59
TMS320F280X SPI SPIA使用入门与总结
TMS320F280X SPI SPIA使用入门与总结Netjob @ 2009年 8月31日晚我使用过NXP ARM LPC2138的SPI口,ATMEL AT91SAM7S256的SPI,MSP4...
用户479664 2009-08-25 23:09
STM32 CAN 标称位时间计算
以知 CAN总线 每秒发送的位数,即 最大传输 比特率是 1Mb/s( 1 兆位每秒)这样 CAN总线的【最小标称位时间】就是  1 μs,简单的说就是 发送 1 位要1 μs时间。根据ISO1189...
用户479664 2009-08-25 23:07
精解 SPI 的 CPHA 时钟相位 与CPLK 时钟极性
精解 SPI 的 CPHA 时钟相位 与CPLK 时钟极性Netjob @ 2009-08-01...
用户479664 2009-06-18 23:00
STM32 Hello World!
https://static.assets-stash.eet-china.com/album/old-resources/2008/12/12/8ee2aa15-a51b-441d-96f5-a15...
用户479664 2009-05-11 23:56
精解 Solder Mask 和Paste Mask 区别
Solder Mask Layers【阻焊层】。这个是反显层! 有的表示无的,无的表示有的嘛,不明白?你在Solder Mask Layer【有TopSolder 和BottomSolder】上FIL...
我要评论
1
11
关闭 站长推荐上一条 /2 下一条