arm gcc 기준

아주 좋은 참고 링크

http://www.joinc.co.kr/w/Site/Embedded/Documents/LinuxKernelStudyForSystemenginer/app3.basic.html

https://wiki.kldp.org/wiki.php/DocbookSgml/GCC_Inline_Assembly-KLDP


작성해주신 고마운 분들에게 감사를



cmsis 라이브러리 예제 파일들

cmsis_gcc.h

io.h

그 외 linux kernel /arch/arm/include/asm/*

arch/x86/include/asm/*

들이 있다


__attribute__((always_inline)) static inline uint32_t test_return(void)
{
    uint32_t    ret;

    __asm volatile (
        "MOV %0, #41 \n"
        : "=r" (ret)                    //return value
    );

    return ret;
}

uint32_t test_return(void)
{
    uint32_t ret;

    ret = 41;

    return ret;
}
__attribute__((always_inline)) static inline uint32_t test_arg_return(uint32_t arg)
{
    uint32_t    ret;

    __asm volatile (
        "MOV %0, %1 \n"
        : "=r" (ret)                    //write only, return value
        : "r"    (arg)
    );

    return ret;
}

uint32_t test_arg_return(uint32_t arg)
{
    uint32_t ret;

    ret = arg;

    return ret;
}
__attribute__((always_inline)) static inline uint32_t test_arg_return(uint32_t arg, uint8_t *addr)
{
    uint32_t    ret;

#if 0
    //이런식으로 r3 레지스터를 직접 지정할 수 있다, 그리고 인자도 여러개 쓸 수 있다    
    __asm volatile (
            "LDRB    r3, %2 \n"
            "MOV %0, r3 \n"
            : "=r" (ret)                    //return value?"
            : "r" (value), "Q" (*addr)
    );

#else
    //포인터에서 값을 읽어 변수에 대입할 수도 있다
    uint32_t    tmp;

    __asm volatile (
            "LDREXB    %1, %3 \n"
            "MOV %0, %1 \n"
            : "=r" (ret), "+r" (tmp)                    //return value?"
            : "r" (value), "Q" (*addr)
    );
#endif


    return ret;
}


uint32_t test_arg_return(uint32_t arg, uint8_t *addr)
{
    uint32_t ret;

#if 0
    ret = *addr;
#else
    uint32_t tmp;

    tmp = *addr;
    ret = tmp;
#endif

    return ret;
}
__attribute__((always_inline)) static inline uint32_t core_test(uint8_t value, volatile uint8_t *addr)
{
    uint32_t    ret;
#if 1
    __asm volatile (
            "LDRB r3, %2 \n"
            "MOV %0, r3 "
            : "=r" (ret)                    //return value?"
            : "r" ((uint32_t) value), "Q" (*addr)
    );
#else
    //uint32_t    tmp;

    __asm volatile (
            "STREXB %0, %2, %1"
            : "=r" (ret), "=Q" (*addr)
            : "r" ((uint32_t) value));
#endif

    return ret;
}


Posted by 쵸코케키

블로그 이미지
chocokeki
쵸코케키

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

글 보관함