Cannot complete the install because one or more required items could not be found

I tried to install Android SDK and Eclipse Galileo on a fresh ubuntu 9.10 and found the error while installing ADT Plugin for Eclipse:

Cannot complete the install because one or more required items could not be found.
Software being installed: Android Development Tools 0.9.4.v200910220141-17704 (com.android.ide.eclipse.adt.feature.group 0.9.4.v200910220141-17704)
Missing requirement: Android Development Tools 0.9.4.v200910220141-17704 (com.android.ide.eclipse.adt.feature.group 0.9.4.v200910220141-17704) requires 'org.eclipse.wst.xml.core 0.0.0' but it could not be found


It's because there are some components missed in the setup, and the Galileo update site is not in the list of Available Software Sites.

To solve the problem:
Add "http://download.eclipse.org/releases/galileo" in the Available Software Sites.

그냥 주관적인 글입니다.

이런 생각도 있으니 참고 하세요.

  1. 직원들 얼굴이 어두운 회사
    더이상 말이 필요없다.
    직원들 얼굴이 현재진행상황을 알려준다.

  2. 우수인재 확보 X
    쓸만한 인재인데도 기존의 임금수준과 직급을 들먹이며 빈둥빈둥 시간을 끈다.
    결국엔 갓 대학 졸업한 싸구려 인력만 뽑는 회사다.

    좋은 인재를 찾으려는 노력자체를 하지않는 회사다.
    이런 회사는 인재을 코딩하는 소모품으로 정도밖에 생각하지 않는다.

    본인도 소모품으로 취급될 것이다. 빨리 나와라.

  3. 테스트 기간 없는 회사
    겁나게 큰 프로젝트인데도 테스트 기간을 전혀 잡지 않는 회사
    이론상 제작 기간의 2배를 테스트 기간으로 잡아야 정상이다.

    하지만 우리나라 특성상 -_-; 
    대부분 열악한 기업들이 그리 길게 잡지 못한다.

    3명이상 플젝이면 최소 최소 최소 아주 작게 잡아도 1주이상 잡아야 한다.
    1주일이면 정말 미니멈이다. 
    설계자가 1주일도 테스트 기간을 잡지 않는다면 
    내일부터 출근하지 마라.

    각종 버그에 고객 요구사항에 뒤처리만 하느라 두배로 기간이 늘어난 프로젝트에 빠져 허우적 댈것이다.

  4. 월급이 안나오는 회사
    IT기업은 지금도 수많은 회사들이 창업하고 망한다.
    인권비는 IT계열에서 수익을 얻기위한 가장 기본적인 유지비용이다.
    직원들 월급도 못줄 정도라면 정말 회사 사정이 어려워 진거다.
    월급이 한달이라도 밀린다면 사정없이 그만둬라.

    프로젝트 진행중이라도 상관 없다!!! 무조건 나와라!!

    그리고 그만둘때는 다른일을 핑계대고 
    그일만 아니라면 무보수로 몇개월씩 있을수 있다고 강조하며
    회사가 어려우니 한달 보수 정도는 포기하면서
    도의적 책임을 다하고

    (플젝 진행중일테니 한달동안은 무보수로 반드시 도의적 책임을 다해라~! 꼭 명심해라!! 법정에서 유리하다. -_-;; )

    사장과 기분좋게 끝내라.

    직원들 월급도 못주는 IT기업이 회생할 가능성은 정말 낮다.
    차라리 로또를 사라. 그게 확률이 높다.

    괜히 인간관계 생각해서 몇개월 무보수로 더 일하면 좋은 꼴 절대 못본다.
    사람은 돈이 관계되면 정말 치사해 진다.

    특히 장사를 하는 사람은 정말 그렇다.
    간이고 쓸개고 다 빼줄듯 하다가 회사 망해서 돈이 없으면 싹 돌아설 것이다.

    밀린월급 받으려고 소송들이대고 합의보고 하다보면
    잘 해봐야 몇개월 밀린 금액의 반정도로 합의 볼 것이다.
    그동안 사장이랑 싸우고 맘고생하고..... 손해가 막심하다.

    ps. 참고로 회사 이전은 왠만하면 재직중에 알아봐라

    백수로 있으면 마음이 다급해져서 아무회사나 들어가는 경우가 많다.
    또한, 보통 회사는 백수로 있는 인재보다는 재직중에 있는 인재를 좋아한다.

    어디에선가 '쓸모'있는 인재라는 보장이 있기 때문이다.
    (다른 회사에서 일 잘한 인재는 여기서도 일 잘할거야~~)

  5. PM이 의사결정을 하지 않는 회사
    의사결정을 다른이에게 맡기는 사람은 차라리 낫다.
    그런 결정 조차도 하지 않는 PM이다.(지가 못하면 갑한테 물어보든가~ -_-; )

    원인은 육안으로 잘 보이지 않지만 
    증상으로 쉽게 진단할수 있다.

    여러분이 똑같은 프로그램을 대여섯번 새로 만든다면 
    확실이 이런 타입의 PM이다.

    PM이 의사결정을 확실히 하지 않아 이렇게 짯다가 뒤엎고 저렇게 짯다가 뒤엎는다.

    일하는건 문제가 아니다.
    의사결정을 하지 않는 PM은 
    나중에 플젝이 아작 났을때 책임이 없다.

    심지어는 책임을 회피하려고 의사결정을 하지 않는 케이스도 있다.

    IT쪽에서 일 존내 마니 하다 보면
    플젝이 진흙탕에서 허우적 대다가 정말로 아작 나는 경우도 있다.
    근데 이런 PM은 아작나도 책임이 별로 없다.
    지가 책임질 부분이 적기 때문이다.

    아작 났을때 PM을 제외한 하위 직원들이 아~주 난해하다.
    조만간 직원들이 임무 %별로 PM보다 많이 프로젝트 보상금을 물고있는 자신을 보게 될것이다.
    (돈 벌러 회사 들어가서 꼴아박고 나오는 케이스.)

  6. 유지보수는 10분이면 된다는 회사
    아마 만줄 코딩하고 허리한번 피게 될거다.
    '고생'외에는 별 단점은 없지만
    개인적으로 싫어한다.

    나도 인간이다. 

    어떻게 주7일동안 일만할수 있는가.
    여자친구랑 놀시간도 필요하고 
    주말에 인라인도 타야되고 사진도 찍어야 한다.

    특별히 프로젝트 마무리단계도 아닌데 평상시에도 
    주말보장 안해주는 회사는 개인적으로 '즐'이다.

