6/21/2017

MSP430 기본자료

1. MSP430과 다른 MCU비교 

TI의 Main MCU로 MSP430이 많이 이용되어진다고 하지만, Atmel의 AVR or ST micronics의 STM이 많이 이용이 되어지는 것 사실인 것 같다.

실제로 최근에 IOT 일 관련때문에 다시 AVR과 STM 관련해서 MCU들을 다시 사용해봤지만 사용하기가 편한 MCU는 STM or AVR 인 것 같다.
나만의 생각일지는 모르겠지만 풍부한 예제소스와 사용하기 쉬운 인터페이스 인 것 같다.
특히 STM의 경우는 ARM 기반으로 하기때문에 너무 이상적이고 이게 MCU 라고도 생각이 들 정도였다.

일문제로 인하여 TI MSP430 사용하고 있지만, 다른 MCU에 비해 개발의 편이성에 관련된 큰 장점을 발견하지 못하고 있지만
사용을 하다보니 다른 MCU 못지않게 좋은 부분도 많이 발견되고 특히 저전력부분에 있어서는 MSP430는 좋겠다라고 생각이 든다.
하지만 개발의 편이성 부분은 다소 떨어지는 것과 MSP430간의 호환성이 떨어지는 것은 어쩔수 없는 것 같다.

1.1 MSP430의 호환성

아래의 Wiki를 보고, TI사이트를 가보면 상당히 많은 MSP430의 종류가 존재한다.
그리고, 아래 series로 갈수로 고사양의 MCU 이며, 다양한 Peripherals 지원 해주고 성능이 좋다.
하지만 아래의 Series로 갈수록 호환성은 떨어지며, TI에서 예제를 제공해주고 있지만, Github or
다른 Opensource를 많이 발견하지 못하고 있다. 나의 검색능력이 떨어져서 그런건지 모르겠다.

하여튼 내가 사용하는 msp430f5438a는 다른 MSP430과 호환이 잘되지 않아 좀 많이 고쳐줘야 한다.
컴파일러는 현재 TI Complier로 사용하고 있으며, 다른 예제소스를 가지고 한번에 빌드되는 것은 거의 보지를 못했다.
이 관련 Series의 예제를 찾아 관련 Register 부분을 수정하면 문제해결이 된다.

  • MSP430 Series 
  1. MSP430x1xx series
  2. MSP430F2xx series
  3. MSP430G2xx series
  4. MSP430x3xx series
  5. MSP430x4xx series
  6. MSP430x5xx series
  7. MSP430x6xx series


1.2 MSP430F438A 의 전체 기능 

MCU 치고는 상당히 좋고 다양한 많은 기능을 가지고 있다. DMA기능을 가지고 있다는 것에 사실 놀랐고,
Timer 기능과 Power Management를 위해서 내부에 LDO를 따로 구성을 하고 있다.
일단 MCU이기에 FLASH 와 RAM은 기본으로 가지고 있으며, 외부 clock을 사용 안한다면, 내부 oscillator도 가지고 있다.

  • msp430f5438a


  http://www.ti.com/product/MSP430F5438A


  • 상세 Manual 
상위 Datasheet에는 세부 Register 설정 및 동작내용을 표시하지 않고 있지만,
6. Detailed Description 에 세부 Datasheet들을 Link로 연결해주고 있다.
가장 중요한 부분이기에 세밀하게 잘 봐야 한다.

CCS의 View->Register를 이용하여 각 개별의 값을 읽고 사용할수도 있다.


1.3 MSP430의 CLOCK 의 구성 

상위 msp430f5438a의 UCS 부분을 보면 Clock의 Source 부분과 이를 FLL를 이용하여 , (PLL처럼) Clock을 증가시켜
3종류의 Clock을 최종적으로 만들어 낸다.

  •  Unified Clock System (UCS)  - Source Clock 
     우선알아둬야할 기능이며 CLOCK관련 부분이기에 가장 중요하다.
  1. XT1CLK:  기본 외부 external clock으로 Low or High frequency 32KHz 사용 (XTIN/XTOUT)
  2. VLOCLK: internal oscillator (very low power)  10KHz
  3. DCOCLK: Internal digitally controlled oscillator ( FLL 이용)
  4. XT2CLK: external crystals (XT2IN/XTOUT)

      
  •  Unified Clock System (UCS) 
      상위 Source를 이용하여, 아래의 Clock을 만들어내며, PLL과 유사한 FLL을 이용한다. 
  1. MCLK(Main Clock): CPU 동작을 위한 Clock으로 DCO(Digitally Controlled Oscillator) or 외부 크리스탈에 의해 설정이 된다.
  2. ACLK(Auxiliary Clock): VLO(Very Low Power Oscillator) 
  3. SMCLK(Sub-Main Clock):  개별 Device를 위한 Clock으로 내장된 DCO or 외부 크리스탈로 설정 

Clock관련부분에 설정 및 동작에 대해 설명해주고 있다.

  http://www.ti.com/lit/ug/slau390e/slau390e.pdf
싱크웍스의 자료

  http://www.mcublog.co.kr/1806


  • 나의 경우는 설정의 예 
XT1CLK을 사용하며, 32KHz를 외부공급
  1. 8MHz  (MCLK 과 SMCLK) 설정 , ACLK 32KHz
  2. 15MHz (MCLK과 SMCLK)  설정, ACLK  32KHz
  3. 25MHz (MCLK과 SMCLK)  설정, ACLK  32KHz


1.4 MSP430 Peripheral 설정 방법 

모든 PIN들은 기본적으로 GIO가 가능하며, PINMUX를 해야한다. 그러기때문에,  우선적으로 해야 할일이 PIN 설정이다.

MSP430의 PINMUX 역할이 PINxSEL 이며, 경우에 따라 추가적으로 Pull up과 Pull down 설정도 적용이 되는지는 정확히 모르겠다.

특히한 사항은 UART or I2C or SPI는 USCI Interface라는 것을 이용하여 이곳에서 설정을 변경해서 만들어주어야 한다.

  • MSP430 peripherals 이용시 확인사항 
    예를들면USCI을 통한 UART or I2C or SPI 통신
  1. 개별 PORT의 PIN 설정을 반드시 확인. (GPIO설정시 세부설정)  
  2. PORT의 PINxSEL 은 PINMUX와 동일 (PIN설정)
  3. Peripherals 의 Clock Source를 확인하고 설정 
  4. Peripherals Reset 기능확인 
  5. Peripherals 세부설정방법 확인 
  6. ISR 가능여부 확인 ( 관련 TI Example 참조)

TI Example 소스도 간단히 구현을 하였기때문에 본인이 작성을 원한다면, 더 구체적으로
동작원리를 어느정도 이해를 해야겠다.


  • UART를 이용한 Printf 구현 
  MSP430 관련 CCS Studio 설정 (RS232 - Printf 설정)
  http://processors.wiki.ti.com/index.php/Printf_support_for_MSP430_CCSTUDIO_compiler


만약 Printf가 정상동작하지 않는다면, Properties의 설정을 다시 한번 확인해보고, 문제가 발생한다면, heap도 고쳐보자.

  • CCS의 별도 설정 (Printf 관련)



minimal->full 변경 (추후 Release 할 경우 다시 원상복귀)


기본으로 Enable CIO Function use






  • Timer의 Clock 
Timer는 현재 Source Clock을 ALCK 기준으로 사용을 하고 있으며, 이렇게 구현해야지
추후 Clock 이 변경이 되어도 별문제가 없을 것 같다.

  http://www.ti.com/lit/ug/slau400e/slau400e.pdf



  • ADC12 구현 
