리눅스 & 안드로이드2014. 5. 15. 16:20

Arduino 보드에서 Nokia Tune을 들어볼 수 있다.

 

해당 Note는 다음과 같다.

NOTE_E5, NOTE_D5, NOTE_FS4, NOTE_GS4, NOTE_CS5, NOTE_B4, NOTE_D4, NOTE_E4,

NOTE_B4, NOTE_A4, NOTE_CS4, NOTE_E4, NOTE_A4

 

각각에 대한 duration은 다음과 같다.

8, 8, 4, 4, 8, 8, 4, 4, 8, 8, 4, 4, 1

 

'리눅스 & 안드로이드' 카테고리의 다른 글

완전 만족하고 있는 G2 (LG-F320L)  (0) 2014.06.11
NDK에서 include path  (0) 2014.06.05
First arduino in my life  (0) 2014.05.13
NDK에서 C++ STL(C++11) 사용하는 방법  (0) 2014.05.12
vim에서 ^M 제거  (0) 2014.03.05
Posted by 세월의돌
리눅스 & 안드로이드2014. 5. 13. 18:11

평택에 강의를 들으러 왔다.

이래저래 필요한 교육이라 생각했는데, 인기 강좌이기도 하고 수강 가능인원도 적어서 신청이 어려웠다.

그래서 올해는 수강신청 기간을 모니터링 해서 잽싸게 신청에 성공했다.

 

ARDUINO라는 말은 많이 들어봤고, 이를 이용한 kickstarter 프로젝트도 많은 것으로 알고 있었지만 뭔지는 잘 몰랐다.

그런데 오늘 교육을 받으면서, 10년도 전에 만져봤던 빵판에 아두이노 보드를 만들어 봤다.

만들어보고 나니, 그 옛날 과학상자를 다시 가지고 노는 느낌이랄까?

전선을 잘라 끼우고, 프로그램으로 LED도 껐다 켰다 하고 정말 재미 있더라.

이런 저런 센서들을붙여보면 다양한 응용을 할 수 있겠다는 생각이 들었다.

 

아이들이 초등학교 3~4학년 정도 되면, 함께 이런저런 작업들을 함께 해 볼 수도 있겠다 싶더라.

오늘이 첫 날인데 나머지 이틀도 정말 기대된다.

내일 부터는 실제 arduino 보드를 가지고 실습한다! :)

 

 

 


'리눅스 & 안드로이드' 카테고리의 다른 글

NDK에서 include path  (0) 2014.06.05
Nokia Tune on arduino  (0) 2014.05.15
NDK에서 C++ STL(C++11) 사용하는 방법  (0) 2014.05.12
vim에서 ^M 제거  (0) 2014.03.05
smp_rmb() 가 뭐하는 놈이냐?  (0) 2014.01.22
Posted by 세월의돌
리눅스 & 안드로이드2014. 5. 12. 16:27

Open Source library를 android에서 사용하기 위해 NDK로 빌드를 해야 할 필요가 생겼다.

그 옛날(?) Gingerbread 일 때는, NDK에서 STL을 지원하지 않아서 stlport를 직접 빌드해서 넣거나, NDK에 stlport를 추가 해 놓은 NDK 버전을 사용해야 했었는데, 지금은 정말 편 해 졌더라.

MS Windows + NDK 환경에서 STL을 이용하고하 할 경우 아래와 같이 하면 간단히 해결된다. (정말 초 간단 함-0-)

 

  1. 우선 NDK를 다운로드 받아서 적당한 위치에 압축을 풀어준다.
    설치과정은 필요 없으며, 현재 최신 버전은 Android NDK, Revision 10e (May 2015) 이다.

  2. 소스 디렉토리를 구성한다.
    빌드 하고자 하는 소스는 jni 디렉토리 아래에 위치 해야 하며, 해당 디렉토리에 Android.mk / Application.mk 파일도 위치 해 있어야 한다. (ex. prj_root/jni/Android.mk, prj_root/jni/Application.mk 등)

  3. Android.mk 파일은 다른 Android.mk 파일을 참고하되, stl을 사용하기 위해서 추가해야 하는 내용은 없다.

  4. (여기가 중요!) Application.mk 파일이 중요한데, 여기에 다음과 같은 한 줄을 추가하면 C++11 STL이 shared library로 포함된다.
    APP_STL := stlport_static
    APP_STL := gnustl_shared
    APP_CPPFLAGS += -std=c++11

  5. 위 한 줄이면, include나 link path를 추가할 필요가 없다!!!
    단, 본인의 모듈에만 적용하고 싶다면, Android.mk 파일에
    LOCAL_CPPFLAGS += -std=c++11

  6. 여기에 추가로, tool chain을 선택할 수 있다. (gcc / clang)
    Application.mk 파일에 아래와 같이 추가해 주면 된다.
    NDK_TOOLCHAIN_VERSION := 4.8
    또는
    NDK_TOOLCHAIN_VERSION := clang

  7. 빌드는 (위의 예에서) prj_root 디렉토리에서, (NDK PATH)\ndk-build.cmd 를 실행하면 된다.

 

