여러 갈래 스레드를 만드는 적절한 방법

Byers1979 :

특정 프로세스가 실행되는 동안, 즉 타이머가 비 차단 방식으로 실행되는 동안 특정 GPIO 검사를 무시할 수있는 약간의 임베디드 코드에 대한 타이머 기능을 만들고 있습니다.

이것은 작업이 처음 11 번 발생하는 것처럼 보이지만 11 번 반복 할 때마다 시스템이 중단됩니다. 범인은 타이머 스레드를 처리하는 방법에 있습니다. 내 생각에 제대로 처리하지 않고 약간의 메모리 누수가 발생하여 메모리 누수가 발생합니다. 그러나 나는 확실하지 않다.

디버그 추적을 통해 스레드가 각 반복 후에 종료되고 있음을 알 수 있습니다.

타이머 코드는 다음과 같습니다.

#include <time.h>
#include <semaphore.h>
#include <pthread.h>

#include <msp432e4_timer.h>

extern void TaskSleep(uint32_t delay);

static bool timerActive;
static sem_t timerSem;

pthread_t timerThread;
pthread_attr_t attrs;
struct sched_param priParam;


static void *msp432e4_timer(void *argUnused) {
    sem_wait(&timerSem);
    timerActive = true;
    sem_post(&timerSem);

    TaskSleep(40);

    sem_wait(&timerSem);
    timerActive = false;
    sem_post(&timerSem);

    return (NULL);
}

void initTimer() {
    int retc;
    pthread_attr_init(&attrs);
    priParam.sched_priority = 1;
    retc = pthread_attr_setschedparam(&attrs, &priParam);
    retc |= pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
    retc |= pthread_attr_setstacksize(&attrs, 1024);
    if (retc != 0) {
        // failed to set attributes
        while (1) {}
    }

    timerActive = false;
    if((sem_init(&timerSem, 0, 0)) != 0) {
        while(1);
    }
    sem_post(&timerSem);
}

/*
 * return true on starting a new timer
 * false implies timer already active
 */
void timerStart() {
    int retc;
    retc = pthread_create(&timerThread, &attrs, msp432e4_timer, NULL);
    if (retc != 0) {
        // pthread_create() failed
        while (1) {}
    }
}

/* return true if timer active */
bool timerCheck() {
    bool retval;
    sem_wait(&timerSem);
    retval = timerActive;
    sem_post(&timerSem);
    return(retval);
}

TaskSleep 함수는 freeRTOS TaskDelay 함수에 대한 호출입니다. 시스템 전체의 여러 지점에서 사용되며 결코 문제가되지 않았습니다.

누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

mevets :

그러나 문제의 위치를 ​​결정할 수있는 코드를 실제로 충분히 게시하지는 않았지만 언급 할 가치가 있다고 생각했습니다.

일반적인 문제는 여러분이 가지고있는 샘플 코드가 개방 루프 wrt 스레드 생성이라는 것입니다. 즉, 스로틀을 조정할 것이 없으며 구현에서 특히 스레드 종료 처리 속도가 느리면 아직 죽지 않은 많은 좀비 스레드가있을 수 있습니다.

일반적인 임베디드 / 실시간 시스템에서는 리소스 할당을 결정적이지 않기 때문에 기본 루프 밖으로 리소스 할당을 이동하려고합니다 . 따라서 더 자주 타이머 스레드를 만들고 필요할 때까지 주차 하십시오.

void *TimerThread(void *arg) {
     while (sem_wait(&request) == 0) {
           msp432e4_timer(void *arg);
     }
     return 0
}
void TimerStart(void) {
     sem_post(&request);
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

UiWatcher ()의 적절한 Private 클래스를 만드는 방법

여러 스도쿠 퍼즐을 해결하기 위해 여러 해당 클래스가있는 여러 스레드를 동적으로 만드는 방법

Singleton 클래스에 대한 여러 인스턴스를 만드는 방법

적절한 클래스 구조를 만드는 방법은 무엇입니까?

Guava의 ImmutableSet를 하위 클래스로 만드는 적절한 방법

여러 적에 대한 스크립트를 만드는 방법

동일한 xaml 파일의 여러 부분 클래스를 만드는 방법

자체 클래스의 정적 인스턴스를 만드는 적절한 방법

벡터를 여러 스레드에 한 번만 삽입하는 방법

여러 파일 업로드를 위한 클래스 기반 보기를 만드는 방법

drawImage (g)로 스플래시 화면을 만드는 적절한 방법

libgdx에서 적절한 오토 그래픽 카메라를 만드는 방법

값을 한 번 읽고 여러 번 반환하는 Observable을 만드는 적절한 방법

SKnode를 하위 클래스로 분류하여 여러 개의 독립적 인 '레인'이있는 장면을 만드는 방법은 무엇입니까?

PHP를 사용하여 적절한 배열 형식을 만드는 방법

Powershell을 사용하여 적절한 do-while 루프를 만드는 방법

여러 VirtualBox 이미지를 갖는 적절한 방법

C ++에서 여러 클래스에 대한 별칭을 만드는 방법

KType에서 클래스 인스턴스를 만드는 적절한 방법은 무엇입니까?

JavaScript에서 onclick 클래스의 새 인스턴스를 만드는 적절한 방법은 무엇입니까?

여러 열의 데이터에 대한 그래프 (ggplot)를 만드는 방법

클래스를 사용하여 tkinter로 여러 개의 유사한 프레임을 만드는 방법은 무엇입니까?

스레드를 죽이는 적절한 방법

작업자 스레드를 종료하는 적절한 방법

인덱스를 만드는 적절한 방법입니까?

PHP에서 다른 클래스의 객체를 만드는 적절한 방법은 무엇입니까?

C++에서 (게임 캐릭터) 클래스의 여러 개체를 동적으로 만드는 방법

간단한 XML에서 여러 XML 레코드를 만드는 방법

여러 스레드에 대한 Thrift 클라이언트를 만드는 방법은 무엇입니까?

TOP 리스트

  1. 1

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  2. 2

    std :: regex의 일관성없는 동작

  3. 3

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  4. 4

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  5. 5

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  6. 6

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  7. 7

    Ionic 2 로더가 적시에 표시되지 않음

  8. 8

    Seaborn에서 축 제목 숨기기

  9. 9

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  10. 10

    복사 / 붙여 넣기 비활성화

  11. 11

    ArrayBufferLike의 typescript 정의의 깊은 의미

  12. 12

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  13. 13

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  14. 14

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  15. 15

    PRNG 기간보다 순열이 더 많은 목록을 무작위로 섞는 방법은 무엇입니까?

  16. 16

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  17. 17

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  18. 18

    잘못된 구성 개체입니다. Webpack이 Angular의 API 스키마와 일치하지 않는 구성 개체를 사용하여 초기화되었습니다.

  19. 19

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  20. 20

    R의 마침표와 숫자 사이에 문자열 삽입

  21. 21

    Assets의 BitmapFactory.decodeStream이 Android 7에서 null을 반환합니다.

뜨겁다태그

보관