지금도 수많은 열악한 IT회사들이 있습니다.
이상하게도 이바닥은 소프트웨어산업이 
'무'에서 '유'를 창조하는 줄 알고있는 무식한 사람들이 세운 
열악한 회사가 엄청 많습니다.

IT도 분명히 투자금액이 있습니다.

인권비며 사무실 비용이며 엄청나게 돈이 들어갑니다.
그래도 아직 사회적 인식은 소프트웨어는 공짠줄 알죠 -_-;

그래 그런 멍청한 자들이 지돈 존내 꼴아박고 남의 월급도 못주고
남의 경력 걸레로 만드는 겁니다.

물론 좋은 회사면 오래 있어야 합니다.
그래야 근무년수도 늘고 연봉에도 이익이 많쵸.
그래서 글을 끄적여서 올려봅니다.

이곳 저곳 옮기면서 6개월짜리 경력 5개 가지고 3년 채우면
여러분 IT 경력은 정말 걸레가 되는 겁니다.

그걸 막기 위해

어떤 회사가 좋은건지
어떤 회사가 나쁜건지
어떤 회사에 오래 있어야 되는지

여러분 판단에 조금이라도 도움이 될까 개인적인 생각을 끄적여 봤습니다.

위 글은 저자의 동의 없이 함부로 퍼가셔도 됩니다. -_-)v


1. cstartup.s
- Exception Vector Table
- reset_handler / irq_handler 구현
- lowlevel_init으로 분기 : 클럭 설정, 각 인터럽트 소스에 디폴트 핸들러 등록, Watchdog Disable (분석이 더 필요)
- Remap SRAM
- Stack 설정 : Abort, IRQ, SVC 모드일 때 각각 스택 영역 설정
- Data 영역을 RAM에 적재
- Bss 영역을 0으로 초기화

2. gnu 어셈블리 지시어
- .global <symbol> : 심볼을 외부 링크로 제공
- .align {<expression>, {<offset>}} : 다음 명령어의 주소를 <expression> + <offset> 형태로 정렬