NDK_TOOLCHAIN_VERSION := clang

APP_STL := gnustl_shared

APP_CPPFLAGS += -std=c++11


이렇게 하면, 간단히 STL을 이용할 수 있다.

GB 시절(?)에 stl 사용하려고 삽질 했던걸 생각하면, 정말 껌이 되었구나!!! (__)

 

Posted by 세월의돌
:%s/[ctrl+v,m]//g

 

[ctrl+v, m]은 실제로 ctrl+v 키와 ctrl+m 키를 순차적으로 입력하여 ^M을 입력하는 부분이다.

 

Posted by 세월의돌
리눅스 & 안드로이드2014. 1. 22. 14:43

소스 분석을 하다가 smp_rmb()라는 놈이 나왔는데, 처음 보는 물건이라 뭔가 궁금해서 찾아 보았다.

주석에는 "Make sure reads order"라고 되어 있지만, 잘 이해가 되지 않았다.

https://kldp.org/node/84286 글의 내용(Q&A)을 통해 이해가 되었다.


간략히 정리 하자면,

smp_rmb()의 rmb는 read memory barrier의 약자로, smp_rmb() 호출의 앞/뒤 문장에서의
메모리 읽기 순서를 보장하기 위한 것이다.

컴파일러나 CPU의 입장에서, 앞/뒤 문장이 의존성이 없다고 판단될 경우 최적화 관점에서,
out-of-order execution이 일어날 수 있는데, 이런 경우를 원천봉쇄 하고자 할 때 사용하는 듯.


Posted by 세월의돌

DOS(cmd.exe)에서 주기적으로 android debugfs에 특정 노드를 읽어서 상태를 확인해야 할 필요가 생겼다.

그래서 구글링으로 간단하게 batch script를 만들어 봤다.


@echo off

:loop

adb shell "명령어"

ping 192.0.2.2 -n 1 -w 20 > nul

goto loop


위와 같은 내용을 배치파일(batch file, ex. test.bat)로 만들어서, 저장 후 실행하면 됨.


여기서 핵심(?)은 goto로 loop를 돌리고, ping으로 sleep을 대체했다는 점.


Posted by 세월의돌

Android.mk 파일에서 보통 ifeq / ifneq / elif / else / endif 등을 이용해서 CFLAG에 대해 조건부 설정을 한다.

그런데 오늘 기존에 ifeq / endif를 이용해서 설정되어 있던 문장에 추가 조건을 or 해야하는 상황이 있었다.

나름 잘 알고 있다고 생각 했는데, or 를 어떻게 붙여야되나 막막했다. ㅠㅠ

그래서 찾아보니 직접적인 keyword는 없고 GNU make system의 filter function을 사용하면 되더라.


ifeq ($(SYMBOL), XXX)

XXX, YYY에 대한 공통 작업

endif

ifeq ($(SYMBOL), YYY)

XXX, YYY에 대한 공통작업

endif


위와같이 SYMBOL이 XXX나 YYY로 설정되어 있는 경우 공통 작업을 하도록 설정하고 싶다면 아래와 같이 수정할 수 있다.


ifneq ($(filter XXX YYY, $(SYMBOL)), )

XXX, YYY에 대한 공통작업

endif


위와 같이 filter function을 사용하면 간단하게 Android.mk 파일에서 or를 구현할 수 있다.


