簡報: Power Management from Linux Kernel to Android

上週五 (June 19),Matt 跟我分享 Android 之上 Power Management 的背景概念、實做,以及可改進的方向,而論及 Android 的系統架構設計時,不免得先談談 Linux PM,期待這份簡報對進行系統移植與客製化的同好有助益:

授權方式採用 Creative Commons S-A 3.0,不完善與謬誤處,請多指教,謝謝!

read on
Posted 張貼者: jserv 於 凌晨4:36 on 2009年6月22日 星期一 | 0 意見
Filed under: , ,
 

升級 Android 內建 GNU Toolchain 到 gcc 4.4

GNU GCC 4.4 已於 Apr 21, 2009 正式釋出,伴隨眾多改進、修正,與硬體平台改善,詳情可見"GCC 4.4 Release Series Changes, New Features, and Fixes",不過 Android repository 裡頭的 prebuilt GNU Toolchain 仍停留在 gcc-4.2.1 (Release date: Jul 18, 2007),總是有些遺憾,且讓我們動手改變。

EMBINUX™ Lab 提供一份 prebuilt GNU Toolchain for Android,參考其 git 的更動,可建立一套基於 gcc-4.4 與 binutils-2.19.1 的 toolchain,筆者準備打包好的套件: toolchain-arm-eabi-4_4_0.tar.bz2。另外,因為 gcc-4.4 對於 C/C++ 語意更加嚴格,像是應用程式對 va_list 的使用就需要調整,筆者將這些小修改整理為 migrate-gcc44.patch。以下是簡要的升級方式:

# cd mydroid
# cd prebuilt/linux-x86/toolchain
# tar jxvf toolchain-arm-eabi-4_4_0.tar.bz2
# cd ../../..
# patch -p1 < migrate-gcc44.patch
重新編譯與建構 Android 即可。需要更動的部份,列出作參考:
# diffstat migrate-gcc44.patch
core/combo/linux-arm.mk | 2 +-
dist/sqlite3.h | 2 +-
envsetup.sh | 2 +-
pdk/ndk/samples/sample/Makefile.lib | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)

read on
Posted 張貼者: jserv 於 下午6:04 on 2009年6月18日 星期四 | 1 意見
Filed under: ,
 

改善 Android 中 memcpy 效能

在 Android 內部實做中,有許多細節涉及大量的 memcpy() 操作,比方說將一塊使用者定義的繪圖區域傳遞給 SurfaceFlinger 管理的過程,由於得先轉換成 texture,再對應為 Surface,之間至少需要三次 memcpy。由於 BeagleBoard (TI OMAP3) 透過 HDMI 輸出 (max: 1280x1024),居中涉及大量的繪圖操作,意味著 memcpy() 頻繁被呼叫著,對整體效能有顯著的影響,於是筆者花了一些時間分析。

Android 的 libc 實做 -- bionic -- 已包含針對 ARMv5 優化過的 memcpy(),詳情可參考 libc/arch-arm/bionic/memcpy.S,而 GNU Toolchain (glibc) 中,其實也有一份針對 ARMv5 優化過的 memcpy() 實做,也利用到 ARMv5 的 data prefetch 指令。既然我們採用 ARMv7 架構的 BeagleBoard,何不使用其引入的 NEON SIMD 加速指令集呢?以下就是在 BeagleBoard 所作的 benchmark:

數據如下:

  • glibc-armv5 : 181884276 B/s
  • bionic-armv5 : 225881095 B/s
  • armv7 : 269294302 B/s
參考的 ARM NEON 優化 memcpy() 實做如下: (arm-neon-memcpy.S from Måns Rullgård )
  1. .fpu neon
  2. .text

  3. .global memcpy_neon

  4. .func memcpy_neon
  5. memcpy_neon:
  6. push {r4-r11}
  7. mov r3, r0
  8. 1: subs r2, r2, #128
  9. pld [r1, #64]
  10. pld [r1, #256]
  11. pld [r1, #320]
  12. ldm r1!, {r4-r11}
  13. vld1.64 {d0-d3}, [r1,:128]!
  14. vld1.64 {d4-d7}, [r1,:128]!
  15. vld1.64 {d16-d19}, [r1,:128]!
  16. stm r3!, {r4-r11}
  17. vst1.64 {d0-d3}, [r3,:128]!
  18. vst1.64 {d4-d7}, [r3,:128]!
  19. vst1.64 {d16-d19}, [r3,:128]!
  20. bgt 1b
  21. pop {r4-r11}
  22. bx lr
  23. .endfunc
至於 SurfaceFlinger 的操作仍有優化的空間,稍後再討論。

read on
Posted 張貼者: jserv 於 下午2:34 on | 1 意見
Filed under: , , ,
 
Developer at 0xlab.