ADC의 경우 ISR로 구현로도 구현이 가능하며, 성능은 200-ksps 이상이 나온다고 한다.
현재 나의 경우는 ADC를 한개를 사용을 하기때문에 그리고, 빠른 사용을 위해서 ISR를 사용하고 있으며
ISR 루틴안에서 P1.x로 Clock을 만들어 Scope로 성능을 측정하고 있다.

  1. Repeat-Single-Channel Mode 설정 
  2. Pulse Sample Mode 설정 
  3. ADC12CTL0의 ADC12SHT0x ADC12CLK cycles을 줄이며 성능을 높이고 있다. 
  4. ISR 루틴구성 
  5. ISR 루틴에서 해당 Channel 값을 저장 
  http://www.ti.com/lit/ug/slau406e/slau406e.pdf



  • MSP430F5438A의 기본예제 구성 

  http://www.ti.com/lit/zip/slac375


2. MSP430의 Debugger 지원기능 

현재 사용중인 디버거는 아래와 같으며, USB Interface 형식으로 PC와 연결된다.
- MSP-FET430UIF

JTAG기능과 Serial을 통하여 SPI 형식으로 Target연결되어 File을 Upload 및 Download를 진행을 한다.
AVR의 ISP와 거의 유사한 방식으로 방식이지만, JTAG기능이 추가되어 CCS와 JTAG Debug가 지원이 가능하다.



MSP430의 기본내용 및 설명

  https://en.wikipedia.org/wiki/TI_MSP430


3. MSP430의 Linkscirpt 

MSP430에서 Linkscript와 연결하여 사용해야 할일이 어느 정도 있으며 이 부분은 Compiler의 종류에 따라 변경된다.
그리고 이부분은 정확하게 이해는 하고 있어야 한다. 현재 CCS의 Linkscript는 *.cmd File로 제공해주고 있다.
나의 경우는 lnk_msp430f5438a.cmd 이며 설정만 변경하면 생성이 된다.





3.1 ISR의 기본이해 

Manual의 6.3 Interrupt Vector Addresses을 보면 대충알 수 있다.

*.cmd의 INT00 ~ INTxx 까지의 주소이며 이 주소를 보면 상위 Manual의 주소와 일치한다.



  lnk_msp430f5438a.cmd 파일 
      ........ 
    RTC          : { * ( .int41 ) } > INT41 type = VECT_INIT
    PORT2        : { * ( .int42 ) } > INT42 type = VECT_INIT
    USCI_B3      : { * ( .int43 ) } > INT43 type = VECT_INIT
    USCI_A3      : { * ( .int44 ) } > INT44 type = VECT_INIT
    USCI_B1      : { * ( .int45 ) } > INT45 type = VECT_INIT
    USCI_A1      : { * ( .int46 ) } > INT46 type = VECT_INIT
    PORT1        : { * ( .int47 ) } > INT47 type = VECT_INIT
    TIMER1_A1    : { * ( .int48 ) } > INT48 type = VECT_INIT
    TIMER1_A0    : { * ( .int49 ) } > INT49 type = VECT_INIT
    DMA          : { * ( .int50 ) } > INT50 type = VECT_INIT
    USCI_B2      : { * ( .int51 ) } > INT51 type = VECT_INIT
    USCI_A2      : { * ( .int52 ) } > INT52 type = VECT_INIT
    TIMER0_A1    : { * ( .int53 ) } > INT53 type = VECT_INIT
    TIMER0_A0    : { * ( .int54 ) } > INT54 type = VECT_INIT
    ADC12        : { * ( .int55 ) } > INT55 type = VECT_INIT
    USCI_B0      : { * ( .int56 ) } > INT56 type = VECT_INIT
    USCI_A0      : { * ( .int57 ) } > INT57 type = VECT_INIT
    WDT          : { * ( .int58 ) } > INT58 type = VECT_INIT
    TIMER0_B1    : { * ( .int59 ) } > INT59 type = VECT_INIT
    TIMER0_B0    : { * ( .int60 ) } > INT60 type = VECT_INIT
    UNMI         : { * ( .int61 ) } > INT61 type = VECT_INIT
    SYSNMI       : { * ( .int62 ) } > INT62 type = VECT_INIT
    .reset       : {}               > RESET  /* MSP430 Reset vector         */ 


  • ISR의 예제   
아래와 같이 ADC ISR를 작성할 경우 TI Compiler와 GCC Compiler를 구분하 Programming 해야 한다.
일반적으로 GCC의 경우 __attribute__() 안에 넣고, 작성하지만 CCS or IAR의 TI Compiler는 다르다
Linkscript와 연결하고 싶다면 아래의 규칙을 따르도록하자
ADC12_VECTOR는 결국 *.cmd 파일의 INTxx와 Mapping이 된다.

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
 .....
}


3.2 Flash에 환경변수 저장방법 

*.cmd File을 분석해보면, Flash 부분은 .text section  과 .cinit  section 영역 주로 사용자 Code만을 위한 공간이다.
하지만 infoA/B/C/D를 별도로 구분지어 기본적으로 저장을 하지 않는다.
MSP430의 환경변수를 저장할 수 있도록 구성해놓은 Memroy Map인 것 같으며 사용법을 알아두자.

  • MSP430의 Memory MAP의 구성
  1. INFOA
  2. INFOB
  3. INFOC
  4. INFOD
아래와 같이 CCS에서 간단히 사용을 해보자. 하지만 Compiler가 변경이 되면 사용법도 약간씩 변경이 되므로 아래를 참고하자.

#pragma DATA_SECTION(sMYENV, ".infoD")   
const uint8_t *sMYENV = {0x12, 0x34, 0x56, 0x78};


char * env_Addr = (char *)0x1800;
  x = env_Addr[0];
  x = env_Addr[1];
  x = env_Addr[2];
  x = env_Addr[3];


Flash 와 CMD File의 조합
  http://processors.wiki.ti.com/index.php/Placing_Variables_in_Specific_Memory_Location_-_MSP430



  • INFOx Memory 사용할 경우 MSP430의 Debug option 설정 

다음과 같은 에러를 쉽게 볼수 있다.
- MSP430: File Loader: Verification failed: Values at address


아래와 같이 Erase Option은  Erase main Memory Only 설정이 되어 있어 Info에 Erase를 하지 못한다.

Erase Option

  1. Erase main memory only (기본설정)
  2. Erase main and Information memory 변경
이외에도 Allow Read/Write/Erase access to BSL memory 존재하지만, *cmd 파일에서  접근을 하지 않기 때문에 사용하지 않고 있다. 


  https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/481653


  • Flash를 EEPROM으로 이용하는 방법 
MSP430에는 EEPROM을 제공하지 않기때문에 EEPROM 사용할 경우 이를 대신할 방법
  http://processors.wiki.ti.com/index.php/Emulating_EEPROM_in_MSP430_Flash


3.3 Debug를 위하여 Map 파일 분석 

CCS를 이용하여 JTAG Debug를 이용한다면 많은 이용 필요없겠지만, File의 용도를 알아두기 위해서 적어둔다.

빌드 하면, Linux 처럼  *.map 파일 생성이 되며, 이를 통하여 관련 library와 symbol table 과 주소등을 관련 정보가 가능하다






6/18/2017

Kernel dmesg 및 debug 관련정보

1. Kernel Log 관련 정보 

