테스트

dependencies {
// compile fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':MPChartLib')
implementation fileTree(include: ['*.jar'], dir: 'libs')
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
implementation 'com.google.android.gms:play-services-maps:10.2.6'
implementation 'com.google.android.gms:play-services-location:10.2.6'
implementation 'com.google.maps.android:android-maps-utils:0.4+'
implementation 'com.github.PhilJay:MPAndroidChart-Realm:v2.0.2@aar'
implementation 'com.github.wseemann:FFmpegMediaPlayer:1.0.4'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'co.trikita:anvil-cardview-v7:0.5.2'
}

 

dependecies에서 library를 추가해줄 때


implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'

 

28.*.*의 버젼을 맞춰주지 않으면 appcompat 또는 support library에서 중복적으로 사용되는

라이브러리로 인하여 빌드시에 충돌이 일어난다.

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

LatLng로 GPS 주소 불러오기  (0) 2019.07.25
Android와 PHP서버 MySQL 연동  (0) 2019.07.08
Android webview에서 동영상 재생시키기  (0) 2016.08.04


출처 : http://nashorn.tistory.com/309


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

LatLng로 GPS 주소 불러오기  (0) 2019.07.25
Android와 PHP서버 MySQL 연동  (0) 2019.07.08
build.gradle 중복 라이브러리 문제  (0) 2019.07.08

출처 : http://withcoding.com/26

Kernel에서 ARM 빌드하기


참조

http://www.codingrun.com/2015/08/ububru-arm-linux-gcc.html?m=0

http://blog.secmem.org/560

https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/ch03.toolchain.html


1. Kernel source download

스터디를 2.6버전으로 하기 때문에 2.6버전을 다운받았다.

https://www.kernel.org/



2. toolchain 다운로드

$ wget https://www.dropbox.com/s/6s3f57wd4zie8ah/arm-eabi-4.4.3.zip


3. kernel make

kernel/arch/arm/configs 에서 원하는 config 이름을 본 뒤

make s3c24100_defconfig

make menuconfig

make zImage (arm에서 이미지 만드는 명령어)


4. kernel/Makefile 확인

약 184번째 줄 : ARCH와 CROSS_COMPILE 이 잘 설정되어야 한다.

ARCH = arm이 되겠고

CROSS_COMPILE = arm-eabi- 가 되겠다 


위의 내용을 ~/.bashrc에서 설정해준다.

vi ~/.bashrc


export ARCH=arm

export SUBARCH=arm

export CROSS_COMPILE=$HOME/Desktop/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

export PATH=$PATH:$HOME/Desktop/toolchain/arm-eabi-4.4.3/bin


source ~/.bashrc

위처럼 설정해주는것보다 Makefile에서 해주는게 좋지만 일단 Study기 때문에 이렇게 설정해서 진행

임베디드 리눅스 개발자는 하드웨어를 다루기 위해 디바이스 드라이버를 꼭 알아야 한다. 앞으로의 실습을 위해 기본개념부터 간단하게 소개한다.



목차

001. 운영체제로서의 리눅스

002. 리눅스 커널

003. 리눅스 드라이버



001. 운영체제로서의 리눅스

 운영체제의 이해를 위해서는 운영체제 구성하는 프로그램 소스와 설명 문서가 필요하다. Window같은 경우는 이러한 정보가 공개되어 있지 않지만 Linux의 경우 커널소스, 디바이스 드라이버 소스 등이 오픈소스로 제공되며 수많은 문서가 존재한다. 리눅스는 개발자들에 의해 수없이 수정되고 있으며 그 결과 우수한 성능을 보이며 메일 서버, 웹 서버 시스템, 임베디드 시스템 등 다양하게 쓰인다.



002. 리눅스 커널

 1) 리눅스 역사

 리누즈 토발즈가 만든 운영체제. 커널 + GNU프로젝트가 합세하면서 리눅스가 개발됨. 가장 사용화 됫던 버전은 2.6x 3.1x 등이있으며 현재 4.x 버전까지 나왔다. 컴파일러 : gcc


  2) 리눅스 커널의 기능

    - 프로세서 관리 

      병렬 프로세서 또는 시스템 프로세스를 효율적으로 할당하고 수행하도록 관리한다.


    - 프로세스 관리

 최소한 하나 이상의 프로세스가 동작, 태스크라고도 하며 일을 수행하는 기본 단위. 스케쥴러를 이용하여 여러 프로세스를 parallel하게 관리한다.


    - 메모리 관리

 프로세스 또는 실행 이미지가 동작하도록 가상 주소 공간을 제공하며 여러 보조 기억 장치 등이 존재한다.


    - 파일 시스템 관리

