Zephyr项目事件处理



我正在利用Zephyr项目处理项目的事件驱动部分。我是Zephyr的新手,所以如果我做错了这件事,我很抱歉。我的目标是有一个永远的线程负责确定是否发生了任何事件。在ESP-IDF中,我通过让任务处理程序监视中断来实现这一点,然后在事件组中设置每个单独的事件位,并不断地对这些事件标志进行主任务轮询。我想在Zephyr操作系统中做一些类似的事情,但我很难做到。我已经让线程运行并监视按钮按下,并将特定的GPIO设置为高,但我想过渡到使用k_event。例如,K_EVENT_DEFINE(event_flag);是我如何按照Zephyr的文档设置事件结构的。然后我使用:

static void detect_press_open(void *args)
{
gpio_pin_configure_dt(&led1, GPIO_OUTPUT);
gpio_pin_configure_dt(&button1, GPIO_INPUT);
while(1)
{
if (gpio_pin_get_dt(&button1) != 0)
{
printf("Button1 press open detectedn");
gpio_pin_set_dt(&led1, 1);
k_event_post(&event_flag, 1);
}
else{
gpio_pin_set_dt(&led1, 0);
}
k_msleep(1000);
//need to have thread yield
}
} 

这是我使用的一个示例功能,用于将按钮从打开led切换到实质上触发一个事件,然后由线程检查该事件,以轮询该事件并处理将GPIO设置为高的问题。当我试图在终端中构建它时,我得到了这个错误src/main.c:92: undefined reference to z_impl_k_event_post collect2: error: ld returned 1 exit status

试着把它总结起来,更加清晰。

  1. 关于如何在Zephyr操作系统中开发事件驱动系统,我希望有一个正确的方向。与中一样,我应该使用队列和信号量,还是坚持使用事件或使用轮询?

  2. 如果我要使用k_events,我将如何解决我遇到的错误?

  3. 我说得有道理吗?还是我需要重新安排我的问题?

我在使用k_event_post、k_event_wait和k_event_set时遇到了相同的编译器错误,发现这是由于未设置kconfig选项CONFIG_EVENTS=y造成的。希望这对未来的任何人都有帮助。

最新更新