특정 프로세스가 실행되는 동안, 즉 타이머가 비 차단 방식으로 실행되는 동안 특정 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 함수에 대한 호출입니다. 시스템 전체의 여러 지점에서 사용되며 결코 문제가되지 않았습니다.
누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.
그러나 문제의 위치를 결정할 수있는 코드를 실제로 충분히 게시하지는 않았지만 언급 할 가치가 있다고 생각했습니다.
일반적인 문제는 여러분이 가지고있는 샘플 코드가 개방 루프 wrt 스레드 생성이라는 것입니다. 즉, 스로틀을 조정할 것이 없으며 구현에서 특히 스레드 종료 처리 속도가 느리면 아직 죽지 않은 많은 좀비 스레드가있을 수 있습니다.
일반적인 임베디드 / 실시간 시스템에서는 리소스 할당을 결정적이지 않기 때문에 기본 루프 밖으로 리소스 할당을 이동하려고합니다 . 따라서 더 자주 타이머 스레드를 만들고 필요할 때까지 주차 하십시오.
void *TimerThread(void *arg) {
while (sem_wait(&request) == 0) {
msp432e4_timer(void *arg);
}
return 0
}
void TimerStart(void) {
sem_post(&request);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다