Kernel의 printk의 Message이며 이 부분을 좀 다양하게 알아보자

1.1 dmesg  (/dev/kmsg , /proc/kmsg)

Linux에서 Kernel Message를 보는 방법은 dmesg이며 각각의 Log Level을 아래의 사이트는 각각의 나타내고 있다.

  • dmesg 기본사용법
  1. dmesg -c   :  dmesg  clear   dmeg도 내부에 buffer가 있기에 이를 전부 clear한다. 
  2. dmesg -n1 :  level 1 선택 
  3. dmesg      :   기본 설정값으로 하고 전부 출력.

  • raspberry pi test
dmesg로 처음 boot시 나왔던 kernel message 재확인하고 각부분 분석

$ dmesg
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.14.34-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1110 SMP Mon Apr 16 15:18:51 BST 2018
[    0.000000] CPU: ARMv7 Processor [410fd034] revision 4 (ARMv7), cr=10c5383d
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: Raspberry Pi 3 Model B Rev 1.2
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] cma: Reserved 8 MiB at 0x37800000
[    0.000000] On node 0 totalpages: 229376
[    0.000000] free_area_init_node: node 0, pgdat 80c84e40, node_mem_map b7016000
[    0.000000]   Normal zone: 2016 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 229376 pages, LIFO batch:31
[    0.000000] random: fast init done
[    0.000000] percpu: Embedded 17 pages/cpu @b6fbf000 s38720 r8192 d22720 u69632
[    0.000000] pcpu-alloc: s38720 r8192 d22720 u69632 alloc=17*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 227360
[    0.000000] Kernel command line: 8250.nr_uarts=0 bcm2708_fb.fbwidth=1920 bcm2708_fb.fbheight=1080 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000  dwc_otg.lpm_enable=0 console=ttyS0,115200 console=tty1 root=PARTUUID=0c830106-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Memory: 887456K/917504K available (7168K kernel code, 575K rwdata, 2072K rodata, 1024K init, 706K bss, 21856K reserved, 8192K cma-reserved)
[    0.000000] Virtual kernel memory layout:
                   vector  : 0xffff0000 - 0xffff1000   (   4 kB)
                   fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
                   vmalloc : 0xb8800000 - 0xff800000   (1136 MB)
                   lowmem  : 0x80000000 - 0xb8000000   ( 896 MB)
                   modules : 0x7f000000 - 0x80000000   (  16 MB)
                     .text : 0x80008000 - 0x80800000   (8160 kB)
                     .init : 0x80b00000 - 0x80c00000   (1024 kB)
                     .data : 0x80c00000 - 0x80c8fd4c   ( 576 kB)
                      .bss : 0x80c96f4c - 0x80d478b4   ( 707 kB)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] ftrace: allocating 25231 entries in 74 pages
[    0.000000] Hierarchical RCU implementation.
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] arch_timer: cp15 timer(s) running at 19.20MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x46d987e47, max_idle_ns: 440795202767 ns
[    0.000007] sched_clock: 56 bits at 19MHz, resolution 52ns, wraps every 4398046511078ns
[    0.000019] Switching to timer-based delay loop, resolution 52ns
[    0.000267] Console: colour dummy device 80x30
[    0.000285] console [tty1] enabled
[    0.000311] Calibrating delay loop (skipped), value calculated using timer frequency.. 38.40 BogoMIPS (lpj=192000)
[    0.000326] pid_max: default: 32768 minimum: 301
[    0.000638] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000654] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
[    0.001587] Disabling memory control group subsystem
[    0.001668] CPU: Testing write buffer coherency: ok
[    0.002063] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[    0.002436] Setting up static identity map for 0x100000 - 0x10003c
[    0.002553] Hierarchical SRCU implementation.
[    0.003187] smp: Bringing up secondary CPUs ...
[    0.003869] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
[    0.004620] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
[    0.005351] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
[    0.005455] smp: Brought up 1 node, 4 CPUs
[    0.005465] SMP: Total of 4 processors activated (153.60 BogoMIPS).
[    0.005471] CPU: All CPU(s) started in HYP mode.
[    0.005475] CPU: Virtualization extensions available.
[    0.006318] devtmpfs: initialized
[    0.016951] VFP support v0.3: implementor 41 architecture 3 part 40 variant 3 rev 4
[    0.017172] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.017190] futex hash table entries: 1024 (order: 4, 65536 bytes)
[    0.017747] pinctrl core: initialized pinctrl subsystem
[    0.018489] NET: Registered protocol family 16
[    0.021208] DMA: preallocated 1024 KiB pool for atomic coherent allocations
[    0.026004] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
[    0.026011] hw-breakpoint: maximum watchpoint size is 8 bytes.
[    0.026219] Serial: AMBA PL011 UART driver
[    0.027833] bcm2835-mbox 3f00b880.mailbox: mailbox enabled
[    0.028291] uart-pl011 3f201000.serial: could not find pctldev for node /soc/gpio@7e200000/uart0_pins, deferring probe
[    0.059373] bcm2835-dma 3f007000.dma: DMA legacy API manager at b8813000, dmachans=0x1
[    0.060896] SCSI subsystem initialized
[    0.061116] usbcore: registered new interface driver usbfs
[    0.061167] usbcore: registered new interface driver hub
[    0.061250] usbcore: registered new device driver usb
[    0.070084] raspberrypi-firmware soc:firmware: Attached to firmware from 2018-04-16 18:21
[    0.071479] clocksource: Switched to clocksource arch_sys_counter
[    0.148866] VFS: Disk quotas dquot_6.6.0
[    0.148951] VFS: Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    0.149138] FS-Cache: Loaded
[    0.149336] CacheFiles: Loaded
[    0.158147] NET: Registered protocol family 2
[    0.158869] TCP established hash table entries: 8192 (order: 3, 32768 bytes)
[    0.158979] TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
[    0.159165] TCP: Hash tables configured (established 8192 bind 8192)
[    0.159294] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    0.159337] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    0.159565] NET: Registered protocol family 1
[    0.160010] RPC: Registered named UNIX socket transport module.
[    0.160015] RPC: Registered udp transport module.
[    0.160021] RPC: Registered tcp transport module.
[    0.160026] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.161604] hw perfevents: enabled with armv7_cortex_a7 PMU driver, 7 counters available
[    0.164342] workingset: timestamp_bits=14 max_order=18 bucket_order=4
[    0.172261] FS-Cache: Netfs 'nfs' registered for caching
[    0.172848] NFS: Registering the id_resolver key type
[    0.172878] Key type id_resolver registered
[    0.172884] Key type id_legacy registered
[    0.172899] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.174757] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 251)
[    0.174878] io scheduler noop registered
[    0.174884] io scheduler deadline registered (default)
[    0.175161] io scheduler cfq registered
[    0.175168] io scheduler mq-deadline registered
[    0.175174] io scheduler kyber registered
[    0.177839] BCM2708FB: allocated DMA memory f7910000
[    0.177867] BCM2708FB: allocated DMA channel 0 @ b8813000
[    0.235976] Console: switching to colour frame buffer device 240x67
[    0.270983] bcm2835-rng 3f104000.rng: hwrng registered
[    0.271111] vc-mem: phys_addr:0x00000000 mem_base=0x3ec00000 mem_size:0x40000000(1024 MiB)
[    0.271631] vc-sm: Videocore shared memory driver
[    0.271898] gpiomem-bcm2835 3f200000.gpiomem: Initialised: Registers at 0x3f200000
[    0.281547] brd: module loaded
[    0.290519] loop: module loaded
[    0.290532] Loading iSCSI transport class v2.0-870.
[    0.291204] libphy: Fixed MDIO Bus: probed
[    0.291299] usbcore: registered new interface driver lan78xx
[    0.291355] usbcore: registered new interface driver smsc95xx
[    0.291373] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[    0.519585] Core Release: 2.80a
[    0.519594] Setting default values for core params
[    0.519629] Finished setting default values for core params
[    0.719887] Using Buffer DMA mode
[    0.719893] Periodic Transfer Interrupt Enhancement - disabled
[    0.719898] Multiprocessor Interrupt Enhancement - disabled
[    0.719905] OTG VER PARAM: 0, OTG VER FLAG: 0
[    0.719914] Dedicated Tx FIFOs mode
[    0.720246] WARN::dwc_otg_hcd_init:1046: FIQ DMA bounce buffers: virt = 0xb7904000 dma = 0xf7904000 len=9024
[    0.720270] FIQ FSM acceleration enabled for :
               Non-periodic Split Transactions
               Periodic Split Transactions
               High-Speed Isochronous Endpoints
               Interrupt/Control Split Transaction hack enabled
