STM32CubeProgrammer는 자바기반이어서 프로그램이 무겁습니다.
그래서 렉이 잘 걸리면서 화면 클릭이 되지 않기도 하는데요.
이때, STM32CubeProgrammer를 강제종료하는 방법을 알아봅시다.
 
 

[단계 1] MCU ~ PC 연결 해제

MCU와 PC 연결을 해제 해줍니다.
저 같은 경우는 AtoA 케이블으로 PC와 MCU에 연결할 때 switch가 있었기 때문에
switch를 꺼서 연결해제를 했습니다.

 
 
switch ON이면 O
switch OFF이면 -
 

switch

 
[주의] MCU 전원이 들어온 상태에서
케이블 연결/해제 하면 안 됩니다.
(MCU회로에서 그라운드/ACC가 근처에 있으면 쇼트 발생할 수 있음)
 

[단계 2] 작업관리자에서 STM32CubeProgrammer 강제종료

이제 STM32CubeProgrammer를 종료합시다.
작업관리자를 엽니다. (Ctrl + Shift + ESC)
 

d

[우클릭 > 작업끝내기] 하면 프로세스가 강제 종료됩니다.
 
해결.

TeraTerm, Putty 와 같은 프로그램에서 

위 캡쳐 사진과 같이 broken characters, 깨진 문자가 보인다면...

 

그리고 임베디드 프로젝트를 하고 있다면,,

당신은 접지를 하지 않은 것입니다.

 

또는 UART 케이블을 다른 포트에 꼽았다가

다시 원래 포트에 꼽고 디바이스 업데이트를 해보세요.

 

끝.

 

작업 스케줄러 열기:

검색 바에서 '작업 스케줄러'를 입력하고 검색 결과에서 작업 스케줄러를 클릭합니다.

 

 

새 작업 만들기:

작업 스케줄러 라이브러리에서 오른쪽 상단의 '작업 만들기'를 클릭합니다.

 

 

작업 설정:

'일반' 탭에서 작업의 이름과 설명을 입력합니다.

'보안 옵션'에서 '최상의 권한으로 실행'을 선택합니다.

 

트리거 설정:

'트리거' 탭으로 이동하여 '새로 만들기'를 클릭합니다.

'시작 작업'에서 '로그온 시' 또는 '컴퓨터가 부팅될 때'를 선택합니다.

설정을 마친 후 '확인'을 클릭합니다.

 

 

 

동작 설정:

'동작' 탭으로 이동하여 '새로 만들기'를 클릭합니다.

'동작'에서 '프로그램 시작'을 선택합니다.

프로그램/스크립트' 입력란에 explorer를 입력합니다.

'인수 추가'에 열고 싶은 폴더의 경로를 입력합니다.

예를 들어, C:\Users\YourUsername\Documents 폴더를 열고 싶다면, 이 경로를 입력합니다.

 

 

작업 완료:

모든 설정을 마친 후 '확인'을 클릭하여 작업을 저장합니다.

 

 

 

Service와 Thread의 차이 및 사용 시점

1. Service

  • 정의: 안드로이드에서 백그라운드 작업을 수행하는 컴포넌트.
  • 특징:
    • 애플리케이션이 종료되더라도 백그라운드에서 실행될 수 있음.
    • 기본적으로 메인 스레드(UI 스레드)에서 실행됨.
    • 별도의 스레드를 생성하지 않음 → 따라서 무거운 작업(네트워크 요청, 파일 처리 등)을 수행하면 ANR (Application Not Responding) 오류 발생 가능.
    • startService() → 독립 실행 (종료 필요)
    • bindService() → 다른 컴포넌트와 바인딩하여 실행 (사용 중이면 유지됨)
  • 언제 사용하나?
    • 사용자가 직접 조작하지 않아도 실행되어야 하는 작업.
    • 예시:
      • 음악 재생 서비스
      • 백그라운드에서 데이터 동기화
      • GPS 기반 위치 서비스

 

2. Thread

  • 정의: 프로세스 내에서 실행되는 독립적인 작업 단위.
  • 특징:
    • 별도의 메인 스레드(UI 스레드)와는 독립적으로 실행됨.
    • 여러 개 생성 가능하여 다중 작업 병렬 실행 가능.
    • UI 업데이트는 불가능 (UI 변경이 필요하면 Handler, runOnUiThread(), LiveData 등을 사용해야 함).
  • 언제 사용하나?
    • CPU를 많이 사용하는 작업을 처리할 때.
    • 예시:
      • 네트워크 요청 (API 호출)
      • 데이터베이스 작업
      • 이미지 로딩 및 처리

 

Service vs Thread 요약 비교

실행 환경 메인 스레드에서 실행 별도의 백그라운드에서 실행
멀티태스킹 메인 스레드 점유 멀티태스킹 가능
실행 지속성 앱 종료 후에도 지속 가능 앱 종료 시 종료됨
UI 접근 가능하지만 무거운 작업 시 ANR 발생 가능 직접 접근 불가능 (Handler 필요)
주요 목적 장기간 실행되는 작업 짧고 집약적인 작업

 

 

언제 Service + Thread를 함께 사용할까?

  • 서비스 내에서 별도 스레드를 생성하여 백그라운드 작업을 수행하는 경우
    • 기본적으로 Service는 메인 스레드에서 실행되므로 네트워크 요청, 데이터베이스 쿼리 등 긴 작업이 필요할 경우 새로운 Thread를 생성하여 실행해야 한다.
    • 안드로이드에서는 IntentService(현재는 WorkManager가 권장됨)를 사용하여 자동으로 백그라운드 작업을 처리할 수도 있음.

 

예제 코드

1. 잘못된 서비스 사용 (ANR 발생 가능)

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 메인 스레드에서 실행되므로 ANR 발생 가능
        for (int i = 0; i < 1000000; i++) {
            Log.d("MyService", "Heavy task running: " + i);
        }
        return START_STICKY;
    }
}

 

 

해결 방법: 새로운 스레드 생성

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(() -> {
            for (int i = 0; i < 1000000; i++) {
                Log.d("MyService", "Heavy task running: " + i);
            }
        }).start();
        return START_STICKY;
    }
}

 

 

 

 

결론

  • 단순한 병렬 작업은 Thread 사용.
  • 백그라운드에서 장기간 실행되는 작업은 Service 사용.
  • Service 내에서 무거운 작업을 할 경우, 반드시 별도 Thread를 생성하여 실행해야 함.

+ Recent posts