묻고 답해요
140만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨ARM Cortex-M 프로세서 프로그래밍
teq, tst 명령어 에서의 Z값
안녕하세요.S324에서 질문 사항이 하나 있습니다!teq 명령어에서 true 이면 Z=1이고,tst 명령어에서는 true이면 Z=0이 된다고 말씀하셨는데,이건 각 명령어의 규칙인 것인가요? 이전에는 두 인자를 비교할 때, 값이 true이면 Z = 1이 된다고 하셨던 것 같아서요.무언가 제가 잘못 이해하고 있는 것 같기도 한데,이 부분이 헷갈려서 질문 드립니다!
-
해결됨ARM Cortex-M 프로세서 프로그래밍
S207 SP 레지스터의 alias 관련
안녕하세요.이제 강의 시작한 초보 FW 개발자입니다.S207의 SP 레지스터에 alias 관련해서 2가지 질문이 있습니다.설명해주실 때에는 "SP 레지스터를 통해, MSP 레지스터 or PSP 레지스터가 결정된다"고 하셨는데요.강의 자료(PDF)에는 SP 레지스터 - PSP 레지스터가 점선으로 표시되고, X 표시가 있는데, SP 레지스터는 PSP 레지스터로 alias 되는 것은 아닌가요?바로 MSP or PSP 레지스터를 이용하면 될 것 같은데,SP 레지스터를 통해 1단계를 더 거치는 이유가 무엇일까요? FW 관련하여 좋은 강의해주셔서 감사드립니다!
-
미해결ARM Cortex-M 프로세서 프로그래밍
s319_RISC 강의 질문입니다.
컴파일 오류가 발생하여 수업질문 내용을 참고해 b _exit1 nop .space 1 ->작은 숫자로 낮췄습니다.하지만 여전히에러가 발생하는데 해결할 방법을 부탁드립니다.감사합니다.
-
미해결ARM Cortex-M 프로세서 프로그래밍
수업 자료 중 궁금한 것이 있습니다.
올려주신 수업 자료에서 아래 코드를 하는 이유가 hard fault라고 적어 노셨습니다.아래 코드가 어떤 의미인지 설명 부탁드립니다 SCB->SHCSR = SCB->SHCSR | (7<<16);
-
미해결ARM Cortex-M 프로세서 프로그래밍
User Thread 와 Privilege Thread에 대해서
안녕하세요 User Thread 에서 Privileged Handler로 모드가 바뀌는 경우를 예를 들면 익셉션 상황 (예를 들어 타이머나 DMA로 인한 인터럽트) 에 핸들러모드로 진입 후 핸들러 함수로 분기하여 처리가 되는 것으로 이해를 했습니다.그러면 Privileged Handler 에서 Privileged Thread로 모드가 바뀌는 경우는 어떤게 있나요?
-
미해결ARM Cortex-M 프로세서 프로그래밍
putty에서 글자가 깨집니다.
처음에는 잘 되었는데 컴퓨터 끄고 키니 putty에서 printf에 출력될 한글 영어 글자가 깨져서 나옵니다.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
파이프라인 동작 관련 질문 드립니다.
강사님. 안녕하세요. 강의 잘 보고 있습니다.파이프라인에 대해 갑자기 궁금증이 생겼는데요.1. thumb/thumb2와 관계없이 프로그램 카운터의 위치는 항상 PC = 현재 명령어 위치 + 4라 설명하신 것 같은데요. thumb의 경우 2바이트 명령어니 이해가 갑니다만 thumb2는 4바이트라 PC = 현재 명령어 위치 + 8이 되는게 아닌가요? 왜 항상 PC = 현재 명령어 위치 + 4 인지 궁금합니다.명령어를 페치하는 기본 단위는 32비트라 되어있습니다.2. 명령어 페치시 만약 thumb 코드라면 2개의 명령어를 페치한다는 것 같은데, 만약 A 명령어와 B 명령어(둘 다 thumb)를 페치한다면 이 두 명령어의 파이프라인 동작이 어떻게 되나요?A 명령어 먼저 F-D-E되고 그 후에 B 명령어가 F-D-E가 파이프라인으로 동작하게 되는건가요?3. 그렇다면 만약 thumb명령어와 thumb2명령어가 페치될 경우에 어떻게되나요?A 명령어(thumb라 가정), B 명령어(thumb2라 가정)일 때, 32비트 페치시 A 명령어와 B1(B 명령어의 2바이트)가 페치될 것으로 예상이 됩니다만, 그 후의 동작이 이해가 되지 않습니다. 항상 질문에 친절하게 답변해주셔서 감사합니다.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
실행결과와 표 차이
강의 잘 보고 있습니다.앞서 강의의 표에선 Cortex-M3/M4의 경우 DMIPS/MHz 값이 1.25로 나옵니다.그렇지만 실험을 통해 DMIPS를 측정했을 때 72DMIPS(180MHz 기준)으로 나오는데 이럴 경우 앞의 표에서 본 값이랑 너무 차이가 큽니다.문제가 있어보이는데 제가 무엇을 놓치고 있는건가요?
-
미해결ARM Cortex-M 프로세서 프로그래밍
libs.s 실행 관련 문의
안녕하세요~main.c의 max함수를 실행하면별다른 include 선언 없이 어떻게 libs.s에 있는 max로직을 타는지 알 수 있을까요?
-
미해결ARM Cortex-M 프로세서 프로그래밍
파일 실행 불가
안녕하세요!File -> open project from file system 으로 예제 파일 불러와서실행하려고 하는데,Unable to launchThe selection cannot be launch, and there are no recent launches라는 문구가 뜨면서 실행이 안됩니다.어떻게 하면 될까요?
-
해결됨ARM Cortex-M 프로세서 프로그래밍
r7 레지스터 관련 질문 드립니다.
강사님. 강의 잘 보고 있습니다.r7 레지스터가 강의 초반부에 스택 포인터와 관련된 레지스터라고 말씀해주셨던 것 같은데 왜 필요한지 잘 이해가 가지 않습니다.익셉션 호출시 하드웨어에서 자동으로 sp를 포함한 8개의 레지스터를 저장한다고 강의에서 설명해주셨는데, 왜 따로 r7에 스택 포인터를 저장하고 필요시 저장까지 하는지 이해가 필요할 것 같습니다.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
테일 체이닝 관련 질문 드립니다.
강사님. 강의 잘 보고 있습니다. 감사합니다.테일체이닝 관련 실습 진행 중 질문이 생겨 글 남깁니다.이번엔 질문이 좀 많습니다.최대한 잘 정리해보도록 하겠습니다.상황 - 테일 체이닝이 발생될거라 생각되는 지점에 Breakpoint를 걸었습니다.먼저 예상되는 상황은 EXTI0_IRQHandler 함수가 호출되기 전 스크래치 레지스터[r0-r3]와 그 외 사용되는 레지스터들이 스택에 저장될 것이라 생각됩니다. 1. 1.EXTI0_IRQHandler 함수 호출 전의 어셈블리어를 볼 수 없어 이 부분도 사실인지는 잘 모르겠습니다. 여기서 if(SCB->ICSR & (1<<26) ) 가 참이라면, EXTI0_IRQHandler 동작이 끝난 후 SysTick_Handler가 실행될거라 예상이 됩니다.2. 테일 체이닝이 없다면 EXTI0_IRQHandler가 끝나고 복귀가 이뤄질 때, 먼저 저장했던 r7과 lr값을 pop한 후 EXTI0_IRQHandler 호출 전 스택에 저장한 스크래치 및 그 외 레지스터들을 pop할 것으로 생각이 됩니다.그 후에 SysTick_Handler가 호출이 될텐데... 호출 전에 레지스터들이 스택에 먼저 push될 것이고 {r7, lr}도 push될 것이라 생각이됩니다.테일 체이닝은 레지스터 복원없이 바로 다음 인터럽트가 실행될 수 있다고 하셨습니다.그렇다면 위 예제에서 EXTI0_IRQHandler 끝난 후 복원없이 SysTick_Handler가 실행된다는 말인데, 제 생각엔 {r7, lr}은 복원되어야하고, 그 외 레지스터들은 따로 복원없이 실행되어야할 것 같은데 맞나요? 3. EXTI0_IRQHandler 호출 전 사용되는 레지스터들이 스택에 push되는게 맞다면 그것을 disassembly 창같은 것으로 확인할 수 있는 방법이 있나요? 4. if (SCB->SHCSR & (1<<11))에서 SHCSR의 11번째 비트는 SYSTICKACT인데, 즉 SysTick 타이머 인터럽트 동작 중에 우선순위가 더 높은 EXTI0가 발생했고, 결과적으로 SysTick_Handler가 실행되다 중단되고EXTI0_IRQHandler가 실행하여 저 구문이 실행된 것으로 이해해도 될까요? 많은 질문을 드려 죄송합니다.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
Memory fault, Bus fault 관련 질문드립니다.
강사님. 강의 잘 보고 있습니다.수업을 듣다보니 Bus fault, Memory fault에 대해 궁금해져서 질문 드립니다.구글링해도 명확한 답을 못 찾아서 그런데, 둘은 어떤 오류가 감지될 때 실행되는 익셉션인지 설명해주실 수 있을까요?
-
해결됨ARM Cortex-M 프로세서 프로그래밍
Fault 관련 질문 드립니다.
강사님. 강의 잘 보고 있습니다. 감사합니다.질문이 있는데요.Hardfault 같은 경우 다양한 원인으로 익셉션이 발생할 수 있는 것으로 알고있습니다.그만큼 디버깅이 어려운데설명을 들어보니까 SCB:SHCSR에서 USGFAULTENA, BUSFAULTENA, MEMFAULTENA를 enable하지 않으면 위와 같은 문제가 발생할 경우 전부 Hardfault 익셉션으로 처리가 되는 것 같은데요.만약 USGFAULTENA, BUSFAULTENA, MEMFAULTENA를 전부 1로 설정하고 각각 익셉션을 정의하면 적어도 어떤 문제로 fault가 발생했는지 더 알기 쉬울 것 같은데 왜 이 값을 default로 설정한 것인지 또 실무에서 자주 사용이 되는지 궁금합니다. 정리하자면 USGFAULTENA, BUSFAULTENA, MEMFAULTENA를 1로 설정하지 않은(default) 상태에서 Hardfault 가 발생한다면 원인 찾기가 어려울 것 같지만, USGFAULTENA, BUSFAULTENA, MEMFAULTENA를 1로 설정하면 디버깅에 좀 더 도움이 되지 않는가?그런데 왜 default로 설정되어 있는지실무에서는 많이 사용 안하는지가 되겠네요.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
메모리 구조 질문 드립니다.
강사님 안녕하세요. 강의 잘 보고 있습니다.질문 있습니다.강의에서 메모리 구조 ROM, RAM mixed structure와 RAM only를 보았는데요.ROM, RAM mixed structure같은 경우는 NOR flash와 RAM을 사용하는 경우RAM only는 NAND flash와 RAM을 사용하는 경우라고 이해해도 되나요?NOR flash같은 경우 랜덤 액세스가 가능해서 플래시메모리에서 실행 가능하지만 NAND flash는 랜덤 액세스가 불가능하여 자체적으로 실행은 못하고, RAM으로 복사해야한다고 알고 있거든요.추가적으로 만약 그게 아니라면 RAM only는 어떤 경우에 가능한 것인지 궁금합니다.
-
해결됨ARM Cortex-M 프로세서 프로그래밍
Thumb2 기반 ldr r0, [PC, #imm] 명령어 해석법 질문 드립니다.
강의 잘 보고 있습니다.주소 지정 작업을 위해 기본 레지스터로 사용될 경우 왜 항상 4바이트 정렬해야하나요?강의 마지막 부분에서 나온 예를 보면0x08000632에서 로드 명령을 실행하는 동안 PC 레지스터는 0x08000636로 읽지만-> 파이프라인 구조니까 0x08000632에서 실행하는 동안 PC의 값은 Thumb의 경우 +4, Thumb2의 경우 +8가 될 것으로 생각이 됩니다.ldr...[pc]의 기본 주소는 Align(0x08000636, 4), 즉 0x08000634이다.-> 왜 4바이트 정렬을 해야하는지 이해가 가지 않습니다.
-
해결됨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이 발생할 것 같아서요.제가 잘못 이해하고 있는건가요?