[    0.720277] dwc_otg: Microframe scheduler enabled
[    0.720329] WARN::hcd_init_fiq:459: FIQ on core 1 at 0x805e6a40
[    0.720340] WARN::hcd_init_fiq:460: FIQ ASM at 0x805e6da8 length 36
[    0.720352] WARN::hcd_init_fiq:486: MPHI regs_base at 0xb887e000
[    0.720408] dwc_otg 3f980000.usb: DWC OTG Controller
[    0.720440] dwc_otg 3f980000.usb: new USB bus registered, assigned bus number 1
[    0.720470] dwc_otg 3f980000.usb: irq 62, io mem 0x00000000
[    0.720515] Init: Port Power? op_state=1
[    0.720521] Init: Power Port (0)
[    0.720734] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    0.720745] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    0.720754] usb usb1: Product: DWC OTG Controller
[    0.720762] usb usb1: Manufacturer: Linux 4.14.34-v7+ dwc_otg_hcd
[    0.720770] usb usb1: SerialNumber: 3f980000.usb
[    0.721409] hub 1-0:1.0: USB hub found
[    0.721451] hub 1-0:1.0: 1 port detected
[    0.722029] dwc_otg: FIQ enabled
[    0.722034] dwc_otg: NAK holdoff enabled
[    0.722039] dwc_otg: FIQ split-transaction FSM enabled
[    0.722048] Module dwc_common_port init
[    0.722296] usbcore: registered new interface driver usb-storage
[    0.722474] mousedev: PS/2 mouse device common for all mice
[    0.722550] IR NEC protocol handler initialized
[    0.722555] IR RC5(x/sz) protocol handler initialized
[    0.722561] IR RC6 protocol handler initialized
[    0.722567] IR JVC protocol handler initialized
[    0.722572] IR Sony protocol handler initialized
[    0.722577] IR SANYO protocol handler initialized
[    0.722582] IR Sharp protocol handler initialized
[    0.722587] IR MCE Keyboard/mouse protocol handler initialized
[    0.722594] IR XMP protocol handler initialized
[    0.723283] bcm2835-wdt 3f100000.watchdog: Broadcom BCM2835 watchdog timer
[    0.723544] bcm2835-cpufreq: min=600000 max=1200000
[    0.723896] sdhci: Secure Digital Host Controller Interface driver
[    0.723901] sdhci: Copyright(c) Pierre Ossman
[    0.724261] mmc-bcm2835 3f300000.mmc: could not get clk, deferring probe
[    0.724587] sdhost-bcm2835 3f202000.mmc: could not get clk, deferring probe
[    0.724679] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.726102] ledtrig-cpu: registered to indicate activity on CPUs
[    0.726283] hidraw: raw HID events driver (C) Jiri Kosina
[    0.726407] usbcore: registered new interface driver usbhid
[    0.726413] usbhid: USB HID core driver
[    0.727188] vchiq: vchiq_init_state: slot_zero = b7980000, is_master = 0
[    0.728641] [vc_sm_connected_init]: start
[    0.739161] [vc_sm_connected_init]: end - returning 0
[    0.739745] Initializing XFRM netlink socket
[    0.739769] NET: Registered protocol family 17
[    0.739872] Key type dns_resolver registered
[    0.740413] Registering SWP/SWPB emulation handler
[    0.741001] registered taskstats version 1
[    0.746970] uart-pl011 3f201000.serial: cts_event_workaround enabled
[    0.747047] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 87, base_baud = 0) is a PL011 rev2
[    0.748862] mmc-bcm2835 3f300000.mmc: mmc_debug:0 mmc_debug2:0
[    0.748871] mmc-bcm2835 3f300000.mmc: DMA channel allocated
[    0.802118] sdhost: log_buf @ b7907000 (f7907000)
[    0.837905] mmc1: queuing unknown CIS tuple 0x80 (2 bytes)
[    0.839475] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[    0.841043] mmc1: queuing unknown CIS tuple 0x80 (3 bytes)
[    0.843833] mmc1: queuing unknown CIS tuple 0x80 (7 bytes)
[    0.881499] mmc0: sdhost-bcm2835 loaded - DMA enabled (>1)
[    0.882567] of_cfs_init
[    0.882656] of_cfs_init: OK
[    0.883246] Waiting for root device PARTUUID=0c830106-02...
[    0.941724] Indeed it is in host mode hprt0 = 00021501
[    1.020851] mmc1: new high speed SDIO card at address 0001
[    1.042876] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.046001] mmc0: new high speed SDHC card at address aaaa
[    1.046477] mmcblk0: mmc0:aaaa SL16G 14.8 GiB
[    1.048863]  mmcblk0: p1 p2
[    1.066714] EXT4-fs (mmcblk0p2): INFO: recovery required on readonly filesystem
[    1.066722] EXT4-fs (mmcblk0p2): write access will be enabled during recovery
[    1.075729] EXT4-fs (mmcblk0p2): recovery complete
[    1.079938] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    1.079992] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
[    1.087726] devtmpfs: mounted
[    1.090899] Freeing unused kernel memory: 1024K
[    1.151540] usb 1-1: new high-speed USB device number 2 using dwc_otg
[    1.151666] Indeed it is in host mode hprt0 = 00001101
[    1.391795] usb 1-1: New USB device found, idVendor=0424, idProduct=9514
[    1.391811] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    1.392527] hub 1-1:1.0: USB hub found
[    1.392610] hub 1-1:1.0: 5 ports detected
[    1.464634] systemd[1]: System time before build time, advancing clock.
[    1.590833] NET: Registered protocol family 10
[    1.592125] Segment Routing with IPv6
[    1.605413] ip_tables: (C) 2000-2006 Netfilter Core Team
[    1.628016] systemd[1]: systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    1.628567] systemd[1]: Detected architecture arm.
[    1.633541] systemd[1]: Set hostname to raspberrypi.
[    1.711668] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
[    1.851834] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[    1.851882] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    1.854626] smsc95xx v1.0.6
[    1.955096] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-3f980000.usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:ef:b7:f8
[    2.073925] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[    2.074345] systemd[1]: Listening on /dev/initctl Compatibility Named Pipe.
[    2.074463] systemd[1]: Reached target Swap.
[    2.074757] systemd[1]: Listening on udev Kernel Socket.
[    2.075007] systemd[1]: Listening on Journal Socket (/dev/log).
[    2.095283] systemd[1]: Created slice System Slice.
[    2.098408] systemd[1]: Mounting Debug File System...
[    2.189973] i2c /dev entries driver
[    2.516225] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[    2.582557] systemd-journald[92]: Received request to flush runtime journal from PID 1
[    3.150771] snd_bcm2835: module is from the staging directory, the quality is unknown, you have been warned.
[    3.154509] bcm2835_alsa bcm2835_alsa: card created with 8 channels
[    3.371876] brcmfmac: F1 signature read @0x18000000=0x1541a9a6
[    3.387679] brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43430-sdio.bin for chip 0x00a9a6(43430) rev 0x000001
[    3.387960] usbcore: registered new interface driver brcmfmac
[    3.628839] brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Oct 23 2017 03:55:53 version 7.45.98.38 (r674442 CY) FWID 01-e58d219f
[    3.629655] brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 7.11.15 Compiler: 1.24.2 ClmImport: 1.24.1 Creation: 2014-05-26 10:53:55 Inc Data: 9.10.39 Inc Compiler: 1.29.4 Inc ClmImport: 1.36.3 Creation: 2017-10-23 03:47:14 
[    4.529300] uart-pl011 3f201000.serial: no DMA platform data
[    5.390512] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
[    5.390583] brcmfmac: power management disabled
[    5.465582] random: crng init done
[    5.853760] Adding 102396k swap on /var/swap.  Priority:-2 extents:1 across:102396k SSFS
[    5.892712] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup
[    5.892864] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[    6.420595] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
[    9.093542] Bluetooth: Core ver 2.22
[    9.093638] NET: Registered protocol family 31
[    9.093646] Bluetooth: HCI device and connection manager initialized
[    9.093671] Bluetooth: HCI socket layer initialized
[    9.093684] Bluetooth: L2CAP socket layer initialized
[    9.093720] Bluetooth: SCO socket layer initialized
[    9.117196] Bluetooth: HCI UART driver ver 2.3
[    9.117215] Bluetooth: HCI UART protocol H4 registered
[    9.117221] Bluetooth: HCI UART protocol Three-wire (H5) registered
[    9.117443] Bluetooth: HCI UART protocol Broadcom registered
[    9.380735] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    9.380745] Bluetooth: BNEP filters: protocol multicast
[    9.380760] Bluetooth: BNEP socket layer initialized
[    9.444656] Bluetooth: RFCOMM TTY layer initialized
[    9.444687] Bluetooth: RFCOMM socket layer initialized
[    9.444708] Bluetooth: RFCOMM ver 1.11
[   10.518586] fuse init (API version 7.26)


  • printk의 시간표시 제어 
