인프런 커뮤니티 질문&답변

현정호님의 프로필 이미지

작성한 질문수

ARM Cortex-M 프로세서 프로그래밍

s702에 원자적 Access 를 위한 BSRR 코드작성 부분에 대해서

24.02.11 18:26 작성

·

131

1

LED 점등을 위해

 

if 문 작성을 한 부분에 문의사항이 있습니다.

 

if 문 조건을 보면 ODR 레지스터의 값을 조회하고서

 

BSRR 레지스터에 값을 입력하는 것으로 LED 점등을 하는데요 (GPIOG_13번)

 

BSRR 레지스터에 값을 기록하면

 

ODR 레지스터에 값을 기록할 때와 다르게 바로 값만 입력하게 되어서

 

코드 블럭이 생기지 않는다고 하였는데

 

작성한 코드 전체에서 BSRR 에 값을 Write 하도록 작성되어있지만

 

if문 조건에서는 ODR 레지스터의 값을 Read 하는 동작이 섞여있어서

 

여전히 ODR 레지스터를 Read 하는 과정이 도중 중지되지 않을까 합니다??

 

그런일이 안발생되는 BSRR 레지스터 Write 동작이 독립적/개별적으로 이루어진다고

 

말씀하신다면

 

확신할 수 있게 Disassembly를 통해 직접 확인하는 것을 영상추가해주실 순 없나요?

 

관련내용 사진 첨부드립니다.

 

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2024. 02. 13. 18:32

안녕하세요, 인프런 AI 인턴입니다. 현정호님, 질문하신 ARM Cortex-M 프로세서 프로그래밍에 대해 답변 드립니다.

GPIOG의 ODR 레지스터 값을 읽는 것은 if 문 조건을 검사하기 위해 필요한 과정입니다. 여기서 읽기 작업은 원자적(atomic)으로 이루어지지 않아 중간에 다른 연산에 의해 방해받을 여지가 있어 보입니다. 반면에 BSRR 레지스터에 값을 기록하는 것은 원자적으로 작동합니다. 즉, 다른 연산이 개입할 수 없어 원자성을 보장하여 해당 핀의 상태를 한번에 바꿀 수 있습니다.

확신을 얻기 위해 실제로 디스어셈블리(Disassembly)를 통해 확인하는 과정이 필요하다고 말씀하셨는데, 코드의 원자적인 작동을 보장받기 위해서는 해당 마이크로컨트롤러의 하드웨어 매뉴얼이나 데이터시트에서 제공하는 정보를 바탕으로 이해하는 것이 좋습니다. 또한 강의 제작자가 영상에서 디스어셈블리 과정을 추가로 설명해주시는 것도 도움이 될 것 같습니다만, 제가 직접 영상을 추가하거나 변경할 수 있는 권한은 없습니다.

아래 URL을 참고하셔서 문제에 대한 추가 설명이나 도움을 요청해 보시는 것이 좋을 것 같습니다.

This image shows a portion of a computer screen displaying a code editor with embedded C code. The code relates to embedded systems programming, specifically for controlling a GPIO (General Purpose Input/Output) pin that appears to be associated with an LED.There is a comment written in Korean within the code, highlighted with a red box, which translates to “Is this part correct?” This comment indicates that the person who wrote or is reviewing the code is unsure about the correctness of the particular line of code.The code snippet includes operations for setting and clearing bits in a register. GPIO toggling such as this is common in microcontroller programming to control hardware, like turning an LED on or off.Specifically, the questionable code (`*rGPIOG_ODR & (1<<13)`) is checking the status of the 13th bit of the GPIOG Output Data Register (ODR), likely to determine whether the LED connected to that pin is on or off. If the condition is true, it performs one operation; otherwise, it performs another operation, effectively toggling the LED state.

영상 추가나 자세한 내용은 강의 페이지의 질문하기나 아래의 링크를 통해 문의하실 수 있습니다.
- 인프런 문의하기

제 답변이 도움이 되었기를 바랍니다. 현정호님의 프로그래밍 공부에 더 많은 성과가 있기를 기원합니다!

홍영기님의 프로필 이미지
홍영기
지식공유자

2024. 02. 13. 19:11

안녕하세요. 현정호님!

BSRR 은 아래 그림에서 확인하실 수 있는 것처럼 쓰기 전용 레지스터입니다.

이 때문에 토글(toggle) 동작을 위하여 ODR 레지스터 값의 확인은 코드에서와 같이 꼭 필요합니다.

image

영상 S703, S704, S705 에서 이와 관련 내용을 참고해보시기 바랍니다.