Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Pthread屏障和树莓pi_C_Multithreading_Raspberry Pi_Pthreads_Pthread Barriers - Fatal编程技术网

C Pthread屏障和树莓pi

C Pthread屏障和树莓pi,c,multithreading,raspberry-pi,pthreads,pthread-barriers,C,Multithreading,Raspberry Pi,Pthreads,Pthread Barriers,我正在为学校做一个作业,作业的目标是使用Pthread屏障,使覆盆子pi上的指示灯从不亮逐渐变亮,反之亦然。我是C的初学者,我想我理解pthread sna dn pthread的概念 以下是我编写的代码,它应该使raspPI中的LED从未点亮变为点亮: // Setup wiringPi #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h>

我正在为学校做一个作业,作业的目标是使用Pthread屏障,使覆盆子pi上的指示灯从不亮逐渐变亮,反之亦然。我是C的初学者,我想我理解pthread sna dn pthread的概念

以下是我编写的代码,它应该使raspPI中的LED从未点亮变为点亮:

// Setup wiringPi
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

// define led output PINS
#define LED1 7
#define LED2 0
#define LED3 2
#define LED4 3

pthread_barrier_t* mythread;

void ledInit(void){
    // Initialize pin for PMW output
    softPwmCreate(LED1, 0, 100);
    softPwmCreate(LED2, 0, 100);
    softPwmCreate(LED3, 0, 100);
    softPwmCreate(LED4, 0, 100);
}

// a thread that slowly fades LEDs from unlit to lit. 
void* unlitToLit(void){
    ledInit();
    softPwmWrite(LED1, 50);
    softPwmWrite(LED2, 50);
    softPwmWrite(LED3, 50);
    softPwmWrite(LED4, 50);
}

void main(void){
    wiringPiSetup();
    //set LED1 pin to output
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);

    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);

    pthread_barrier_init(&mythread, NULL, unlitToLit);

    if (pthread_create(&mythread, NULL, unlitToLit, )) {
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }

    printf("threads finished");
    return 0;

      // used for synchronization
      // pthread_barrier_wait(&mythread);
}
mythread
变量定义为指针,因此在此处传递指针的内存地址。您应该如下定义
mythread
变量:

pthread_barrier_t mythread;
另外,使用屏障(以及IMHO分配)的目的是同步线程,以便它们从稳定的共享状态继续执行。在您的情况下,所有的LED都会亮起或不亮起。您需要添加
pthread\u barrier\u wait
来同步它们

这方面还有另一个问题:

pthread_barrier_init(&mythread, NULL, unlitToLit);

因为第三个参数是
count
,它用于指定有多少线程应该调用
pthread\u barrier\u wait
以解锁屏障。在调用中,您传递了一个错误的函数地址。

通过阅读您正在使用的库()的文档,我可以看出您需要包括:

#include <softPwm.h>
这将更新给定引脚上的PWM值。该值被检查为在范围内,之前未通过softPwmCreate初始化的管脚将被自动忽略。我看不出您已将引脚初始化为PWM引脚


如果你真的想让LED变暗,你还需要改变脉冲宽度。。。软pwmwrite(LED1,50);将脉冲宽度设置为50%,使LED“半”亮起。您需要反复将PWM从0更改为100,反之亦然……

如果您确实希望LED褪色,则需要更改脉冲宽度。。。软pwmwrite(LED1,50);将脉冲宽度设置为50%,使LED“半”亮起。您需要反复将PWM从0更改为100,反之亦然……“但它不工作”什么不工作?问题出在哪里?谢谢,我能想到的方法是做一个循环,将每个led的值从低到高或反之亦然!!,然而,我仍然收到许多警告,我不能编译te代码!我是否需要使用“#define THREAD_COUNT 2”或类似的东西定义线程数,然后将其传递给我的pthread_barrier_init?
pthread_barrier_init(&mythread, NULL, unlitToLit);
#include <softPwm.h>
void softPwmWrite (int pin, int value) ;