ARM은 기본적으로 거의 모든 명령이 4 byte로 구성되어 진다. 4의 배수로 실행 코드를 쪼개서 기계어 하나하나를 해석해 낸다고 보면 된다. 그런데 asm 코드들 중간에 address나 변수 등을 정의할 때 1 byte 2 byte로 정의를 해버리면 4의 배수가 않되는 경우가 발생한다. 이때 오류가 발생할 수 있다. 4의 배수를 맞추기 위하여 0으로 초기화되는 byte들을 추가로 패딩해주는 것이 필요한데 이것을 해주는 directive이다.

- .section <section_name> {, "<flags>"} : 새로운 코드 색션 또는 데이터 색션을 시작한다. 보통 코드 색션 .text, 초기화 된 데이터 색션 .data, 초기화 되지 않은 데이터 색션 .bss를 호출해야 한다. 이것들은 디폴트 플래그를 가지고 있으며 링커는 이 디폴트 이름들을 이해하고 있다.
- .word <word1> {,<word2>}... : ARM asm에서의 DCD와 같이 데이터로 32비트 워드값 목록들을 어셈블리에 삽입한다.

3. cstartup.S 코드
#include "project.h"

#define TOP_OF_MEMORY    (AT91C_ISRAM + AT91C_ISRAM_SIZE)
#define ABT_STACK_SIZE   8*3*4
#define IRQ_STACK_SIZE   8*3*4

#define ARM_MODE_ABT     0x17
#define ARM_MODE_FIQ     0x11
#define ARM_MODE_IRQ     0x12
#define ARM_MODE_SVC     0x13

#define I_BIT            0x80
#define F_BIT            0x40


/* Application startup entry point */
        .globl reset_handler    // reset_handler 심볼을 외부에 보이도록 한다.
        .align 4          // 4 바이트 단위로 정렬하겠다는 의미

.section .vectors    /* .vectors 색션 시작 */
.arm
        
/// 1. start ////////////////////////////////////////////////////////////////////////
/* Exception vectors (should be a branch to be detected as a valid code by the rom */
/* exception vector table */
_exception_vectors:
reset_vector:
        ldr    pc, =reset_handler  /* Reset vector : pc := reselt_handler  0x00000000 */
                  /* reset_handler로 분기됨 */
undef_vector:
        b    undef_vector    /* Undefined Instruction : 미구현  0x00000004 */
swi_vector:
        b    swi_vector      /* Software Interrupt : 미구현     0x00000008 */
pabt_vector:
        b    pabt_vector     /* Prefetch Abort : 미구현       0x0000000C */
dabt_vector:
        b    dabt_vector     /* Data Abort : 미구현         0x00000010 */
rsvd_vector:
        b    rsvd_vector     /* reserved : 예약되어 있는 공간   0x00000014 */
irq_vector:
        b    irq_handler     /* IRQ : read the AIC         0x00000018 */
fiq_vector:
/*------------------------------------------------------------------------------
 *- Function             : fiq_handler
 *- Treatments           : FIQ Interrupt Handler.
 *- Called Functions     : 
 *------------------------------------------------------------------------------*/

fiq_handler:
    b    fiq_handler    /* FIQ : 미구현           0x0000001C */
/* exception vector table end */
/* x86의 경우엔 해당 벡터에 address를 넣어 두면, 인터럽트 발생시에 해당 주소를 가져다가
   PC(Program Counter)에 넣어 주는 일이 발생하지만, ARM7의 경우엔 그냥 해당 벡터로 점프한다.
   예를 들어 IRQ가 발생했다면 다음 순간의 PC값은 0x00000018이 된다. 따라서 해당 벡터 번지에는
   단순히 번지가 들어가는 것이 아니라 점프 명령 같은 것이 들어간다.  */

/// 1. end //////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
    
/*------------------------------------------------------------------------------
 *- Function             : irq_handler
 *- Treatments           : IRQ Controller Interrupt Handler.
 *- Called Functions     : AIC_IVR[interrupt]
 *------------------------------------------------------------------------------*/

irq_handler:
/*- Manage Exception Entry */
/*- Adjust and save LR_irq in IRQ stack */
        sub      lr, lr, #4      /* lr := lr - 4 / 돌아갈 주소 교정 */
        stmfd    sp!, {lr}      /* *sp := lr / 스택에 lr 저장 */
/*- Save r0 and SPSR in IRQ stack */
        mrs      r14, SPSR      /* r14 := SPSR */
        stmfd    sp!, {r0,r14}    /* *sp <- r0, r14 */

