The Boot Process

Posted by 빵빵빵
2015/10/08 10:23 공작/비글보드



http://processors.wiki.ti.com/index.php/The_Boot_Process#2nd_Stage_Bootloader:_SPL

부팅프로세스 4단계에 대한 설명

내장 메모리가 작기 때문에 부팅 프로세스의 단계를 나눠 처리한다.

요기까지는 2015/10/08 10:23 작성.
요기부터는 2015/12/29 작성

요약을 해볼 생각이다. 간간이 "(주. 이런저런 내용)" 로 번역하다가 내 생각도 넣었다.
기본적으로 반말로 작성하고, 만나서 이야기할때는 존대말로 해줄꺼다.

위 링크를 가보면 아래와 같은 그림이 나온다. 부트로더가 이렇게 4개로 짜개져 있다는 소리다.
참고 : SPL (or Secondary Program Loader)

AM335x Bootloader Order

첫번째 부트로더 : ROM Code
디바이스가 전기가 딱!! 들어와서 기동될때 처음으로 읽어 들이는 명령어로 롬에 장착된 코드이다.
하는 일은 크가 두가지로 나뉘는데
 -디바이스 환경설정과 프라이머리 페리페럴의 초기화
   * Stack setup
   * 와치독 타이머 1 환경설정(3분으로 설정)
   * PLL과 시스템 클럭 환경설정
-다음 부트로더를 위한 디바이스 준비
   * 다음 부트로더(SPL) 체크
   * 다음 부트로더를 메모리로 이동

