我想监控一个特定的GPIO引脚,它有一个按钮连接到它,并取决于按钮被按下的次数,它将打开一些LED灯,使他们眨眼或关闭他们。
#include <stdio.h>
#include <pigpio.h>
#include <stdlib.h>
#include <unistd.h>
#define LED_1 13
#define LED_2 19
#define BUTTON 25
#define ON 1
#define OFF 0
#define DELAY 1
void initalise_pins();
void clear_all();
void start_button();
void turn_on_lights();
void increment_state(int gpio, int level, uint32_t tick);
int current_state = 0; /*Don't have a better way of breaking out of loop during pulse so using global var*/
int main(){
if (gpioInitialise() < 0){
printf("Error initializing pigpio library, exiting");
}
else{
initalise_pins();
clear_all();
start_button();
}
}
int main(){
initalise_pins();
clear_all();
start_button();
}
void initalise_pins(){
gpioSetMode(LED_1, PI_OUTPUT); /*Set LED at pin 13 to output*/
gpioSetMode(LED_2, PI_OUTPUT); /*Set LED at pin 19 to output*/
gpioSetMode(BUTTON, PI_INPUT); /*Set Button at pin 25 to input*/
gpioSetPullUpDown(BUTTON, PI_PUD_DOWN); /*Set Button at pin 25 to pulldown*/
gpioSetAlertFunc(BUTTON, increment_state); /*Function to watch for GPIO state change*/
}
void clear_all(){
gpioWrite(LED_1, OFF); /*Resets LED_1 to off*/
gpioWrite(LED_2, OFF); /*Resets LED_2 to off*/
}
void turn_on_lights(){
gpioWrite(LED_1, ON);
gpioWrite(LED_2, ON);
}
void increment_state(int gpio, int level, uint32_t tick){
if (level == 1){
current_state += 1;
}
}
void start_button(){
for (;;){ /*Loop to keep reading button value*/
if (current_state == 0){ /*Current state off*/
continue;
}
else if (current_state == 1){ /*Current state on*/
turn_on_lights();
}
else if (current_state == 2){ /*Current state blinking*/
clear_all();
sleep(DELAY);
turn_on_lights();
sleep(DELAY);
}
else{ /*Reset state to off*/
clear_all();
current_state = 0;
}
sleep(0.1);
}
}代码按预期工作,但是否有适当的方法来设置current_state的值,而不是将其作为全局变量?这个解决方案的主要问题是,当我将它编译为Python中使用的库时,这个函数就会中断。
发布于 2021-11-09 10:00:26
据我所知,有三种方法可以存储“超出其范围”的数据。
一个全局变量--如您所知,这个变量在所有调用中都是共享的,即使在编译单元之外也可以引用。calls.
static变量--这种类型仅限于它定义的范围,从外部无法访问,但在传递给您的函数的所有
按照我对您的问题的理解,您不希望在调用的所有实例中共享变量的值,这会自动取消1和2的资格。
因此,您需要从外部将所需的信息传递到您的函数中。
虽然您可以将current_state_id传递到函数集“原样”,但这要求库的用户了解库的工作方式。
一个更好的解决方案是上下文结构,它隐藏了所需数据的内部,并使您可以灵活地从内部添加/删除数据,而不必担心更改API。
一个正常的方法应该是这样的:
struct _PIN_Ctrl; //Forward declaration of the (opaque) structure.
typedef struct _PIN_Ctrl *PIN_Ctrl;
PIN_Ctrl createPINCtrl(void);
//Any number of functions taking PINCtrl as context structure.
freePINCtrl(PIN_Ctrl ctrl);调用将类似地工作(现在使用C99符号):
if (PIN_Ctrl ctrl = createPINCtrl())
{
//doStuffWithYourContext
freePINCtrl(ctrl);
}createPINCtrl需要将您的结构初始化为malloc,并将其成员初始化为已定义的状态(即“currentState”到0)。在内部,您将自然地访问结构的成员,最后'freePINCtrl‘只是执行free(ctrl)来清理分配的内存。
https://stackoverflow.com/questions/69895907
复制相似问题