inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

FreeRTOS 프로그래밍

동시성 문제

disassembly 된 내용에 관한 질문 드립니다.

해결된 질문

235

김상현

작성한 질문수 62

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요. FreeRTOS에 관한 질문은 아니라 올릴까 말까 고민했는데, 혼자 힘으로는 해결이 안될 것 같아 도움 요청 드립니다.

아래의 사진을 보시면

1. 프로그램 카운터의 경우 0x8002e60인데,

ldr r3, [pc, #20]의 결과가 왜 0x8002e78이 되는 건가요?

pc에서 20만큼 더한 곳의 값을 r3에 불러오라는 것으로 해석이 되는데, pc에서 20만큼 더한거면 0x8002e74 아닌가요?

2. 

0x8002e78 번지의 값을 보면 0x20000020인데, 제 생각엔 이건 ticket 변수의 값이 저장된 곳이라 생각이 됩니다.

그런데 list 파일을 보면 

0x8002e78번지는 저 text 섹션에 속해있는데, text 섹션엔 실행 코드가 저장되는 것으로 알고 있는데,  왜 실행 코드가 아닌 0x20000020이 저장되는 것인지 궁금합니다..

답변 부탁 드립니다. 감사합니다.

운영체제 FreeRTOS 임베디드

답변 2

0

홍영기

김상현님!

1. 그렇다면 stm32f1xx의 경우 파이프라인이 Fetch(PC가 가리키는 위치) -> Decode -> Execute라 Thumb 모드의 경우 2 + 2 = 4만큼, ARM 모드의 경우엔 4+4 = 8만큼 차이가 생기는 건가요?

(ANS) 정확합니다:)

2. ticket 변수가 저장되어 있는 위치가 0x20000020 번지인 것은 알겠는데, 이것이 왜 text 섹션에 저장되는지 모르겠습니다.

(ANS) ARM 과 같은 RISC 프로세서들은 메모리 접근을 할 때 상대주소(pc relative address) 을 즐겨 사용합니다.

ROM(.text)                                              --------> RAM(.data)

0x20000020                                                         ticket변수

(ticket 변수의 주소를 저장하고 있슴)

0

김상현

감사합니다. 많은 도움이 되었어요!

0

홍영기

김상현님! 반갑습니다.^^

(ANS) 이 상황을 이해하기 위해서는 ARM의 파이프라인에 기인한 PC 레지스터의 동작 특성과 ldr 명령에 대한 이해가 필수인데요. 천천히 설명드려보겠습니다.

첫째, ARM의 파이프라인은 자세히 설명하자면 글이 너무 장황해지기 때문에 효율적인 방법을 알려드릴게요. 구글 검색 'ARM의 파이프라인 PC'  키워드로 찾아보시면 됩니다.

둘째, 적어주신 글과 그림으로 보면 ticket 변수는 말씀하신 것처럼 램주소 0x20000020 번지에 저장되어 있는 것이 맞습니다.

ldr r3, [pc, #20] @ r3= [ 0x08002e60 + 0x14 + 4(파이프라인 동작 특성) ] = 0x20000020

ldr r3, [r3, #0] @ r3=[r3+0] = [ 0x20000020 ] = 결국 ticket 변수의 값이 r3에 로드되죠.

단위 명령어 당 2바이트의 크기를 갖는 THUMB 명령어가 사용되고 있다는 점, 그리고 파이프라인의 특성 때문에  메모리 접근 주소 계산시 정수 값 ('4') 가 계산 결과에 같이 반영된다는 점 다시 한번 강조해 드립니다.

제 설명 중 이해가 안가는 점이 있거나, 추가적인 질문이 있으면 다시 질문주세요. 감사합니다.~~

0

김상현

알려주신 키워드로 공부해보았습니다. 감사합니다.

1. 그렇다면 stm32f1xx의 경우 파이프라인이 Fetch(PC가 가리키는 위치) -> Decode -> Execute라 Thumb 모드의 경우 2 + 2 = 4만큼, ARM 모드의 경우엔 4+4 = 8만큼 차이가 생기는 건가요?

2. ticket 변수가 저장되어 있는 위치가 0x20000020 번지인 것은 알겠는데, 이것이 왜 text 섹션에 저장되는지 모르겠습니다.

만약에 포팅을 할때 1년에 한번 잡는 치명적인 문제를 해결하는 코드가 들어갔다고 가정하면

0

83

2

STM32 포팅할 때 STM32 Project가 없음

0

213

2

FreeRTOS 멀티코어 지원안됨?

0

114

2

[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화

0

104

2

포팅 부탁드립니다!

0

68

1

포팅 부탁드립니다. <NUCLEO-G071RB>

0

76

2

상호배제 후 되지를 않아서 질문드립니다.

0

72

1

수료증 발급 기준 수정 요청

1

86

1

재진입가능여부에 관한 질문

1

81

1

01_TASKMAN프로젝트 디버깅 모드 실패

1

95

2

그러면 malloc/free가 아닌 동적할당자를 써서 메모리를 할당했기떄문에

1

78

2

실행순서

1

84

2

uart 전송중에는 스위칭이 금지되나요?

1

83

2

스택오버플로우 실습 중 stack size 설정 질문

0

90

2

포팅 원합니다.

2

83

2

코루틴 실습질문

1

111

2

TODO 2번 문제

1

148

4

10. 선점형 커널 그림 설명중 우선순위가 반대인 경우에도 Task B가 먼저 수행되나요?

1

94

2

디버거모드에 진입이 안됩니다.

0

188

2

prvExampleTaskHook 함수 호출 부분에 대해 문의드립니다.

0

131

2

보드 STM32H735IG와 강의 호환 여부 문의

1

161

3

[ L152RE ] 원샷 소프트타이머 실행 잘 되시나요?

1

168

2

Deferred Interrupt Processing 샘플 예제 문의 드립니다.

1

123

2

포팅 서비스 부탁드립니다

1

131

2