sys file을 이용하여 제어하는 것이지만, 제어가 되지 않아 추후 다시 테스트

$ cat /sys/module/printk/parameters/time
Y
$ sudo -s // root login 

$ echo 0 >/sys/module/printk/parameters/time

$ cat /sys/module/printk/parameters/time     // time parameter off 
N


  • Usermode에서 kernel message 전송 (/dev/kmsg)
$ echo "Hello Kernel-World" > /dev/kmsg  // Kernel Message 전송 

$ dmesg   // 확인결과 그대로 표시 , 흐음 추후 다시 테스트 
.....
[  209.198640] Hello Kernel-World

$ exit // root exit 


  • 실시간 Kernel Log 테스트 
$ sudo cat /proc/kmsg  &  // Kernel Debug 시작 
$ sudo -s
$ echo "Hello Kernel-World" > /dev/kmsg    // Kernel Debug Message 전송 
12 [ 4148.928694] Hello Kernel-World

$ dmesg  // 확인 
.....
[ 3980.591551] Hello Kernel-World


dmesg의 메시지가 많다보니, 보고 싶은 Message는 grep를 이용
  http://elinux.org/Debugging_by_printing
  http://man7.org/linux/man-pages/man1/dmesg.1.html

  http://m.blog.naver.com/koromoon/220581683064
  http://jybaek.tistory.com/130

1.2 syslog 의 Kernel Tag Message

아래의 message를 보기전에 항상 /etc/syslog.conf의 설정을 확인을 하자.

  • Log 정보분석 (syslog의 kernel tag)
$ cat /var/log/messages   // dmesg  보다 좀 더 자세한 정보 (memory 및 symbol)
Feb 17 15:59:58 raspberrypi kernel: [    4.786727] vc4-drm soc:gpu: bound 3f806000.vec (ops vc4_vec_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.786832] vc4-drm soc:gpu: bound 3f400000.hvs (ops vc4_hvs_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.787107] vc4-drm soc:gpu: bound 3f206000.pixelvalve (ops vc4_crtc_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.787330] vc4-drm soc:gpu: bound 3f207000.pixelvalve (ops vc4_crtc_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.787542] vc4-drm soc:gpu: bound 3f807000.pixelvalve (ops vc4_crtc_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.811151] vc4-drm soc:gpu: bound 3fc00000.v3d (ops vc4_v3d_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.818536] [drm] Initialized vc4 0.0.0 20140616 for soc:gpu on minor 0
Feb 17 15:59:58 raspberrypi kernel: [    4.818554] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
Feb 17 15:59:58 raspberrypi kernel: [    4.818560] [drm] Driver supports precise vblank timestamp query.
Feb 17 15:59:58 raspberrypi kernel: [    4.891580] ------------[ cut here ]------------
Feb 17 15:59:58 raspberrypi kernel: [    4.891785] WARNING: CPU: 1 PID: 206 at drivers/gpu/drm/drm_atomic_helper.c:1240 drm_atomic_helper_wait_for_vblanks.part.0+0x268/0x26c [drm_kms_helper]
Feb 17 15:59:58 raspberrypi kernel: [    4.891796] [CRTC:67:crtc-2] vblank wait timed out
Feb 17 15:59:58 raspberrypi kernel: [    4.891802] Modules linked in: vc4(+) brcmfmac drm_kms_helper brcmutil drm snd_soc_core cfg80211 snd_compress snd_pcm_dmaengine snd_bcm2835(C) rfkill syscopyarea sysfillrect sysimgblt fb_sys_fops snd_pcm snd_timer snd i2c_bcm2835 uio_pdrv_genirq uio fixed i2c_dev ip_tables x_tables ipv6 cn
Feb 17 15:59:58 raspberrypi kernel: [    4.891944] CPU: 1 PID: 206 Comm: systemd-udevd Tainted: G         C      4.14.34-v7+ #1110
Feb 17 15:59:58 raspberrypi kernel: [    4.891953] Hardware name: BCM2835
Feb 17 15:59:58 raspberrypi kernel: [    4.891997] [8010ffd8] (unwind_backtrace) from [<8010c240>] (show_stack+0x20/0x24)
Feb 17 15:59:58 raspberrypi kernel: [    4.892025] [8010c240] (show_stack) from [<807840a4>] (dump_stack+0xd4/0x118)
Feb 17 15:59:58 raspberrypi kernel: [    4.892056] [807840a4] (dump_stack) from [<8011da54>] (__warn+0xf8/0x110)

.......


 $ cat /var/log/syslog  // Kernel (상위정보 포함) 과 init 관련 정보 
