C Pthread屏障和树莓pi
我正在为学校做一个作业,作业的目标是使用Pthread屏障,使覆盆子pi上的指示灯从不亮逐渐变亮,反之亦然。我是C的初学者,我想我理解pthread sna dn pthread的概念 以下是我编写的代码,它应该使raspPI中的LED从未点亮变为点亮: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>
// 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) ;