/*- Write in the IVR to support Protect Mode */
/*- No effect in Normal Mode */
/*- De-assert the NIRQ and clear the source in Protect Mode */
        ldr      r14, =AT91C_BASE_AIC  /* r14 := AT91C_BASE_AIC */
        ldr      r0 , [r14, #AIC_IVR]  /* r0 := *(r14 + AIC_IVR) */
        str      r14, [r14, #AIC_IVR]  /* *(r14 + AIC_IVR) := r14 */

/*- Enable Interrupt and Switch in Supervisor Mode */
        msr      CPSR_c, #ARM_MODE_SVC

/*- Save scratch/used registers and LR in User Stack */
        stmfd    sp!, {r1-r3, r12, r14}

/*- Branch to the routine pointed by the AIC_IVR */
        mov      r14, pc
        bx       r0

/*- Restore scratch/used registers and LR from User Stack */
        ldmia    sp!, {r1-r3, r12, r14}

/*- Disable Interrupt and switch back in IRQ mode */
        msr      CPSR_c, #ARM_MODE_IRQ | I_BIT

/*- Mark the End of Interrupt on the AIC */
        ldr      r14, =AT91C_BASE_AIC
        str      r14, [r14, #AIC_EOICR]

/*- Restore SPSR_irq and r0 from IRQ stack */
        ldmia    sp!, {r0,r14}
        msr      SPSR_cxsf, r14

/*- Restore adjusted  LR_irq from IRQ stack directly in the PC */
        ldmia    sp!, {pc}^


/// 2. start ////////////////////////////////////////////////////////////////////////
/*------------------------------------------------------------------------------
 *- Function             : reset_handler
 *- Treatments           : Reset Interrupt Handler.
 *- Called Functions     : lowlevel_init
 *                         main
 *------------------------------------------------------------------------------*/

.section .text    /* text 색션 시작 */
reset_handler:
  ldr     pc, =_low_level_init  /* pc := _low_level_init */
                  /* _low_level_init 으로 분기됨 */

/*------------------------------------------------------------------------------
 *- Low level Init is performed in a C function: lowlevel_init
 *- Init Stack Pointer to a valid memory area before calling lowlevel_init
 *------------------------------------------------------------------------------*/

/*- Temporary stack in internal RAM for Low Level Init execution */
_low_level_init:
  ldr      r2, =_lp_ll_init    /* r2 := _lp_ll_init */
        ldmia    r2, {r0, r1}    /* r0 := lowlevel_init, r1 := TOP_OF_MEMORY */
        mov      sp, r1        /* sp := r1    sp := TOP_OF_MEMORY / 스택 위치 설정 */
        mov      lr, pc        /* lr := pc    return address를 저장 */
        bx       r0                 /* Branch on C function (interworking) */
                  /* lowlevel_init으로 분기됨, ARM상태 */
/* #define TOP_OF_MEMORY    ((char *)   0x00200000 + (0x00010000)) */
/// 2. end //////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

/// 3. start ////////////////////////////////////////////////////////////////////////
/*------------------------------------------------------------------------------
 *- Remap SRAM at 0x0
 *------------------------------------------------------------------------------*/

/* AT91C_MC_RCR : (MC) MC Remap Control Register */
_remap:
        ldr r2, _lp_remap    /* r2 := _lp_remap / r2 := AT91C_MC_RCR */
        mov r0, #AT91C_MC_RCB  /* r0 := AT91C_MC_RCB / AT91C_MC_RCB:1 */
        str r0, [r2]      /* *r2 := r0 / MC_RCR 레지스터에 1을 세팅 */
/* SRAM 영역이 0x00000000으로 리맵핑 된다 */

/*------------------------------------------------------------------------------
 *- Setup the stack for each mode
 *------------------------------------------------------------------------------*/

_stack_init:
  ldr      r2, =_lp_stack_init  /* r2 := _lp_stack_init */
        ldmia    r2, {r0, r1, r2}  /* r0 := TOP_OF_MEMORY / r1 := ABT_STACK_SIZE / r2 := IRQ_STACK_SIZE */
/* #define ABT_STACK_SIZE   8*3*4
   #define IRQ_STACK_SIZE   8*3*4 */


/*- Set up Abort Mode and set ABT Mode Stack */
        msr      CPSR_c, #ARM_MODE_ABT | I_BIT | F_BIT    /* Abort mode로 변경, IRQ/FIQ disable */
        mov      sp, r0      /* sp := r0 / sp := TOP_OF_MEMORY : Abort mode 스택 포인터 설정 */
        sub      r0, r0, r1    /* r0 := r0 - r1 */
/*- Set up Interrupt Mode and set IRQ Mode Stack */
        msr      CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT    /* IRQ mode로 변경, IRQ/FIQ disable */
        mov      sp, r0      /* sp := r0 / sp = TOP_OF_MEMORY - 8*3*4 : IRQ mode 스택 포인터 설정 */
        sub      r0, r0, r2    /* r0 := r0 - r2 */

/*- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack */
        msr      CPSR_c, #ARM_MODE_SVC | F_BIT    /* SVC mode로 변경, FIQ disable */
        mov      sp, r0      /* sp := r0 / sp = TOP_OF_MEMORY - 8*3*4 - 8*3*4 : SVC mode 스택 포인터 설정 */
/* Abort, IRQ, SVC mode들의 스택 포인터들을 설정 */
/* 각 모드 마다 스택 포인터가 각각 독립적으로 존재함으로 각 모드의 스택 영역을 설정한 것이다 */

/*------------------------------------------------------------------------------
 *- Segments initialization
 *------------------------------------------------------------------------------*/

/* Copy the data section in RAM at 0x0000 */
_init_data:
  ldr      r2, =_lp_data      /* r2 := _lp_data */
        ldmia    r2, {r1, r3, r4}  /* r1 := _etext / r3 := _sdata / r4 := _edata */ 
1:
        cmp      r3, r4        /* CPSR flag := r3 - r4 */
        ldrcc    r2, [r1], #4    /* C flag clear 이면 r2 := *r1 / r1 := r1 + 4 */
        strcc    r2, [r3], #4    /* C flag clear 이면 *r3 := r2 / r3 := r3 + 4 */
        bcc      1b          /* C flag clear 이면 1로 분기 */
/* _etext : 코드 영역의 끝을 가리킨다 */
/* _sdata : 데이터 영역의 시작을 가리킨다 */
/* _edata : 데이터 영역의 끝을 가리킨다 */

/* Clear the bss segment */
_init_bss:
  ldr      r2, =_lp_bss      /* r2 := _lp_bss */
        ldmia    r2, {r3, r4}    /* r3 := _sbss / r3 := _ebss */
        mov      r2, #0        /* r2 := 0 */
1:
        cmp      r3, r4        /* CPSR flag := r3 - r4 */
        strcc    r2, [r3], #4    /* *r3 := r2 / r3 := r3 + 4 */
        bcc      1b          /* C flag clear 이면 1로 분기 */
/* bss 영역을 0으로 초기화 */
/* _sbss : bss 영역의 시작을 가리킨다 */
/* _ebss : bss 영역의 끝을 가리킨다 */

/*------------------------------------------------------------------------------
 *- Branch to the main
 *------------------------------------------------------------------------------*/

_branch_main:
        ldr      r0, =main    /* r0 := main */
        mov      lr, pc      /* lr := pc / return address 저장 */
        bx       r0        /* main으로 분기 / ARM 상태 */
/// 3. end //////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

/*------------------------------------------------------------------------------
 *- Litteral pools
 *------------------------------------------------------------------------------*/

_lp_ll_init:
        .word    lowlevel_init
        .word    TOP_OF_MEMORY              /* Default SVC stack after power up */ 

_lp_remap:
        .word    AT91C_MC_RCR

_lp_stack_init:
        .word    TOP_OF_MEMORY             /* Top of the stack */
        .word    ABT_STACK_SIZE            /* ABT stack size */
        .word    IRQ_STACK_SIZE            /* IRQ stack size */

_lp_bss:
        .word    _sbss
        .word    _ebss

_lp_data:
        .word    _etext
        .word    _sdata
        .word    _edata
















RM7TDMI 레퍼런스 매뉴얼을 살펴보면 다음과 같이 칩코어의 블럭다이어그램을 찾을 수 있다.

 

 

위 그림에서 좌측부분을 보면 디바이스가 프로그램메모리에 접근하기 위해 PC(프로그램 카운터) 정보를 레지스터로부터 가져옴을 볼 수 있는데, 이로부터 resolve하는 어드레스의 크기는 A31:0의 총 32비트임을 보여준다. 즉, SAM7S가 인식하는 메모리의 어드레스 공간은 총 32비트(약 4.3GB)로 구성됨을 알 수 있다. 또한, PC는 32비트의 주소값을 저장해야 하므로, 아래의 그림에서 ARM7TDMI 코어의 동작모드(총 7가지)에 관계없이 레지스터15(R15)를 PC를 위해 사용한다.

 

 

SAM7S는 폰노이만 구조로서, 코어에 내장된 물리적 메모리(플래시 및 SRAM)와 각종 I/O 주변장치등을 매모리맵 I/O 방식(Memory Mapped I/O)으로 맵핑시켜 두었다. (아래 그림 참고)

 

 

 

우선 위의 그림의 좌측에서와 같이, 32비트의 어드레스 공간은 크게 3개의 영역으로 나뉘어져 있다. 하위 256MB는 물리적 메모리를 위한 영역으로 할당되어 있고, 상위 256MB는 주변장치를 위한 I/O 공간으로 할당되어 있다. 이들 사이의 3.5GB 정도의 공간은 미정의상태로서 사용되지 않는다.

 

여기서 하위 256MB의 물리적메모리를 위한 공간을 다시 자세히 살펴보면, 3개의 1MB 영역과 253MB의 미사용영역으로 이루어져 있음을 알 수 있다.(위 그림에서 우측 참고) 여기서, SAM7S의 프로그램메모리(플래시)는 0x10_0000 번지부터 맵핑되어 있으며, 데이터메모리(SRAM)는 0x20_0000 번지부터 맵핑되어 있다. 플래시와 SRAM의 공간은 각각 1MB의 영역만큼 할당되어 있으나, 플래시메모리와 SRAM의 용량은 디바이스마다 그 크기가 정해져 있기 때문에 실제 사용되는 공간은 디바이스의 메모리 용량에 의해 결정된다. (예컨데, SAM7S256의 경우 플래시메모리의 크기가 256KB이므로 256KB의 공간만큼만 사용가능)

 

디바이스가 리셋이 되면 PC는 0x0000_0000 번지로 점프하므로 이 곳은 아무런 메모리도 할당되어 있지 않아 왠지 모순이 되는 것 같다. 그러나, SAM7S에는 메모리 리맵핑(Memory Re-mapping) 기능이 제공되고 있어, 디폴트로 0x10_0000 번지의 플래시영역이 0x00_0000 번지에 리맵핑되어 있다. 따라서, 리셋이 되면 SAM7S는 플래시메모리의 내용을 읽으면서 부팅이 된다. 반면에,MC_RCR이란 레지스터의 RCB비트를 1로 세팅하면 재배치 명령(Remmap Command)이 실행되어 0x20_0000 번지의 SRAM영역이 0x00_0000 번지로 리맵핑되어 SRAM의 내용을 읽으면서 부팅이된다.

 

SAM7S의 플래시메모리는 Single Plane으로 구성되어 있기 때문에, 플래시메모리의 내용을 실행하면서 플래시-라이트를 할 수는 없다. 때문에, SAMBA와 같은 경우 이 리맵핑 기능을 이용하여 SRAM영역으로 SAMBA 코드를 복사한 뒤 SRAM영역에서 부팅하여 플래시메모리에 펌웨어를 라이팅하게 된다.

제로 확장... unsigned 일 때
부호 확장... signed 일 때


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 부호 확장
#include 

int main()
{
	char A = 0x7A;
	int B = A;
	
	printf("B = %x\n", B);
	
	A = 0x8A;
	B = A;
	printf("B = %x\n", B);
	
	return 0;
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 제로 확장
#include <stdio.h>

int main()
{
	unsigned char A = 0x7A;
	unsigned int B = A;
	
	printf("B = %x\n", B);
	
	A = 0x8A;
	B = A;
	printf("B = %x\n", B);
    return 0;
}



1
2
3
4
5
6
7
8
9
10
11
// 확장
#include <stdio.h>

int main()
{
	char c = 0x8A;
	
	printf("%x\n", c);
	
	return 0;
}

printf 인자로 스택영역에 있는 c의 값을 넘겼다. 여기서 스택은 메모리에 있고 버스(32 bit)를 통과함으로 확장이 일어난다. c 변수 자체가 signed이기 때문에 부호 확장이 일어났음을 알 수 있다.


Maybe a lot of people already know this, but I will write it down here, in case anyone forget it, or of somebody does not know already.

To upgrade the Linux Debian Stable Etch to testing Lenny, just need to follow these two steps.

1. Edit sources.list

sudo vi /etc/apt/sources.list

and change all words etch to lenny, or stable to testing

2. Update and upgrade

sudo aptitude update

sudo aptitude install apt dpkg aptitude

sudo aptitude full-upgrade

that is all, this also work if you want to go from lenny to sid, just change yoursources.list accordingly.

It is also better if you start your Debian Linux in text mode, so GDM or KDM could be restarted without problems.

You may be interested in reading this.


요즘 리눅스는 많이 쉬운것 같다... 단 명령어 세번으로 자동으로 시스템이 업그레이드 된다...

리눅스를 부팅할 경우 통상 u-boot를 사용하지만,
mini2440보드의 경우 Supervivi 라는 BIOS를 사용해서 부팅합니다.
일단, 리눅스 부팅에 사용할 파일은 패키지의 images/linux에 있습니다.

2010-01-17  오후 11:07    <DIR>          .
2010-01-17  오후 11:07    <DIR>          ..
2008-12-24  오후 12:08        69,206,016 a.bin
2008-12-24  오전 11:45        69,206,016 backup_n35.img
2008-12-23  오후 05:14               115 dnw.ini
2010-01-17  오후 11:07               701 readme.txt
2010-01-17  오후 11:07               700 readme.txt.bak
2008-09-08  오전 02:27        16,142,544 root_default.img
2007-04-10  오전 02:23        53,467,920 root_mizi.img
2008-09-08  오전 12:29        58,357,200 root_qtopia_mouse.img
2008-09-08  오전 12:17        59,711,520 root_qtopia_tp.img
2008-10-27  오후 04:02           127,764 supervivi_mini2440
2008-11-27  오후 04:08         1,537,204 zImage_a70
2008-11-27  오후 03:37         1,537,196 zImage_n35
2008-11-27  오후 04:30         1,537,184 zImage_vga1024x768

사용할 파일은

1. 부트  로더 : supervivi_mini2440
2. 커널이미지: zImage_n35
3. 루트이미지: root_qtopia_tp.img (Qtopia사용)

등입니다.

사용하는 툴은 터미널 상에서 커맨드를 입력하고 dnw.exe 를 사용해서 USB로 다운로드 합니다.
각각의 로딩될 NAND partition은 다음과 같습니다.

##### Partition Menu #####
[r] Reset mtd parition table
[a] Add a mtd partition entry
[d] Delete a mtd partition entry
[v] View the mtd partition table
[w] Write the mtd partition table
[q] Quit
Enter your selection: v
Number of partitions: 5
name            :       offset          size            flag
------------------------------------------------------------
vivi            :       0x00000000      0x00028000      0
eboot           :       0x00028000      0x00018000      0
param           :       0x00040000      0x00010000      0
kernel          :       0x00050000      0x00200000      0
root            :       0x00250000      0x03dac000      0
                                                              
<Fusing>
NOR flash로 부팅 한 뒤, Supervivi에서 'q'를 눌러 일반 커맨드 입력으로 들어갑니다.
이후 다음의 순서로 라이팅합니다.

1. 부트로더 다운로드

Supervivi>load flash vivi u

라고 입력한 후, "supervivi_mini2440" 을 dnw.exe로 다운로드 합니다.
(dnw.exe의 다운로드 어드레스는 의미가 없는 것 같습니다, 저는 "0x30000000"으로 설정하였습니다.)
'flash'는 NAND Flash에 다운로드
'vivi'는 'vivi' 파티션에 다운로드
'u'는 USB 사용

2. 커널 다운로드
Supervivi>load flash kernel u
라고 입력한 후 "zImage_n35"을 dnw.exe로 다운로드 합니다.

3. 루트이미지 다운로드

Supervivi>loadyaffs root u
라고 입력한 후 "root_qtopia_tp.img"을 dnw.exe로 다운로드 합니다.

<실행>
모두 라이팅 되었으면, "S2" 스위치를 NAND로 돌린 후 다시 리셋을 합니다.
그러면, 라이팅한 리눅스 이미지와 루트이미지로 자동 부팅합니다.

+ Recent posts