....
Feb 17 15:59:58 raspberrypi kernel: [    4.787107] vc4-drm soc:gpu: bound 3f206000.pixelvalve (ops vc4_crtc_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.787330] vc4-drm soc:gpu: bound 3f207000.pixelvalve (ops vc4_crtc_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.787542] vc4-drm soc:gpu: bound 3f807000.pixelvalve (ops vc4_crtc_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.811151] vc4-drm soc:gpu: bound 3fc00000.v3d (ops vc4_v3d_ops [vc4])
Feb 17 15:59:58 raspberrypi kernel: [    4.818536] [drm] Initialized vc4 0.0.0 20140616 for soc:gpu on minor 0
Feb 17 15:59:58 raspberrypi kernel: [    4.818554] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
Feb 17 15:59:58 raspberrypi kernel: [    4.818560] [drm] Driver supports precise vblank timestamp query.
Feb 17 15:59:58 raspberrypi kernel: [    4.891580] ------------[ cut here ]------------
..........
Feb 17 15:59:59 raspberrypi dhcpcd-run-hooks[448]: wlan0: starting wpa_supplicant
Feb 17 15:59:59 raspberrypi systemd[1]: Received SIGRTMIN+21 from PID 210 (plymouthd).
Feb 17 15:59:59 raspberrypi systemd[1]: Started Hold until boot process finishes up.
Feb 17 15:59:59 raspberrypi systemd[1]: Started Terminate Plymouth Boot Screen.


2. Kernel의 proc를 이용한 Debug 


2.1  proc를 이용하여 symbol table 정보 찾기 

  • Kernel 의 __log_buf  직접접근
Memory가 Physical 0x800000000->0x0 변경.
상위 dmesg의 Virtual Kernel Memory Layout을 참조.

$ sudo grep __log_buf /proc/kallsyms  // Kernel Symbol 에서 __log_buf 검색
80c9aad0 b __log_buf                                         // Physical 과 Virtual Address Mapping (00000000->80000000) memory map 

$ sudo cat /proc/iomem      // SOC의 Periperal Memory (Memory Mapped IO)
00000000-3b3fffff : System RAM     // System RAM Address (Physcial Address)
  00008000-00afffff : Kernel code                // Kernel Code
  00c00000-00d478b3 : Kernel data         // Kernel Data (상위 symbol table 확인)
3f006000-3f006fff : dwc_otg
3f007000-3f007eff : /soc/dma@7e007000
3f00b840-3f00b84e : /soc/vchiq
3f00b880-3f00b8bf : /soc/mailbox@7e00b880
3f100000-3f100027 : /soc/watchdog@7e100000
3f101000-3f102fff : /soc/cprman@7e101000
3f200000-3f2000b3 : /soc/gpio@7e200000
3f201000-3f201fff : /soc/serial@7e201000
  3f201000-3f201fff : /soc/serial@7e201000
3f202000-3f2020ff : /soc/mmc@7e202000
3f206000-3f2060ff : /soc/pixelvalve@7e206000
3f207000-3f2070ff : /soc/pixelvalve@7e207000
3f212000-3f212007 : /soc/thermal@7e212000
3f215000-3f215007 : /soc/aux@0x7e215000
3f300000-3f3000ff : /soc/mmc@7e300000
3f400000-3f405fff : /soc/hvs@7e400000
3f805000-3f805fff : /soc/i2c@7e805000
3f806000-3f806fff : /soc/vec@7e806000
3f807000-3f8070ff : /soc/pixelvalve@7e807000
3f808000-3f8080ff : /soc/hdmi@7e902000
3f902000-3f9025ff : /soc/hdmi@7e902000
3f980000-3f98ffff : dwc_otg
3fc00000-3fc00fff : /soc/v3d@7ec00000


  • System RAM의 Symbol Table 정보확인

//////////////////////////////////////////////////////////////////////////////////
// 상위에서 알아본 __log_buf 의 symbol table의 주소를 상위 Kernel data 에 적용  
// 0x00c9aad0  = 0x00000000 (System RAM)  +  c9aad0 ( __log_buf)
// 상위와 같이 Physical Address 기반으로 변경 
//////////////////////////////////////////////////////////////////////////////////

$ sudo hexdump -s 0x00c9aad0  -n 80 -C /dev/mem   // -n 80  print line 

or

$ sudo hd -s 0x00c9aad0 -n 80000  /dev/mem  //  /dev/mem 접근가능하여 __log_buf 부분 확인 
00c9aad0  00 00 00 00 00 00 00 00  34 00 21 00 00 00 00 c6  |........4.!.....|
00c9aae0  42 6f 6f 74 69 6e 67 20  4c 69 6e 75 78 20 6f 6e  |Booting Linux on|
00c9aaf0  20 70 68 79 73 69 63 61  6c 20 43 50 55 20 30 78  | physical CPU 0x|
00c9ab00  30 00 00 00 00 00 00 00  00 00 00 00 a8 00 98 00  |0...............|
00c9ab10  00 00 00 a6 4c 69 6e 75  78 20 76 65 72 73 69 6f  |....Linux versio|
00c9ab20  6e 20 34 2e 31 34 2e 33  34 2d 76 37 2b 20 28 64  |n 4.14.34-v7+ (d|
00c9ab30  63 34 40 64 63 34 2d 58  50 53 31 33 2d 39 33 33  |c4@dc4-XPS13-933|
00c9ab40  33 29 20 28 67 63 63 20  76 65 72 73 69 6f 6e 20  |3) (gcc version |
00c9ab50  34 2e 39 2e 33 20 28 63  72 6f 73 73 74 6f 6f 6c  |4.9.3 (crosstool|
00c9ab60  2d 4e 47 20 63 72 6f 73  73 74 6f 6f 6c 2d 6e 67  |-NG crosstool-ng|
00c9ab70  2d 31 2e 32 32 2e 30 2d  38 38 2d 67 38 34 36 30  |-1.22.0-88-g8460|
00c9ab80  36 31 31 29 29 20 23 31  31 31 30 20 53 4d 50 20  |611)) #1110 SMP |
00c9ab90  4d 6f 6e 20 41 70 72 20  31 36 20 31 35 3a 31 38  |Mon Apr 16 15:18|

.......
00c9f9d0  02 00 00 00 2c 00 1c 00  00 00 00 c6 66 75 73 65  |....,.......fuse|
00c9f9e0  20 69 6e 69 74 20 28 41  50 49 20 76 65 72 73 69  | init (API versi|
00c9f9f0  6f 6e 20 37 2e 32 36 29  91 ec 35 b5 30 00 00 00  |on 7.26)..5.0...|
00c9fa00  24 00 12 00 00 00 01 82  48 65 6c 6c 6f 20 4b 65  |$.......Hello Ke|
00c9fa10  72 6e 65 6c 2d 57 6f 72  6c 64 00 00 00 00 00 00  |rnel-World......|
00c9fa20  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

// 추후 uboot에서 load address도 확인 후 uImage or zImage 도 확인 (미확인)

$ cat /proc/kallsyms  // System.map 과 비교 
80008000 T stext
80008000 T _text
8000808c t __create_page_tables
80008138 t __turn_mmu_on_loc
80008144 t __fixup_smp
800081ac t __fixup_smp_on_up
800081d0 t __fixup_pv_table
80008224 t __vet_atags
..............

System.map (CONFIG_KALLSYMS 설정)
  https://en.wikipedia.org/wiki/System.map
  http://www.embedded.com/design/debug-and-optimization/4441375/Self-testing-in-embedded-systems--Hardware-failure

2.2 이외 proc의 다양한 Kernel 정보 

/proc/sys/kernel에서 기본적인 kernel 관련정보를 볼 수 있다.

