我在avr上面用4M开方32bit也只200多uS啊。高手都怎么搞的,呵呵。 汇编,献丑了。 在STM32上面36M可能50uS都不到就搞定了。抽空移植一下吧。 这个程序是我原创,以前发过贴的。
.org 0x0000
main: ldi r16, 0x21 ldi r17, 0x43 ldi r18, 0x65 ldi r19, 0x87
rcall sqrt here: rjmp here
//U16 Sqrt(U32 num) //input : num -> r19:r16 //output: res -> r17:r16 //use volatile registers r9:r0, //r1:r0 -> result //r4:r2 -> result left shift temp //r26:r24 -> source num left shift extend
sqrt: clr r0 ;clr result clr r1 movw r2, r0 ;clr result shift movw r4, r0 ;const - 0 movw r24,r0 movw r26,r0 ldi r27,0x11;
wait: rcall shiftb rcall shiftb dec r27 cpi r27, 0x1 breq cal cpi r24, 0 breq wait cal: inc r2 cp r24, r2;extend - (4 result + 1) cpc r25, r3 cpc r26, r4 brcc hig clc rjmp calend hig: sub r24, r2 sbc r25, r3 sbc r26, r4 sec
calend: rol r0 ;result reflash rol r1
dec r27 breq cend
movw r2, r0;init 4 * result clr r4 rcall shifta;result and input number shift rcall shifta rjmp cal
cend: movw r16,r0 ret
shifta: lsl r2 rol r3 rol r4 shiftb:lsl r16 rol r17 rol r18 rol r19 rol r24 rol r25 rol r26 ret |