묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨ARM Cortex-M 프로세서 프로그래밍
ARM, thumb, thumb2 관련 질문 드립니다.
안녕하세요. 강사님. 강의 잘 보고 있습니다. 질문이 있는데요.ARM 명령어와 thumb명령어가 존재하는 프로세서는 branch할 때 주소의 LSB의 값을 보고 해당 주소의 명령어가 thumb인지 ARM 명령어인지 구분한다고 이해하고 있습니다.ARM 명령어는 32비트이고 thumb 명령어는 16비트라 명령어 구조가 달라 구분이 필요하다고 생각합니다.여기서 질문이 있는데요.1. thumb2 명령어는 32비트 명령어로 알고 있습니다.그러면 thumb 명령어와 thumb2 명령어의 구조 또한 다를텐데 이 둘은 구분이 따로 필요 없는건가요?강의를 보면 thumb 명령어나 thumb2 명령어나 주소로 branch할 때 무조건 1을 더하라고 말씀하셔서요. 2. 작성된 코드를 컴파일러가 어셈블리언어로 변환하는데, 이 때 컴파일러의 판단?에 따라 thumb명령어와 thumb2 명령어가 섞일 수 있는 것으로 알고 있습니다.만약 thumb와 ARM 명령어를 지원하는 프로세서에서는 컴파일할 때 thumb 명령어와 ARM명령어가 섞일 수 있나요?아니면 명시적으로 이 부분은 ARM 혹은 thumb 명령어로 컴파일하라고 명시적으로 지시해야하는 건가요? 3. 2번 질문에서 컴파일러에 따라 ARM 명령어와 thumb 명령어가 섞인다면 어셈블리어로 프로그램을 작성할 때, branch 명령어를 사용할 때 문제가 있지 않나요?예를 들어adr r0, function1blx r0위처럼 작성을 했을 때, 컴파일러가 function1을 ARM 명령어로 컴파일할지, thumb명령어로 컴파일할지에 따라 Hardfault 익셉션이 발생할 수도 있을 것 같아서요.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
cmp r0, #0 실행시 상태 레지스터의 C = 0b1이 되는 이유가 무엇인가요?
강의 잘 보고 있습니다.궁금한게 있어서 질문 드립니다.제가 알기론 cmp 명령어를 실행하면 오퍼랜드끼리 빼는 것으로 알고 있습니다.따라서 cmp r0, #0시 Z flag가 1이 되는 것은 이해가 갑니다. 0 - 0 을 뺀 결과도 0이니 Z flag가 1이 되겠죠.근데 C flag가 왜 1이되는지는 이해가 가지 않습니다.이유가 무엇인가요?
-
해결됨ARM Cortex-M 프로세서 프로그래밍
AAPCS 관련 질문 드립니다.
안녕하세요. 강사님.강의 잘 보고있습니다.실습 진행 중 궁금한게 있어서 질문 남깁니다.아래 그림은 result = max(b, a); 를 실행하기 전 레지스터입니다.아래 그림은 max 어셈블리 함수 내용입니다.bx lr가 실행되기 전까지 레지스터 상태를 보면 별 문제 없어보이는데요.문제는 저 라인이 실행한 후입니다.레지스터 셋을 보시면 갑자기 r3값이 변하는 것을 확인할 수 있습니다. AAPCS를 보면 result값은 r0 또는 r1인데 말이죠.제 함수에 문제가 있어보이지는 않는데 무엇이 문제인지 혹시 알 수 있을까요?
-
해결됨ARM Cortex-M 프로세서 프로그래밍
pipeline stall 현상 방지에 관한 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요. 강사님.강의 잘 보고 있습니다.질문이 있습니다.blanch 코드의 경우 pipeline stall이 발생할 수 있다하셨습니다.아래는 예제입니다. cmp r0, r1 bge 1f 만약 이 명령어가 실행된다 가정하면blt 2f1:bx lr2:mov r0,r1...3-stage pipeline일 때 각 단계를 보면 아래처럼 될 것으로 생각이 듭니다.E bge 1fD blt 2fF bx lrExecute 에서 갑자기 분기를 했으니 그 전에 있던 Fetch Decode 값이 의미가 없다?라고 생각하고 버리겠죠. 이게 pipeline stall로 이해하고 있는데it 명령어는 왜 pipeline stall이 없는 명령어인지 이해가 되지 않습니다.다음에 실행될 명령어를 미리 안다? 생각해도 Decode 단계에서 해석을 해야 가능할 것 같은데, 그렇다면 pipeline stall이 발생할 것 같아서요.제가 잘못 이해하고 있는건가요?
-
해결됨ARM Cortex-M 프로세서 프로그래밍
프로그램 다운로드가 안됩니다...
강사님 안녕하세요.질문 있습니다.혹시 강사님께서 실습 보드에 따로 파워를 공급해주나요?USB ST-LINK 단자로만 사용하고 있는데 드라이버 업데이트도 다 되어있고(제거 후 설치까지 해봤습니다.) 펌웨어 업데이트도 다 했는데 자꾸 디버그만 누르면Error in final launch sequence:Failed to start GDB serverFailed to start GDB serverjava.lang.NullPointerException 위와 같은 에러 메세지만 출력되고 디버그가 실행되지 않습니다. 무엇이 문제인지 모르겠습니다. 너무 답답하네요.ST-LINK Utility 프로그램으로 연결해보니 잘되는 것을 보아 전원이나 연결 문제는 아닌 것 같습니다.위 log처럼 디버그 configure를 설정해도 같은 문제가 발생하네요. ㅠㅠ
-
해결됨ARM Cortex-M 프로세서 프로그래밍
thumb2명령어와 thumb명령어가 섞여있을 때 플래시 메모리 읽기 동작
안녕하세요. 강의 잘 보고 있습니다.강의를 보다 질문이 있어서 글 남깁니다...1. 강사님께서 예로 보여주신 플래시 메모리 내용이 아래처럼 되어 있는데요.0x080001d4 ldr0x080001d6 mov0x080001d8 str0x080001da ldr0x080001dc mov...이 메모리 안에는 현재 Thumb명령어만 있다고 가정한 것으로 이해해도 될까요? Thumb2명령어라면 주소가 2가 아니라 4씩 증가해야할 것 같아서요.2.플래시 메모리의 성능 향상을 위해 버스 크기가 128bit라 하셨습니다. thumb명령어의 경우 8번, thumb2 명령어의 경우 4번의 읽기가 가능하다는 것인데, 만약 이 두 명령어가 섞여있다면 어떻게 되는건가요?0x080001d4 ldr0x080001d6 mov.w0x080001da str.w0x080001de ldr.w0x080001e2 mov.w...이렇게 되어 있다면 총 96bit밖에 읽을 수 없는 것인가요? 3.D-Code는 어떤 역할을 하는 것인가요? 코드 영역에 있는 const 데이터 등을 읽어들일 때 사용하는 버스인가요?그렇다면 명령어랑 데이터랑 플래시메모리 버퍼에 같이 저장될 수도 있는 것인가요?
-
해결됨ARM Cortex-M 프로세서 프로그래밍
BOOT 핀을 통해 부팅 모드 변경시 리맵핑이 따로 필요한가요?
강의 잘 보고 있습니다.강의를 듣다가 질문이 생겨서 남깁니다.강의를 보면 SRAM에서 부팅을 하고 싶을 때? SYSCFG_MEMRMP의 MEM_MODE[2:0] 비트로 제어를 한다고 설명하신거 같은데요. (이 경우 MEM_MODE = 2'b001이 되겠죠?)BOOT[1:0] 핀을 하드웨어에서 2'b11로 만들으면 따로 SYSCFG_MEMRMP 레지스터 값 변경없이 자동으로 변경이 되는건가요??추가적으로 System 메모리에 UART로 데이터를 플래시메모리에 다운로드할 수 있는 코드를 삽입하고 유저가 플래시메모리로 부팅할지 아니면 프로그램 다운로드를 할지 선택하는 것을 주로 봐와서 System 메모리로 부팅한다라는 것은 이해가 가는데 SRAM으로 부팅하는 경우가 잘 이해가 되질 않습니다.코드 영역에 있는 데이터를 굳이 SRAM으로 복사를 해서 부팅해야하는 경우가 있나요?