리눅스는 파일 시스템을 근간으로 설계 되었다. 리눅스 커널에 동작하는 모든 자원을 파일처럼 볼 수 있도록 통일된 인터페이스를 제공


- 디바이스 제어

하드웨어를 제어하기 위해서는 커널에서 디바이스 드라이버가 구현되어야 하며 디바이스 드라이버를 통해 주변 장치를 제어 할 수 있다.


- 네트워크 관리

리눅스 커널은 우수한 네트워크 관리 시스템을 가지고 있음 네트워크 디바이스 드라이버를 통해 효과적으로 네트워크 처리를 하고 있다. 암호화와 보안 특성이 견고하다.


  3) 리눅스 커널의 특징

프로세서와 시스템 메모리에 상주하면서 여러 자원을 관리하며 다중 프로세스를 구현한다. 배포된 소스를 사용자가 직접 수정할 수 있으며, 현존하는 운영체제중에서 가장 많은 프로세서와 플랫폼을 지원하며, 임베디드 시스템에서부터 엔터 프라이즈 환경까지 커버한다.


    - 모놀리식 커널

UNIX방식의 모놀리식 커널이며 OS를 구성하는 일반적 기능과 커널을 동일한 메모리 공간에 적재한 기법을 말한다. 마이크로 커널의 경우 Contrext switching이나 Process 간 통신이 이루어질 때 Cluck의 실행 비용 문제가 생기지만 모놀리식 커널은 동일 메모리에 있기 떄문에 이러한 요소를 줄일 수 있는 장점이 있다.


- 비선점형(커널 2.4) 선점형(커널 2.6)

비선점형 : 한 Process가 진행 될 때 CPU자원을 점유하게 되고, 이 프로세스가 종료되거나 인터럽트에 의한 종료가 되기 전까지 계속 점유되는 것을 말한다.

선점형 : CPU에서 이미 점유된 process가 있다 하더라도 이것을 중지하고 다른 process를 우선 처리 할 수 있다.


- 가상 메모리 시스템(VM)

http://akaseon.tistory.com/55

물리적 메모리 장치의 한계를 극복 할 수 있는 메모리 관리 기법으로써 MMU가 가상주소와 물리주소를 관리해 주는 역할을 한다. ARM의 경우 Cortex-A는 MMU가 존재하지만 비교적 가볍고 빠른처리를 지원하는 임베디드 특화된 Cortex-M같은 경우 MMU가 존재하지 않는 경우도 있다.


- No MMU 지원

자원이 제한적이거나 소량의 처리만 하는 임베디드 시스템의 경우 MMU디바이스가 없는 경우도 있다. Linux는 MMU가 없는 시스템도 지원한다.


- 가상 파일 시스템(VFS)

리눅스 커널의 가장 큰 특징 중 하나이며 다른 OS의 파일 시스템을 처리 할 수 있으며 사용자는 OS에 상관 없이 서로 다른 파일 시스템을 이용 할 수 있다. 대표적으로 ext2 부터 저널링 파일 시스템인 jfs를 수용 할 수 있으며 윈도우에서 동작하는 NTFS파일 시스템과 DOS용 파일 시스템도 처리 할 수 있다.


- 모듈을 이용한 커널 확장

커널 모듈이란 필요에 따라 커널에 로드하거나 언로드 할 수 있는 특정한 기능을 말한다. 리부팅 작업이 필요 없이 로드 언로드가 가능하며 자원 낭비 또한 줄일 수 있다. $lsmod를 통해 동작 모듈을 확인 가능하다.


- 커널 스레드

http://timewizhan.tistory.com/entry/%EC%BB%A4%EB%84%90-%EC%8A%A4%EB%A0%88%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C-1

커널에만 존재하는 스레드. $ps -ef를 통해 확인 가능하며 [??]이 되어 있는 것이 커널 스레드이다. 보통 프로세스를 for할 때 context switching에 따른 cpu자원 소모가 일어나게 되는데 커널에서만 동작하기 때문에 이러한 자원 사용을 줄일 수 있다.


- 멀티스레드 지원

프로세스를 생성하는 비용이 많이 들기 때문에 프로세스 관리 기법에서 경량화 된 멀티 스레드를 지원한다. MMU를 지원하지 않는 CPU에서는 메모리의 제한적 사항 때문에 process for보다 멀티 스레드 사용을 권장한다.


- 강력한 네트워크 지원

