SD 카드 속도에 대해서는 아래 포스팅에서 다뤘었다
https://bsp-martin.tistory.com/16
SD UHS-I
SD association 은 sd 표준은 만들고 표준이 명시된 스펙 기술문서를 배포한다 SD는 2.0버전까지는 HS(high speed)클래스로 동작한다. HS: 50Mhz 최대 25MB/s UHS-I 은 다음과같다. SDR12: 25 Mhz 최대 12 MB/s SD..
bsp-martin.tistory.com
그렇다면 현재 SD카드의 속도를 어떻게 측정할 것인가?
리눅스커널의 모둘중
CONFIG_MMC_TEST 를 이용하면 된다.
https://bsp-martin.tistory.com/11
Kconfig menuconfig 드라이버 추가해 보기
Kernel 드라이버를 잘 보려면 menuconfig 에 익숙해야한다. 예를들어 새로운 USB Ethernt 드라이버를 현재 Embedded 시스템에 추가하려면 어떻게 해야할까? 1. USB Ethernt 드라이버를 USB 드라이버를 찾으면 된
bsp-martin.tistory.com
커널의 menuconfig 수정으로
위 CONFIG_MMC_TEST를 모듈형식으로 설정해두면 된다.
모듈 빌드를하게되면 mmc_test.ko 파일이 나온다.
되로록 커널 로그레벨은 낮추어서 불필요한 로그가 나오지 않는 상태에서 Test 를 수행하길 바란다.
또한 SD 카드의 미디어는 재사용이 안됨으로 백업이 필요하다. (새SD를 이용하길 추천함)
아래는 mmc_test.sh 을 필자가 직접 제작하였다.
#!/bin/sh
TOP=`pwd`
MMC_DRIVER=mmc0 #$MMC_DRIVER
DIR_MMC=/sys/bus/mmc/drivers/mmcblk
DIR_MMC_TEST=/sys/bus/mmc/drivers/mmc_test
MMC_NUM=`ls /sys/kernel/debug/$MMC_DRIVER/ | grep $MMC_DRIVER | cut -d':' -f2`
DIR_MMC_NN=/sys/kernel/debug/$MMC_DRIVER/$MMC_DRIVER\:${MMC_NUM}
HOSTNAME=`/bin/hostname`
MODULE=/mmc_test.ko
RET=
SUCCESS=0
FAIL=1
READ_TEST=39
# Write performance with blocking req 4k to 4MB
WRITE_PERF_NUM=37
# Read performance with blocking req 4k to 4MB
READ_PERF_NUM=39
TEST_NUM=$READ_PERF_NUM
existfile() {
if [ -e $1 ]; then
RET=$SUCCESS
else
echo "[CHK FILE] ERR: $1"
RET=$FAIL
fi
}
mmc_unbind() {
existfile ${DIR_MMC}
if [ $RET = $SUCCESS ]; then
echo $MMC_DRIVER:${MMC_NUM} > ${DIR_MMC}/unbind
existfile ${DIR_MMC}/unbind
if [ $RET = $SUCCESS ]; then
echo "[mmc_unbind] unbind $DIR_MMC"
return
else
echo "[mmc_unbind] No such file ${DIR_MMC}/unbind"
exit -1
fi
else
echo "[mmc_unbind] No directory exist \"$DIR_MMC\""
exit
fi
}
mmc_test_unbind() {
existfile ${DIR_MMC_TEST}
if [ $RET = $SUCCESS ]; then
echo $MMC_DRIVER:${MMC_NUM} > ${DIR_MMC_TEST}/unbind
echo "[mmc_test_unbind] unbind $DIR_MMC_TEST"
echo "[mmc_test_unbind] rmmod"
rmmod mmc_test
else
echo "[mmc_test_unbind] No directory exist \"$DIR_MMC_TEST\""
exit
fi
}
mmc_test_work() {
echo "[mmc_test_work] Started...(num_mmc: $MMC_NUM)"
mmc_unbind
sleep 1
echo "[mmc_test_work] insmod"
existfile ${MODULE}
if [ $RET = $SUCCESS ]; then
insmod ${MODULE}
else
echo "[mmc_test_work] No such file... ${MODULE}"
exit -1
fi
sleep 1
echo "[mmc_test_work] measurement start"
existfile ${DIR_MMC_NN}/test
if [ $RET = $SUCCESS ]; then
echo $TEST_NUM > ${DIR_MMC_NN}/test
else
echo "[mmc_test_work] No such file ${DIR_MMC_NN}/test"
fi
sleep 3
dmesg > ${2}
sync
echo "[mmc_test_work] $1 End..."
sleep 1
mmc_test_unbind
echo "[mmc_test_work] mount mmc"
echo $MMC_DRIVER:${MMC_NUM} > ${DIR_MMC}/bind
sleep 1
}
### MAIN START
##{
mmc_test_work mmc_test result.txt
sync
##}
### MAIN END
사용방법
mmc_test.ko 파일이 / 에 존재함
Usage:
./mmc_test.sh
실행결과
[ 261.009158] mmc0: Starting tests of card mmc0:59b4...
[ 261.014896] mmc0: Test case 37. Write performance with blocking req 4k to 4MB...
[ 353.956760] mmc0: Transfer of 32768 x 8 sectors (32768 x 4 KiB) took 92.933164836 seconds (1444 kB/s, 1410 KiB/s, 352.59 IOPS, sg_len 1)
[ 400.809757] mmc0: Transfer of 16384 x 16 sectors (16384 x 8 KiB) took 46.839151523 seconds (2865 kB/s, 2798 KiB/s, 349.79 IOPS, sg_len 1)
[ 427.756582] mmc0: Transfer of 8192 x 32 sectors (8192 x 16 KiB) took 26.932881263 seconds (4983 kB/s, 4866 KiB/s, 304.16 IOPS, sg_len 1)
[ 442.149457] mmc0: Transfer of 4096 x 64 sectors (4096 x 32 KiB) took 14.379054673 seconds (9334 kB/s, 9115 KiB/s, 284.85 IOPS, sg_len 1)
[ 452.039735] mmc0: Transfer of 2048 x 128 sectors (2048 x 64 KiB) took 9.876443172 seconds (13589 kB/s, 13271 KiB/s, 207.36 IOPS, sg_len 2)
[ 456.955595] mmc0: Transfer of 1024 x 256 sectors (1024 x 128 KiB) took 4.901844127 seconds (27381 kB/s, 26739 KiB/s, 208.90 IOPS, sg_len 4)
[ 461.576142] mmc0: Transfer of 512 x 512 sectors (512 x 256 KiB) took 4.606421127 seconds (29137 kB/s, 28454 KiB/s, 111.14 IOPS, sg_len 8)
[ 464.394878] mmc0: Transfer of 256 x 1024 sectors (256 x 512 KiB) took 2.804807835 seconds (47852 kB/s, 46731 KiB/s, 91.27 IOPS, sg_len 16)
[ 467.953230] mmc0: Transfer of 128 x 2048 sectors (128 x 1024 KiB) took 3.544317002 seconds (37868 kB/s, 36980 KiB/s, 36.11 IOPS, sg_len 32)
[ 470.115874] mmc0: Transfer of 32 x 8192 sectors (32 x 4096 KiB) took 2.148521126 seconds (62469 kB/s, 61005 KiB/s, 14.89 IOPS, sg_len 128)
실행결과를 읽는 방법은 다음과 같다.
[ 470.115874] mmc0: Transfer of 32 x 8192 sectors (32 x 4096 KiB) took 2.148521126 seconds (62469 kB/s, 61005 KiB/s, 14.89 IOPS, sg_len 128)
즉, 62469 kB/s 속도
댓글