wince系統下用arm彙編實現特定長度的memory拷貝函數,降低系統cpuloading

之前有做avin優化,降低cpu的使用率時。有自己用arm彙編來實現一個內存拷貝的函數,主要是用來替換原來驅動程序中memcpy函數。現在將源碼貼在這裏,怕自己以後遺忘。呵呵。

1.知識要點:

   arm彙編

   arm體系架構下的apcs

   vs2005的編譯器不支持內嵌彙編,但可以編譯arm彙編文件,生成obj文件。

2.源代碼:

因爲這個函數是爲avin驅動專門寫的,所以這個現在只支持長度是4字節倍數的拷貝。

函數原型:void _avin_memcpy(unsigned char* dst,unsigned char *src,unsigned int length);
;;benson_20110315 modify for avin T_fpga_fw

  INCLUDE kxarm.h
  TEXTAREA


  LEAF_ENTRY  _avin_memcpy

  stmfd sp!, {r4 - r11}
  
  and   r3,r2,#31  
  mov   r2,r2,LSR #5
 
  
  cmp     r2,#0
  beq     %F2
1
  ldmia r1!, {r4 - r11}
  stmia r0!, {r4 - r11}
  
  subs  r2, r2, #1
  bne  %B1
2
  add   pc, pc, r3

  b            MEMCPY_END ;0*4
  b            MEMCPY4    ;1*4
  b            MEMCPY8    ;2*4
  b            MEMCPY12   ;3*4
  b            MEMCPY16   ;4*4
  b            MEMCPY20   ;5*4
  b            MEMCPY24   ;6*4
  b            MEMCPY28   ;7*4  
MEMCPY28
  ldmia      r1!,{r4 - r10}
  stmia      r0!,{r4 - r10}
  b          MEMCPY_END
MEMCPY24
  ldmia      r1!,{r4 - r9}
  stmia      r0!,{r4 - r9}
  b          MEMCPY_END
MEMCPY20
  ldmia      r1!,{r4 - r8}
  stmia      r0!,{r4 - r8}
  b          MEMCPY_END
MEMCPY16
  ldmia      r1!,{r4 - r7}
  stmia      r0!,{r4 - r7}
  b          MEMCPY_END
MEMCPY12
  ldmia      r1!,{r4 - r6}
  stmia      r0!,{r4 - r6}
  b          MEMCPY_END
MEMCPY8
  ldmia      r1!,{r4 - r5}
  stmia      r0!,{r4 - r5}
  b          MEMCPY_END
MEMCPY4
  ldmia      r1!,{r4}
  stmia      r0!,{r4}
  b          MEMCPY_END    
MEMCPY_END
  ldmfd sp!,  {r4 - r11}
  
 IF Interworking :LOR: Thumbing
  bx  lr    ; Return with Thumb mode
 ELSE
  mov  pc, lr   ; Return
 ENDIF

    END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章