BSD 네트워크 처리 방식이기 떄문에 안정성이 높다. 또한 다양한 네트워크 디바이스 드랑리버를 지원한다


- GPL 라이선스 (General PUblic License)

GPL 코드를 사용한 SW는 반드시 공개해야 된다.




  4) 커널 소스의 구조



 Documentation  

 커널에 관련된 여러 문서들이 있다. 커널 소스를 분석할 때 먼저 참고하는 편이 좋다.

 arch            

 아키텍쳐 의존적인 코드들이 있다. 보통 boot, kernel, lib, mm 으로 구현되어 있다. 

 crypto           

 암호 처리 공동 함수

 drivers        

 각종 디바이스를 제어하기 위한 드라이버

 block, cdrom, char, net, pci, pnp, sbus, scsi, sound 등

 fs

 버추얼 파일 시스템 인터페이스

 coda, ext2, hpfs, msdos, nfs, ntfs, utfs 등

 include

 커널에 관계된 헤더 파일, asm-*은 아키텍쳐 관련, linux는 커널 관련 

 init             

 리눅스 커널 부팅할 때 호출되는 각종 초기화 처리 

 ipc            

 전통적 프로세스간 통신, 세마포어, 공유메모리, 메시지 큐

 kernel            

 커널의 핵심 코드. 시스템콜, 스케쥴러, 시그널 핸들링 등 

 lib

 kernel의 다른 부분에 의해 필요로 하는 라이브러리 코드. 예로 inflate.c는 부팅시  kernel 압출을 해제하고 메모리에 로드한다.

 mm

 버추얼 메모리 관리, 페이징, 커널 메모리

 net

 네트워크를 지원하며 많은 프로토콜이 있다.

 802.11, IPX, appletalk, ethernet, ipv6, bluetooth ...

 scripts

 커널이미지를 만들어주는 스크립트나 실행 파일이 있다.

 security

 보안 처리

 sound

 사운드 관련

 usr

 initramfs 시스템 구축 예제

 참고

 http://plucky.tistory.com/26   http://mintnlatte.tistory.c/162


    - Doccumentation

    디바이스 드라이버 작성자에게 필수 참고내용이 있는 디렉토리이다. 디바이스 드라이버 구현 방법 및 주의사항에 대한 내용들이 있다. 커널 컴파일과 관련된 문법 구조를 이해하고 싶으면 kbuild를 살펴 볼 것



    - arch

아키텍쳐(플랫폼)의 독립적인 소스코드가 존재한다.

alpha, arm, avr, blackfin, cris, frv, h8300, ia64, m32r, m68k, m68knommu, microblaze, mips, mn10300, parisc, powerpc, s390, sh, sparc, um, x86(i386), x86_64(i386의 64bit) 등이 있다. 


arch/kernel : Context switching, Thread Management

arch/lib : kernel이 사용하는 library의 구현 (하드웨어 dependent이기 때문에 일반 library보다 빠르다)

arch/mm : memory management 중에서 page fault 같은 hardware dependent한 부분을 구현

arch /boot : 부트스프랩트코드, 메모리 / 디바이스 설정



    - include

디바이스 드라이버를 작성하는 경우에 커널 소스를 추적해야 하는 경우도 있지만 헤더 파일을 찾는 경우가 더 많다. include/asm에는 아키텍쳐와 관련된 파일을, include/linux에는 리눅스 커널에서 아키텍처에 영향을 받지 않는 헤더 파일을 모아 놓는다 include/linux를 잘 살펴볼 것



  5) 커널 소스 탐색

