인터럽트 진짜 에바야

Hyun Ho An·2024년 1월 12일

현재 가장 문제되는 부분은 인터럽트 문제이다.
정지 버튼을 입력할 시에 인터럽트 신호를 줘도 함수 내에서 while문이 실행되고 있어 애초에 시리얼 통신을 받지 못한다.

따라서 내가 생각한 방법은 세가지이다.

  1. While문의 조건을 시리얼 통신으로 수정
while Serial_com.In_Out_Method.serial_in(0) != "Stop":
    try:

위와 같이 처음부터 조건을 수정하는 것인데, 이 방법도 내부에서 함수가 실행되고 있기 때문에 먹히지 않는다.

  1. 그러면 while문 내부에서 실행되고 있는 함수에 조건을 추가해서 실행해보자.

-> 솔직히 이 방법으로 하드 코딩하면 되긴 된다. 근데 메인에서 while문에 추가해야하는 인터럽트 신호가 3-4개 정도이고, 변수를 저장하고 종료하여야되기 때문에 그냥 break하면 변수도 저장하지 못한다....

  1. 스레드 생성

가장 가능성이 있지만, 아직까지 해결하지 못하였다. 말그대로 스레드를 생성하여서 해당 스레드는 시리얼 통신 값만 받는 것이다.

이렇게 코드를 작성하면 해결해야하는 문제가 두가지 있는데,
첫번째는 main함수에도 시리얼 통신을 받기 때문에 스레드와 동시에 받지 못해서 메인 함수에만 시리얼 통신이 실행된다.
두번째는 아래와 같이 인터럽트 신호를 강제로 실행시키면 시리얼 통신을 받는 스레드만 동작을 정지하게 된다....

# 종료를 관리하는 플래그
exit_flag = False

def work_interrupt():
    raise KeyboardInterrupt

# 백그라운드에서 동작하는 함수
def background_task():
    try:
        while not exit_flag:
            # 쓰레드에서 수행하는 동작
            if serial_in(0.01) == "Stop":
                work_interrupt()
            utime.sleep(1)  # 1초마다 대기
    except KeyboardInterrupt:
        pass  # KeyboardInterrupt가 발생하면 여기서 무시하고 계속 진행

# 백그라운드 스레드를 생성하고 시작
_thread.start_new_thread(background_task, ())

인터럽트 신호만 하루종일 구현하고 있으니 참 비참하다. 아마 계속해서 스레드를 사용하는 방식으로 진행할 것이나, 진행상황이 너무 뒤쳐지면 그냥 하드 코딩으로 조지겠다.

profile
한국해양대학교/인공지능공학부

0개의 댓글