다음부트로더의 설정은 SYSBOOT[15:0]핀의 전압(V) 레벨로 한다. (주의 이 핀들은 다른 부트 파리미터-크리스탈 프리퀀시, 외부 메모리 버스 너비같은 거-도 설정한다. 데이터 쉬트 보고 자기 보드에 맞게 설정하란다. 글지.. 각자 보드 상황이 다를테니깐... 내장 낸드가 있는지 없는지 티플레시로 할껀지... 등등 상황이 다르것지..) 자세한건 데이터시트의 부트 파라미터 정보나 테크니털 레퍼런스 메뉴얼 컬러드 텍스트 26장을 보랜다... (주. 친절한데... 이런거까지 번역하니 쫌 그렇네.., 참고 : http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User's_Guide#Two_stage_U-Boot_design )

두번째 부트로더 : SPL(Secondary Program Loader)
대략 MLO 파일을 SPL이라고 한다. SPL은 U-Boot의 첫번째 단계이고, 부트 소스에서(주. 부팅되는 미디어인 듯..) 램으로 읽히고, 아주 기본적인 환경설정이나 사용자 명령, 그리고 다음 부트로더인 U-Boot를 실행시킨다.


세번째 부트로더 : U-BOOT
시리얼을 통해 다양한 명령과 커널 부팅 환경을 설정할 수 있게 한다. 커널부트 파라미터와 커널 부트 커맨드를 사용할 수 있다. uEnv.txt(주. ramfs의 /boot 에 uEnv.txt가 있다.)에 있는 환경 변수도 사용 가능하다. printenv, setenv, saveenv로 명령을 조회, 수정, 저장할 수 있다.

네번째 부트로더 : Linux Kernel
uimage는 커널에 해더가 추가된 이미지이다. 해더는 64kB이고, 타켓 아키텍쳐, OS, 커널 사이즈, 엔트리 포인트(주. 커널이 시작되는 진입점) 등등의 정보를 가지고 있다. U-Boot에 의해 uImage가 부팅될때 해더정보가 표시된다.

UImage header output on kernel boot

부팅이 메모리 맵은 다음과 같다.
http://processors.wiki.ti.com/images/d/d4/BOOT_PROCESS_STAGES.png
2015/10/08 10:23 2015/10/08 10:23

Bitmap too large to be uploaded into a texture 에러 메시지

Posted by 빵빵빵
2015/03/13 15:18 전산(컴퓨터)/안드로이드



내가 경험한 메시지는 정확하게 이렇게 나온다.

W/OpenGLRenderer﹕ Bitmap too large to be uploaded into a texture (5100x4212, max=4096x4096)



안드로이드에서 ImageView 에다가 좀 해상도가 나가는(?) 이미지를 올리면 이런 메시지가 나오는 경우가 있다.

실제 이미지 사이즈는 4096x4096보다 훨씬 작은데도 말이다.
(나는 1700x1404 이었다 절반도 안되는데 막 이레... ㅡㅡ;)


황당한 것은 롤리팝(5.0)이 올라간 넥서스 5에서 퍽퍽 난다.... 죽지는 않고 이미지가 안나오고 흰 화면만 나올 뿐이다.

돌아버리는 줄알았다..

똑같은 apk를 프로요나 진저브레드에 설치해서 돌려보면 잘 돌아간다.

아놔... 이 시키들 뭘 바꾼겨??? 라는 생각을 했지만... 뭐... 갸들도 합리적이라 생각해서 뭔가를 바꿧겠지...



원인을 알아보자...

drawable 폴더에 있는 나의 이미지 파일은 drawable-mdpi 에 넣은거랑 동일하다.

왜??? 거기가 1dp == 1px 이니깐... 근데... 내 안드로이드 기기가 xxhdpi(1080x1920)이라면 mdpi 꺼를 확대해서 사용한다.

몇배???

3배!!! ㅡㅡ;;;;

나의 경우는 1700*3 x 1404*3 = 5100 x 4212 딱 맞다~ 에러 메시지에 나온 얼토당토 않은 초고해상도가 이렇게 나온 것이었다.

췟!!! 이게 뭐다냥...


이제 해결을 해보자

우선 완전 간단하게 해결 하는 방법 :
/drawable 에 있는 이미지 파일을 /drawable-nodpi 폴더로 이동한다.
폴더가 없으면 /drawable 와 같은 레벨에 만들면 된다. dpi를 적용하지 않는 이미지가 저장되는 파일들이다.
당근 xxhdpi 단말기에서도 확대를 하지 않고 그대로 쓴다.

해결은 당장 되지만 이미지의 퀄리티는 쫌 떨어져 보인다.


쬐끔 복잡하게 해결 하는 방법 :
drawable-mdpi, hdpi, xhdpi, xxhdpi 에다가 각각의 화면 단위에 맞게 이미지를 만들어 주는 것이다.
같은 이미지를 해상도를 달리하여 저장하는 작업이기 때문에 쫌 까다롭겠지만 괸찮은 퀄리티의 이미지를 보여줄 수 있다.

2015/03/13 15:18 2015/03/13 15:18

@SuppressLint('NewApi') 와 @TargetApi 의 차이점? 다른점? 올바른 이해?

Posted by 빵빵빵
2015/03/13 13:01 전산(컴퓨터)/안드로이드



요즘 안드로이드 프로그램을 짜고 있는데..

인터넷에 널려 있는 코드 짜투리를 붙이면 간혹 Call requires API level 10(혹은 그 이상) (current min is 8 혹은 그 이하) 라는 메시지를 볼 수 있다.

아.... 겨우 찾아내서 붙여볼려고 했더니.. 컴팔도 안되고 짜증을 유발시킨다.

해결 방법을 찾아보면 @SuppressLint('NewApi') 와 @TargetApi라는 애노테이션이 언급된다.

둘의 차이가 뭘까....


@SuppressLint('NewApi') 
모든 레벨의 API에서 Lint 에러를 무시하겠다라는 의미다.
따라서 이녀석이 붙어 있는 함수는 프로그래머가 안드로이드 버전에 따라 호출을 할것인지 말것인지 일일이 구분해줘야 한다. 

예를들어
AAAA() 함수 위에 @SuppressLint('NewApi') 가 선언 되어 있고 그 함수 안에서
BBBB() 함수를 호출하는데 이게 API 11에서 지원하는 함수라면,
프로그래머는 그 앱이 실행되고 있는 안드로이드 기기가 API 11을 지원하는지 판단해서 AAAA()나 BBBB()를 호출해야 한다.
만일 안드로이드가 API 10인데 BBBB()를 호출해 버리면... 없는 함수를 호출해 버리니깐 맛팅이가 가 버릴것이다.

minSdkVersion 을 11로 바꿔주면 이놈을 붙일 필요 없이 걍 해결 되지만..
허니콤 미만(진저 이하)에서는 이 앱을 사용할 수 없게 됩니다.

심하게 말해서 최신 API 써서 만들어서 minSdkVersion을 21(롤리팝)로 해주면....?
2015년 02월 10일 기준 안드로이드 전체 사용자중 1.8%만이 플레이스토어에서 다운로드 할 수 있다.
98.2%의 수많은 사용자는 검색조차 안된다.
ㅡㅡ;;;;;;;; 이건 정신 나간 짓이죠!

@TargetApi
@TargetApi( Build.VERSION_CODES.GINGERBREAD ) 라고 해 주면 이 함수는 진저브레드(API 9)이하에서 잘 돌게 프로그램 해놨다~
라는 의미로 사용되는 겁니다.
minSdkVersion 이 10 이상으로 올라가면 당연히 Lint 에러가 또 발생합니다.


간단하게 끝!
2015/03/13 13:01 2015/03/13 13:01