$ ls /proc/sys/kernel/
auto_msgmni                        perf_event_max_stack
cad_pid                            perf_event_mlock_kb
cap_last_cap                       perf_event_paranoid
core_pattern                       pid_max
core_pipe_limit                    poweroff_cmd
core_uses_pid                      print-fatal-signals
ctrl-alt-del                       printk          //이전의 printk 설정 및 보기 
dmesg_restrict                     printk_delay
domainname                         printk_devkmsg
firmware_config                    printk_ratelimit
hostname                           printk_ratelimit_burst
hotplug                           pty
keys                               random
kptr_restrict                      randomize_va_space
max_lock_depth                     real-root-dev
modprobe                          sched_child_runs_first
modules_disabled                   sched_rr_timeslice_ms
msgmax                             sched_rt_period_us
msgmnb                             sched_rt_runtime_us
msgmni                             sem
ngroups_max                        shm_rmid_forced
osrelease                          shmall
ostype                             shmmax
overflowgid                        shmmni
overflowuid                        sysctl_writes_strict
panic                              sysrq
panic_on_oops                      tainted
panic_on_rcu_stall                 threads-max
panic_on_warn                      timer_migration
perf_cpu_time_max_percent          usermodehelper
perf_event_max_contexts_per_stack  version

$ cat /proc/sys/kernel/sched_rr_timeslice_ms
100


3. Kernel 의 debugfs 설정 및 profile 

Kernel Config에서 Kernel hacking Menu에서 다양한 기능을 제공
Kernel의 menuconfig 에서 다양한 설정들을 확인필요
  1. Trace 기능 
  2. KGDB
  3. Memory Debug 기능


3.1 debug File system (/sys/kernel/debug)

Kernel config에 따라 변경되기 때문에 Kernel 설정확인

/sys/kernel/debug 의 Filesystem을 이용하여 Kernel의 내용을 Debug 하는 방법을 소개


$ mount | grep debugfs       // /sys/kernel/debug mount 되어있는지 확인
$ mount -t debugfs none /sys/kernel/debug   // 필요할 경우 사용 , 요즘 기본으로 되어있음
$ sudo -s   // root login 
$ ls /sys/kernel/debug/
bcm2708_fb  bluetooth   dma_buf   frontswap  irq       mmc1 pwm      sched_features  vchiq
bcm2835_thermal  brcmfmac    extfrag   gpio     kprobes   pinctrl regmap      sleep_time      vc-mem
bdi   cleancache  f2fs   hid     memblock  pm_genpd regulator    tracing      vc-smem
block   clk      fault_around_bytes  ieee80211  mmc0      pm_qos sched_debug  usb

$ cat /sys/kernel/debug/bluetooth/rfcomm  // bluetooth 관련정보확인 
b8:27:eb:45:1d:52 00:00:00:00:00:00 4 13
b8:27:eb:45:1d:52 00:00:00:00:00:00 4 7
b8:27:eb:45:1d:52 00:00:00:00:00:00 4 12

$ cat /sys/kernel/debug/usb/devices  // USB Host에서 Device Descriptor 정보 lsusb로 확인가능 

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 1
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 4.19
S:  Manufacturer=Linux 4.19.35-1.1.0+g0f9917c ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=ci_hdrc.1
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms
............

$ cat /sys/kernel/debug/gpio     // 상위 본인이 확인하고자 하는 정보 확인 
$ cat /sys/kernel/debug/pinctrl  // Pinmux 정보
$ /sys/kernel/debug/tracing  //tracing 기능 

  https://www.kernel.org/doc/Documentation/filesystems/debugfs.txt
  https://events.linuxfoundation.org/sites/events/files/slides/kernel_profiling_debugging_tools_0.pdf

3.2 Kernel Profile (oprofile)

  • Kernel Config 설정변경 
  1. CONFIG_PROFILING=y  (General setup)
  2. CONFIG_OPROFILE=y

  https://cateee.net/lkddb/web-lkddb/OPROFILE.html


  • File system의 변경 및 설치 Package
  1. oprofile package 설치
  2. /var/lib/oprofile  directory 필요

Oprofile Download
  https://oprofile.sourceforge.io/download/
  https://oprofile.sourceforge.io/examples/
  http://oprofile.sourceforge.net/about/

Oprofile 관련내용
  http://homepages.cwi.nl/~aeb/linux/profile.html
  https://oprofile.sourceforge.io/doc/index.html
  http://egloos.zum.com/furmuwon/v/10709926

Yocto Profile 관련 Manual
  https://yoctoproject.org/docs/1.8/profile-manual/profile-manual.html
  https://developer.ridgerun.com/wiki/index.php?title=Preparing_Yocto_Development_Environment_for_Debugging
  https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling

6/17/2017

크롬 정리 도구

최근 크롬 브라우저가 느려지는 것을 발견하고 이에 관련된 프로그램이 있는 확인 
만약 크롬이 느려졌다면, 아래에서 Download 
추후 시간이 된다면, 크롬OS와 크롬 Programming 도 한번 봐야 할 것 같은데, 
저번에 우연히 접하고 내부 Script와 관련부분을 좀 자세히 봐야겠다. 

6/15/2017

Lex와 Yacc (수정중 , 추후 다시 좀더 진행할 경우 보완)

1. Lex 와 Yacc 소개

Lex와 Yacc는 개념이 나온지는 오래되었으며, 보통 Compiler 과목시간에 배우는 개념이겠다.
그리고 Compiler Design 을 위해서 많이 사용되어지지만, 원대한 꿈을 가지고 Compiler 만들기로만 사용하기에는 그 기능이 너무 좋다.

  • Compiler Design 
  • Interpreter Design (Script Language 설계) 다양하게 이용이 가능 
  • Assembler Design 가능 
  • Parser Design 구현

내가 다시 관심을 크게 가지게 된것은 Device Tree Source 이고, Device Tree Compiler 때문이다.
그리고 다른 HAL (Hardware Abstract Layer) Compiler를 비롯하여 간단한 Compiler들 때문이다.
만약 가능하다면,  Device Tree 같은 Compiler를 간단히 구현을 하고싶다.

  • Linux의 Lex와 Yacc (Flex, Bison) 
Linux에서는 현재 Lex 대신 Flex를 사용하며, Yacc 대신 확장된 기능인 bison을 사용하고 있으며,
Makefile에서 Lex와 Yacc대신 Flex와 Bison을 설정해서 사용하면 될 것이다.


  • Lex 와 Yacc 기본역할
  1. Lex(Flex)의 역할은 입력문자열에 대한 검색역할을 담당 ( Lex scanner) 
  2. Yacc(Bison)는 실제적인 문자열의 분석을 담당 (Yacc parser) 

1.1 Lex와 Yacc 한글 관련자료

Lex와 Yacc의 관련된 기능문서 및 관련자료는 이곳에 Link하고 관련 Link를 소개하겠다.

  • Lex와 Yacc 한글문서 및 예제
  KLDP에서 만들어진 Manual로 좀 더 원론적으로 잘 설명해주고 있다.

  https://wiki.kldp.org/KoreanDoc/html/Lex_Yacc-KLDP/Lex_Yacc-KLDP.html#toc1
  https://github.com/swmaestro06-apus/apus/wiki/Lex-&-Yacc-(flex-&-bison)-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC

  • Lex와 Yacc 한글문서 및 관련예제 
   Lex와 Yacc를 예제가 쉬어 따라하고 이해하기가 쉽다.

   https://www.joinc.co.kr/w/Site/Development/Env/Yacc

1.2  Flex 와 Bison Manual 

