如何找到将我的LED控制台变成“矩阵”的代码错误

时间:2019-03-30 00:48:24

标签: c linux multithreading console ubuntu-16.04

我正在做一些大学上的工作,我设法更改了代码并正确地完成了任务,但是控制台出了错并且表现奇怪。

由于我没有10个声望,因此可以在此处找到图片 https://imgur.com/a/X7a6bpa

您具有Linux Ubuntu LED控制台,可以切换白灯和红灯,以及增加或减少它们在最大和最小量之间闪烁的速度。 他们的任务是让控制台写出led的当前状态及其闪烁的延迟时间。 现在我做了,但是由于干扰,错误的信号量使用或某些代码错误,控制台开始在其不同部分出现随机数。我已经搜索过,找不到任何原因。我也不确定我在看什么,所以答案可能已经存在。

这正在运行Ubuntu 16.04.6 Xebian,这是uni所需的。它包括线程和信号量。我尝试更改信号灯和代码,但是没有用。我对线程和信号量也很陌生,因此它们可能完全放在错误的位置。

我添加了尽可能少的代码。我写的是* 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;
}

`

0 个答案:

没有答案