Posted by 세월의돌
리눅스 & 안드로이드2013. 6. 22. 18:33

오늘 소스를 보다가 __builtin_expect 라는 함수를 보게 되었다.

소스상에서는 아무리 찾아봐도 없는 symbol.

그래서 구글링 해 보니, 아래와 같은 설명이 있었다.


— Built-in Function: long __builtin_expect (long exp, long c)


You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (-fprofile-arcs), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect.

The return value is the value of exp, which should be an integral expression. The semantics of the built-in are that it is expected that exp == c. For example:

          if (__builtin_expect (x, 0))
            foo ();

indicates that we do not expect to call foo, since we expect x to be zero. Since you are limited to integral expressions for exp, you should use constructions such as

          if (__builtin_expect (ptr != NULL, 1))
            foo (*ptr);

when testing pointer or floating-point values.


즉, __builtin_expect라는 함수는 gcc에 내장되어 있는 함수이고, x를 반환하는 단순한 기능을 한다.

그러나, runtime에 CPU가 branch prediction을 하는데 힌트를 줘서 성능을 높이는데 사용될 수 있다.

CPU가 해당 conditional branch를 수행할 때, 대부분의 경우는, 두 번째 인자인 c의 값으로 판정된다는 힌트를 줘서 branch prediction의 hit ratio를 높일 수 있다는 것.


다시 풀어 얘기하자면,

if (__builtin_expect (x, 0)) STATEMENT_A; else STATEMENT_B; 와 같은 문장을 실행하는 경우,

x는 대부분의 경우 0이라는 힌트를 줘서, CPU가 STATEMENT_B를 미리 실행할 수 있도록 해준다.


정말 모르는게 많아-_-;


P.S. 이런 친절한 설명이 있구나.

http://minjang.egloos.com/561972

http://chammoru.egloos.com/4375371 assembly로 까지 확인되어 있음 :-)

Posted by 세월의돌
리눅스 & 안드로이드2013. 2. 27. 15:52

출처: http://www.androidside.com/bbs/board.php?bo_table=501&wr_id=2610#c_2611


- 여러개의 device를 연결했을 경우 선택해서 사용할 수 있습니다.

adb -d logcat  (device)

adb -e logcat  (emulator)

adb -s emulator-xxx logcat   (device serial)


- 쉘

adb -d shell


- apk 설치

adb -d install test.apk

adb -d shell

# pm install /sdcard/test.apk


- 재설치

adb -d install -r test.apk


- 사인 문제로 재설치 안될 경우 오버라이트로 설치

adb -d push test.apk /system/app


- 텍스트 입력입니다. 주로 터치키보드로 긴 URL이나 긴 비밀번호 입력하기 힘들때 사용합니다.

adb shell input text "삼천궁녀"


- 디버깅 용도로 아주 가끔 사용합니다. 랜덤 이벤트로 테스트합니다.

adb shell monkey -v 1000 com.test.app1


- 특정 액티비티를 실행합니다.

adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings


Posted by 세월의돌
리눅스 & 안드로이드2013. 2. 25. 13:38

Ubuntu for smartphone을 NEXUS 4에 올려보고 싶었는데, 회사에서는 Ubuntu를 local에서 사용할 때 가장 간단한 방법인
virtualbox를 사용할 수 없었다.

이런 저런 시도 끝에, 가장 속편한 방법이 멀티부팅 이었다.


멀티부팅 후, 필요한 건 GRUB을 다시 NTLDR(?)로 복원하는 일!

찾아보니 미디어를 가지고 다시 부팅해야 한다고 되어 있더라.

그래서 혹시 Windows 가동중에는 안되는 건가 하고 고민하고 있다가,
그냥 ISO 이미지를 마운트 해서 시도해 보았는데 잘 된다 : )

방법은 간단하다.

cmd(도스창)을 실행해서, 마운트한 이미지의 아래 경로로 이동하여 명령어를 실행하면 끝!


G:\boot>bootsect /nt60 c: /mbr


여기서 G:는 iso 이미지가 마운트 된 드라이브, C: 는 Windows 7이 설치된 드라이브 임


Posted by 세월의돌