grep 명령어 조합 (http://forum.falinux.com/zbxe/index.php?document_srl=562106&mid=lecture_tip)

Linux : Vi plugin 이용 (cscope, ctags, NerdTree)

Windows : Source insight를 이용

cscope 이용  (http://iamroot.org/wiki/doku.php?id=%EC%8A%A4%ED%84%B0%EB%94%94:cscope_%EC%82%AC%EC%9A%A9%EB%B2%95)
































ARM의 구조에 따른 효율적인 코딩

출처 : mds 아카데미 - ARM 프로세서 ARM11


Toolchain Option

컴파일러의 Optimization level을 설정 할 수 있다.

옵션

    -O0 : optimaization을 하지 않는다. 불필요한 코드 존재. Debugging에 적합

    -O1 : O0와 O2의 중간단계

    -O2 : full optimization, Code density가 좋음

    -g : O레벨과 상관없이 O0으로 컴파일 한다.

최적하를 할 경우 기본적인 코드 최적화 및 core에서 최대 성능을 내도록 명령어 순서 재배치가 이루어 진다.



소프트웨어 최적화

    - ARM 프로세서의 특징을 알아야 한다.

    - 성능 향상을 위해서는 프로그래머의 주의를 요구한다.

    - ARM에는 Division을 할 수 있는 하드웨어가 없다.

    - Unaligned acess를 지원하지 않는다.

    - ARM 명령은 조건부 실행이 가능하다.

    - 스택의 사용이 많으면 시스템 성능 감소한다.

    - ATPCS에 argumet가 전달된다.


Diviation(나눗셈) Modulo(나머지) 연산

    - ARM에는 Division을 위한 하드웨어가 없다.

    - Diviation 연산 : 최대한 power of 2로 나누어 질 수 있도록 한다. Inline barrel shifter가 사용되어 성능 감소가 없다.

    - Modulo 연산

Count = count ++ % 10     -    >    if(count++>=10) count=0;


add r1, r0, #`

mov r0, #10             -O1 or -O2    add  r0, r0, #1

bl __rt_udiv                 -     >     cmp  r0, #10             

mov r0,r1                                movcs r0, #0



Loop의 종료

    - Loop 명령 : for(), while(), do{}while() 등

    - 0으로 decrement를 하면 최적화가 가능하다.


for(loop=1; loop<=total; loop++)              ->      for(loop=total; loop!=0; loop--)


add r1, r1, #1

cmp r1, r0                               ->       subs  r1, r1, #1

ble  __loop                                             bne  __loop




Inline 함수에 의한 성능 향상

     - Subroutine 함수과 같이 사용이 편리

     - static _-inline void func (int a1, int a2)

     - 사용되지 않는 코드는 포함되지 않는다.


스택 사용 시 주의 사항


Argument 전달


변수 사용


Global과 static 변수의 메모리 배치








'리눅스 > 기타' 카테고리의 다른 글

.bashrc에서 예약어 등록하기  (0) 2019.07.08
리눅스 7z 압축풀기  (0) 2019.07.08
MCU 선정, Cortex 시리즈, 보드 선정  (0) 2016.03.09
bash shell  (0) 2016.01.25


Cortex-A9 / Cortex-M4 / IMX6 / IMX7 / HumminBoard



MCU 선정하기

리눅스 스터디를 시작하면서 어떠한 보드를 선정할까 많이 고민하였다.

주 파트가 자동차와 관련된 전장용 장비를 다뤄야 되다보니 전장 SOC 의 대표주자인 

NXP-freescale / STMicroelectronics / TI 등을 위주로 찾아보았다.


현재 freescale의 IMX285와 STM의 STA1078-Telemaco2를 다뤄보았으며 이를 기반으로 보드를 선정하려고 한다. Telemaco2의 경우 아직 지원되지 않는 기능이 부족해서(BR) Telemaco3를 기다려야 되는 상황이라서 Freescale의 IMX 시리즈를 살펴보았다. 그 중 IMX6의 스펙은 다음과 같다.


IMX6 시리즈

http://www.nxp.com/products/microcontrollers-and-processors/arm-processors/i.mx-applications-processors-based-on-arm-cores/i.mx-6-processors:IMX6X_SERIES?cof=0&am=0#staticFile


http://cache.nxp.com/files/32bit/doc/fact_sheet/IMX6SRSFS.pdf


http://cache.nxp.com/files/32bit/doc/brochure/FLYRIMXPRDCMPR.pdf

대부분의 CPU가 Cortex-A7과 A9을 쓰고 있다. 아직 찾아보지 않았지만 전장용에서는 Cortex-M4가 요즘 추세라고 한다. CortexM4를 지원해 주는 칩은 I.MX 6SoloX이다.

USB, Audio Interface, Ethernet, CAN, 가 있고 ADC Channel 등을 따져봤을 때 괜찮은 것 같다.



IMX7 시리즈

Cortex-M4가 내장되어있다.

http://cache.nxp.com/files/32bit/doc/fact_sheet/IMX7SRSFS.pdf


Cortex 설명

ARM을 쓰는 이유는 간단하다. 저전력이다.IOT환경에서는 전력소모가 큰 이슈인데 ARM이 저전력 고효율의 특징을 가지고 있다. 또한 성능면에서는 32비트 고성능 임베디드가 개발되어있어서 성능면에서도 탁월하다.

ARM관련 설명 : https://namu.wiki/w/ARM(CPU)



Cortex M 시리즈

여기에는 CortexM4에 관한 설명이다. Telemaco2 STA1088로 개발을 진행하였는데 CortexR4와 CortexM3로 이루어져있다. 부팅은 CortexM3하였으며 커널이미지 압출해제를 CortexR4로 진행한다. 어찌 됬든 A시리즈 외에도 M시리즈가 전장에서 많이 사용되는데, M시리즈에 관하여 찾아보았다.

https://namu.wiki/w/ARM%20Cortex-M%20%EC%8B%9C%EB%A6%AC%EC%A6%88



Cortex-M3, Cortex-M4 비교

Cortex-M4는 M3에 DSP가 추가된 버전으로써 성능이 더 좋다. IO의 전력은 M4가 약간 더 높다. 어찌됬든 M4 프로세서는 디지털 신호 제어 (DSC:Digital Signal Control) 애플리케이션에 고효율의 솔루션을 제공한다. 초저전력, 저비용, 사용성, 편리성 등이 완벽히 결합되었다. SIMD(Signal Instruction Multiple Data)로는 NEON 이 포함되어 있다. 또한 최적의 코드 밀도를 실현하는 Thumb-2d이 있다. DSP가 추가되면서 고급 연산이 가능해진 것이 가장 큰 특징이다. (MATLAB 연산도 가능하다고 함) 또한 부동소수점 연산이 들어간다고 한다. (밑에 설명)

http://www.kbench.com/?q=node/80877


Cortex-A vs Cortex-M

태블릿, 모바일 등에서는 고급성능을 가진 Cortex-A (64bit까지 지원) 이 많이 사용되며 웨어러블이나 IoT에서는 Cortex-A의 하위인 저전력 제품 Cortex-m 시리즈가 중요하다. Cortex-M시리즈가 성능이 부족한 편인데 M4부터 DSP기능이 탑재되어 성능이 향상되었다.

"부동 소수점 연산을 강화한 이유는 센서 노드와 기능 때문입니다. 예를 들어 오디오 프로세싱 같은 게 있겠지요. 마이크가 항상 명령을 대기하는 상태가 필요한데요. 명령을 감지하려면 막대한 양의 부동 소수점 연산이 필요합니다"(ARM의 Hurley).


이러한 Cortex-M의 강화 노선은 로우엔드 Cortex-A와 어떻게 구분하는지 의문이 들게 됩니다. 현재 두 계열의 아키텍처를 구분하는 건 매우 간단합니다. Cortex-A는 MMU(Memory Management Unit)을 갖추고 Cortex-M은 MMU가 없습니다. 메모리 아키텍처의 차이가 두 계열의 결정적인 차이입니다.

 

"Cortex-M은 MMU과 캐시가 없습니다. 그것이 Cortex-M을 매우 반응성이 좋은 프로세서로 만들었습니다. 그러나 일정한 성능까지 도달하려면 캐시가 필요합니다. 그 결과 그 CPU는 스몰 코어 수준의 응답성이 사라지게 됩니다. 성능과 응답성의 균형을 고려할 필요가 있습니다. 그것이 MMU을 가진 Cortex-A의 구분입니다"라고 ARM의 Hurley는 말합니다.


 프랑스 르망에 있는 STMicroelectronics 소프트웨어 센터에 가서 Telemaco에 대한 설명을 들을 때 ucLinux라는 설명과 MMU가 없다는 설명을 들었었다. Cortex-M3를 사용하는 ST제품에서 MMU가 없다는 말이 이제 이해되었다. MMU와 빠른 성능은 Trade-off 관계이다.


Cortex-A vs Cortex-M vs Cortex-R

모바일기기, IoT의 요구에 따라서 제품근을 크게 3개로 나누었음

Cortex-A (Application) 고성능의 ㅍ어플리케이션 구동 (모바일 시장)

Cortex-R (Real time) 중급 임베디드 시스템 A보다 성능이 낮음

Cortex-M (Micro controller) 단순한 ARM기반 칩. (M4부터는 DSP, FPU:floating point unit) 을 통해 성능이 높아짐


http://jjy0501.blogspot.kr/2012/11/arm-5-2010.html

https://namu.wiki/w/ARM%20Cortex-M%20%EC%8B%9C%EB%A6%AC%EC%A6%88

'리눅스 > 기타' 카테고리의 다른 글

.bashrc에서 예약어 등록하기  (0) 2019.07.08
리눅스 7z 압축풀기  (0) 2019.07.08
ARM 기반 소프트웨어 효율성 증대  (0) 2016.03.09
bash shell  (0) 2016.01.25

+ Recent posts