#define STATE_R 1
时间: 2024-06-20 12:00:35 浏览: 11
在编程中,`#define` 是预处理器指令,用于宏定义。当你看到 `#define STATE_R 1` 这样的语句,它是在告诉编译器将 `STATE_R` 替换为整数值 `1`。这是一种简单的方式来创建常量,通常用于定义状态或枚举值。例如,在状态机的设计中,`STATE_R` 可能代表“运行”(Running)状态的一种标识。
相关问题
其中endstops.event_handler()函数部分代码如下对其进行解释说明void Endstops::event_handler() { static endstop_mask_t prev_hit_state; // = 0 if (hit_state == prev_hit_state) return; prev_hit_state = hit_state; if (hit_state) { #if HAS_STATUS_MESSAGE char NUM_AXIS_LIST(chrX = ' ', chrY = ' ', chrZ = ' ', chrI = ' ', chrJ = ' ', chrK = ' ', chrU = ' ', chrV = ' ', chrW = ' '), chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else #define _SET_STOP_CHAR(A,C) NOOP #endif #define _ENDSTOP_HIT_ECHO(A,C) do{ \ SERIAL_ECHOPGM(" " STRINGIFY(A) ":", planner.triggered_position_mm(_AXIS(A))); _SET_STOP_CHAR(A,C); }while(0) #define _ENDSTOP_HIT_TEST(A,C) \ if (TERN0(HAS_##A##_MIN, TEST(hit_state, A##_MIN)) || TERN0(HAS_##A##_MAX, TEST(hit_state, A##_MAX))) \ _ENDSTOP_HIT_ECHO(A,C)
这段代码是 Marlin 2.1.1 中 Endstops 类的 event_handler() 函数的一部分。该函数的作用是处理机械开关的事件,即检测是否有机械开关触发。
以下是对该函数的具体解释:
1. static endstop_mask_t prev_hit_state; // = 0:声明一个静态变量 prev_hit_state,用来记录上一次机械开关的状态,初值为 0。
2. if (hit_state == prev_hit_state) return;:如果当前机械开关状态与上一次相同,直接返回,不做处理。
3. prev_hit_state = hit_state;:将当前机械开关状态记录到 prev_hit_state 变量中,以备下次调用时使用。
4. #if HAS_STATUS_MESSAGE ... #endif:如果启用了状态消息功能,就定义一些字符变量。
5. #define _SET_STOP_CHAR(A,C) (chr## A = C):定义一个宏,用来设置机械开关触发时对应字符的值。
6. #define _ENDSTOP_HIT_ECHO(A,C) do{ ... }while(0):定义一个宏,用来输出机械开关触发的信息。
7. #define _ENDSTOP_HIT_TEST(A,C) ...:定义一个宏,用来测试机械开关是否触发。
8. _ENDSTOP_HIT_TEST(A,C):如果机械开关触发,就调用 _ENDSTOP_HIT_ECHO 宏输出信息,并设置对应字符的值。
这段代码的主要作用是检测机械开关是否触发,并输出相关信息。如果启用了状态消息功能,还会在 LCD 显示器上显示对应字符。这样可以让用户及时了解 3D 打印机的运行状态,从而进行调试和故障排除。
#include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> //下一步时间间隔 #define TIME_NEXT 50 //定义信号,此处直接使用系统信号,项目中可根据需要自定义信号值#define SIG_UI_QUIT35 #define SIG_PHONE_QUIT 36 #define SIG_UI_QUIT 35 //定义通话状态 enum TASK_PHONE_STATE { TASK_PHONE_STATE_NONE = 0, TASK_PHONE_STATE_RING, TASK_PHONE_STATE_TALK, TASK_PHONE_STATE_HANGUP, }; int phone_state = TASK_PHONE_STATE_NONE; //设置通话状态 void set_state(int state) { phone_state = state; } //获取通话状态 int get_state(void) { return phone_state; } int get_ui_pid() { int pid = -1; FILE *fp = NULL; char buf[12] = {0}; //打开管道,执行 shell 命令查找进程名为task_ui_sig 的pid fp = popen("ps -e I grep \'task_ui_sig\' | awk \'{print $1}\'", "r"); fgets(buf, sizeof(buf), fp); if (strlen(buf) > 0) { pid = atoi(buf); } return pid; } //信号处理函数 void sig_deal(int sig) { if (sig == SIG_UI_QUIT) { printf("Task ui hangup!\n"); set_state(TASK_PHONE_STATE_HANGUP); } } int main(void) { int time = 0; //设置SIG UI QUIT信号处理函数 signal(SIG_UI_QUIT, sig_deal); while (1) { /*模拟与其他用户处理通信协议,每隔5s进入下一状态*/ time++; if (time >= TIME_NEXT) { time = 0; if (get_state() == TASK_PHONE_STATE_RING) { set_state(TASK_PHONE_STATE_TALK); } else if (get_state() == TASK_PHONE_STATE_TALK) { set_state(TASK_PHONE_STATE_HANGUP); } else { set_state(TASK_PHONE_STATE_RING); } printf("Current state is %d!\n", get_state()); /*若当前通话状态为挂断,则退出任务,并发送信号给UI*/ if (get_state() == TASK_PHONE_STATE_HANGUP) { if (get_ui_pid() > 0) { kill(get_ui_pid(), SIG_UI_QUIT); printf("Send quit msg!\n"); } break; } usleep(100 * 1000); } return 0; } }这段代码有什么bug
这段代码存在一个逻辑错误,导致程序无法正常退出。具体来说,在while循环中,当通话状态为挂断时,会调用kill函数发送SIG_UI_QUIT信号给UI进程,然后退出循环。但是,由于kill函数是异步的,它发送信号的时刻是不确定的。因此,如果kill函数在循环结束之后才执行,就会导致UI进程收不到信号,从而无法正常退出。为了解决这个问题,可以在发送信号之后添加一个sleep函数,让程序等待一段时间,确保信号被UI进程接收到。修改后的代码如下:
```c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#define TIME_NEXT 50
#define SIG_UI_QUIT 35
#define SIG_PHONE_QUIT 36
enum TASK_PHONE_STATE {
TASK_PHONE_STATE_NONE = 0,
TASK_PHONE_STATE_RING,
TASK_PHONE_STATE_TALK,
TASK_PHONE_STATE_HANGUP,
};
int phone_state = TASK_PHONE_STATE_NONE;
void set_state(int state) {
phone_state = state;
}
int get_state(void) {
return phone_state;
}
int get_ui_pid() {
int pid = -1;
FILE *fp = NULL;
char buf[12] = {0};
fp = popen("ps -e I grep \'task_ui_sig\' | awk \'{print $1}\'", "r");
fgets(buf, sizeof(buf), fp);
if (strlen(buf) > 0) {
pid = atoi(buf);
}
return pid;
}
void sig_deal(int sig) {
if (sig == SIG_UI_QUIT) {
printf("Task ui hangup!\n");
set_state(TASK_PHONE_STATE_HANGUP);
}
}
int main(void) {
int time = 0;
signal(SIG_UI_QUIT, sig_deal);
while (1) {
time++;
if (time >= TIME_NEXT) {
time = 0;
if (get_state() == TASK_PHONE_STATE_RING) {
set_state(TASK_PHONE_STATE_TALK);
} else if (get_state() == TASK_PHONE_STATE_TALK) {
set_state(TASK_PHONE_STATE_HANGUP);
} else {
set_state(TASK_PHONE_STATE_RING);
}
printf("Current state is %d!\n", get_state());
if (get_state() == TASK_PHONE_STATE_HANGUP) {
int ui_pid = get_ui_pid();
if (ui_pid > 0) {
kill(ui_pid, SIG_UI_QUIT);
printf("Send quit msg!\n");
sleep(1); // 等待信号被接收
}
break;
}
}
usleep(100 * 1000);
}
return 0;
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)