상위 문서들은 빠른 이해에 도움이 되겠지만 직접 Manual을 읽는 것이 상세한 설정 및 사용법에 더 도움이 더 되는 것 같다.

  • Lex와 yacc Manual
쉽게 잘 작성된 Manual이며, 이해하기 쉽게 되어있다.
  http://www.epaperpress.com/lexandyacc/index.html

  • Compiler의 디자인 방법
Compiler를 Design 하는 방법으로 구조와 만드는 방법 , 즉 Lex와 Yacc를 사용 
  https://www.tutorialspoint.com/compiler_design/index.htm

  • Lex 와 Yacc (Flex, Bison) 전체 Manual
Lex , Yacc , Flex, Bison 개별 Manual을 연결해주고 있으며, 사실 이 사이트면, Manual이 충분한 것 같다. 
하지만 나중에 Link가 끊기면 아래로 별도의 사이트로 연결하자.
  http://dinosaur.compilertools.net/


  • Lex와 Yacc의 다양한 예제 
  http://aquamentus.com/tut_lexyacc.html


  • Flex (Lexical Analyzer) Manual 
  Flex Tool의 사용법 및 Manual

  http://dinosaur.compilertools.net/flex/index.html
  http://dinosaur.compilertools.net/flex/manpage.html

  • Bison ( Parser Generator) Manual
  보기전에 Lex와 Yacc의 기본동작을 이해하고 , 그 다음에 관련 세부 Manual로 사용

  https://www.gnu.org/software/bison/manual/
  http://dinosaur.compilertools.net/bison/index.html


2. Flex와 Bison의 역할 

Lex와 Yacc의 각각의 기본기능을 알아보고 이를 쉽게 사용을 해보자.
우선 Lex와 Yacc가 Compiler를 만드는 도구이기 때문에 Compiler의 기본구성을 알아보자.

  • Compiler Design 시 Compiler의 구조 (C 언어) 
  Compiler의 기본동작의 작업을 이해해보자
  GCC의 더 깊은 이해하고자 한다면, 예를들면, front-end , back-end 기능 GCC Manual 참조

아래의 사이트에서 컴파일러의 디자인에 대해 자세히 설명을 해주고 있다.
  https://www.tutorialspoint.com/compiler_design/compiler_design_overview.htm


IETF에서 만들어지는 Protocol 형식 HTTP/SIP/RTSP 이런식의 간단한 Parser를 한번 만들어보자.

2.1 Lexical analysis (Flex)의 역할 및 구조 

Lexical analysis or scanner 라고 하며, Flex인 경우는 (The Fast Lexical Analyzer)의 약어이며, C와 C++ 위한 Tool이다.
만약 다른 언어와 조합을 하고자 한다면, 다른 Lexical analysis를 알아보자.

  • Lexical Analysis의 소개 
  사용되는 기본용어설명 ,  다양한 Lexical Analysis 종류 소개 , 이에 역할

  https://en.wikipedia.org/wiki/Lexical_analysis

한글로 번역하고자 하면 어휘분석기 기능이며, 각각의 언어에서 문법요소를 확인하여 어휘최소단위인 Token으로 분리해내는 작업이다.

Lex의 구성은 다음과 같이 구성이 된다고 한다.

  • definitions 
  1. %Flex의 기능정의 가능 
  2. 변수 지정도 가능 
  3.  %{  }% 안에 C언어의 코드 작성으로 MACRO 및 user code 함수 선언
  • rules
  • user code section
Lex의 구성

... definitions ... 
  # rules에 pattern을 간단하게 하기 위한 선언과 초기 조건
  # C코드 삽입시 %{, }% 기호를 표시하고 사이에 쓸 수 있음
%%
... rules ...  
  # pattern과 action으로 이루어짐
  # C코드는 {, }로 감싸서 표시함
%%
... user code section...
  # yylex()함수 등 yy 관련과 사용자가 원하는 C 루틴으로 이루어진다. 
  # 만약 이곳에 생성을 했다면, 상위 %{ }% 안에 선언을 해주자. 



2.2 Bison의 역할 및 구조 


  https://en.wikipedia.org/wiki/Compiler-compiler


Github의 apus Project
  https://github.com/swmaestro06-apus/apus/wiki/Lex-&-Yacc-(flex-&-bison)-%EB%82%B4%EC%9A%A9-%EC%A0%95%EB%A6%AC



3.1 Flex와 Bison의 Make 구성

3.2 Flex File 구성

3.3 Bison File 구성


6/11/2017

CCSv7 Release 및 Free License 정책

1. CCSv7 Release 

CCSv7이 나와 있어서 이제 이것을 설치해보고 작동을 해봤다.
기존의 것과 좀 다르지만, Version 6과 얼추 비슷한 것 같다.

지인을 통해 이미 무료화가 되었다고 듣기는 했지만, 아래의 글을 읽어보면 좀 애매하다.
라이센스 Version CCSv6 와 CCSv7 기능이 완전 동일 한건지 좀 모르겠다.
어찌되었든 CCSv7도 사용해보자.

CCS는 현재 Compiler를 GCC와 TI Compiler를 지원을 하며, 개별 Version에 따라 문제가
약간씩 발생하는 것 같다.
이는 APP Center에서 추가 설치로 어느 정도까지는 지원을 하지만, 이후는 본인도
더이상 테스트를 진행을 해보지를 못해서 뭐라고 못하겠다.

CCSv7 Download
  http://processors.wiki.ti.com/index.php/Download_CCS

CCSv7 관련기사
  http://www.mcublog.co.kr/2090

2. CCS의 Project 관리의 예 

CCS의 설정의 예
  http://processors.wiki.ti.com/index.php/Creating_CCS_Project_using_SimpliciTI

상위 사이트에서 처음알게되었는데, Command configuration file 이라는 것이 존재하는데,
Compiler의 설정을 별도로 script 형식으로 설정을 하는 것이며, 주로 define으로 사용한다.
같은 Project 내에서 Make 외의 구분자 역할을 할수 있어 좋은 것 같다.

나머지는 전에 사용하던 Project 관리와 거의 유사하다고 보면 되겠다.
ARM을 사용하다가 MCU(MSP430)은 좀 많이 다른 것 같으며, 이상하게 좀 더 복잡한것 같기도 하다.
본인도 처음사용해보는 터라, Tool에 빨리 익숙해지는 것이 좋겠으며, 관련 Project들이
좀더 잘 구현이 되어있는 것 같다.

3. CCS의 무료 라이센스 

CCS의 모든 Version이 무료화가 되었다고 하니 아래의 절차대로 무료로 등록해서 사용하자.

  1. CCS License 파일 Download 및 저장 
  2. Help->Code Composer Studio Licensing Information t선택
  3. License Information View->Manage 에 Download한 License파일을 추가 






제대로 등록이 되었다면, License Type: Full License 로 변경이된다.


  • 기존방식
  http://processors.wiki.ti.com/index.php/Activating_CCSv6


  • 무료로 License File Download 
  http://processors.wiki.ti.com/index.php/Licensing_-_CCS
  http://processors.wiki.ti.com/index.php/Licensing_-_CCSv6


4. CCS의 Profiler 기능 

CCS에서 Profiler의 기능을 사용하고자 한다면 아래의 기능을 알아보자.
예를 들면, 함수들의 실행시간 및 성능 자세한 분석 기능

  http://processors.wiki.ti.com/index.php/Profiler
  http://processors.wiki.ti.com/index.php/Profile_clock_in_CCS