Как найти ошибку кода, которая превращает мою светодиодную консоль в «матрицу» - PullRequest
0 голосов
/ 30 марта 2019

Я выполняю некоторые университетские задачи, и мне удалось изменить код и правильно выполнить задачу, но консоль выдает ошибку и ведет себя странно.

Изображение можно найти здесь, так как у меня еще нет 10 репутации https://imgur.com/a/X7a6bpa

У вас есть консоль Linux Ubuntu LED, и вы можете переключать белый и красный свет, а также увеличивать или уменьшать скорость, с которой они мигают, от максимального до минимального значения. Задача состояла в том, чтобы консоль записывала текущее состояние светодиодов и задержку, с которой они мигают. Теперь я сделал это, но из-за помех, неправильного использования семафора или некоторых кодовых ошибок консоль начинает появляться в разных ее частях. Я искал и не мог найти причину для этого. Я также не уверен, что на самом деле смотрю, так что ответ может уже существовать.

Это работает под управлением Ubuntu 16.04.6 Xebian, поскольку этого требует универ. Включает в себя темы и семафоры. Я попытался изменить семафоры и код, но это не сработало. Я также довольно плохо знаком с потоками и семафорами, поэтому они могут быть совершенно не в тех местах.

Я добавил как можно меньше кода. Я написал следующее: функцию * led_info_thr и создание в main, семафор в * led_toggle_thr.

static bool flashing[2] = {false, false};
static int  flashing_delay[2] = {FLASH_INITIAL_DELAY, FLASH_INITIAL_DELAY};

static sem_t mutex;

void *led_toggle_thr(void *arg);
void *keyboard_thr(void *arg);
void *led_info_thr(void *arg);
void inc_delay(int i);
void dec_delay(int i);

int main (void) {
pthread_t thread[4];
int rc;
unsigned long i;
sem_init(&mutex,0 ,1);

console_init();

for (i = 0; i < 3; i += 1) {
    rc = pthread_create(&thread[i], NULL, led_toggle_thr, (void *)i);
    assert(rc == 0);
}
rc = pthread_create(&thread[2], NULL, keyboard_thr, NULL);
assert(rc == 0);
rc = pthread_create(&thread[3], NULL, led_info_thr, NULL);
assert(rc == 0);    
while (true) {
    /* skip */
}
exit(0);
}

void *led_toggle_thr(void *arg) {
unsigned long id = (long)arg;
while (true) {
    if (flashing[id]) {F
    sem_wait(&mutex);
        led_toggle((leds_t)id);
    sem_post(&mutex);
    }
    usleep(flashing_delay[id]);
}
}

void *led_info_thr(void *arg) {
char flashing_str[2]={'N','N'};
while(true)
{
for(int i = 0; i < 2; i++)
{
    if(flashing[i] == true) flashing_str[i] = 'Y';
    else flashing_str[i] = 'N';
            sem_wait(&mutex);
    lcd_write_at(i, 0, "LED%d F:%c D:%d", i, flashing_str[i], flashing_delay[i]);
    sem_post(&mutex);
}
}
return NULL;
}

`

...