Я создаю функцию таймера для небольшого фрагмента встроенного кода, который позволит мне обойти определенные проверки GPIO во время выполнения определенного процесса, т.е. когда таймер работает неблокирующим образом.
Похоже, что первые 11 операций выполняются нормально, но каждый раз на 11-й итерации система обнаруживает sh. Вероятная причина заключается в том, как обрабатывается поток таймера. Я предполагаю, что есть некоторая очистка памяти, с которой я не справляюсь должным образом, и это приводит к какой-то утечке памяти. Но я действительно не уверен.
Благодаря трассировке отладки я вижу, что поток завершается после каждой итерации.
Вот код таймера:
#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. Он используется во многих точках системы и никогда не был проблемой.
Надеюсь, кто-нибудь сможет указать мне правильное направление.