Tug*_*ida 5 freertos esp32 esp-idf
我正在用 ESP32 制作一盏灯,我选择的 HomeKit 库使用我不熟悉的 FreeRTOS 和 esp-idf。
目前,我有一个函数,每当需要更改灯光颜色时就会调用该函数,这只会一步步更改它。我想让它在颜色之间淡入淡出,这需要一个运行一两秒的函数。将此块作为程序的主要执行显然会使其非常无响应,因此我需要将其作为任务运行。
我面临的问题是,我只想一次运行一个淡入淡出函数的副本,如果在完成之前第二次调用它,则第一个副本应该在之前退出(无需等待完整的淡入淡出时间)开始第二个副本。
我发现vTaskDelete
,但如果我在任意点终止淡入淡出功能,一些变量和 LED 本身将处于未知状态。为了解决这个问题,我想到使用“kill flag”全局变量,淡入淡出函数将检查其每个循环。
这是我正在考虑的伪代码:
update_light {
kill_flag = true
wait_for_fade_to_die
xTaskCreate fade
}
fade {
kill_flag = false
loop_1000_times {
(fading code involving local and global variables)
.
.
if kill_flag, vTaskDelete(NULL)
vTaskDelay(2 / portTICK_RATE_MS)
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是:
wait_for_fade_to_die
?我没有通过简短的浏览找到任何东西,但我是 FreeRTOS 的新手。很抱歉,我的印象是您在尝试解决具体问题时几乎走错了路。\n您写道您不熟悉 FreeRTOS 和 esp-idf,所以我建议您首先熟悉 freeRTOS(或一般 RTOS 的概念或任何其他 RTOS,将这些知识转移到 freeRTOS,...)。
\n\n这样做时,您会注意到(除了一些特定示例之外)任务与为单个作业的顺序“批”处理而编写的函数完全不同。
\n\n通常,在嵌入式系统中设计良好的 RTOS 任务时要考虑的最有用的模型是状态机模型,该状态机接收对其做出反应的事件,可能会更改其状态和/或执行一些其起始点和有效负载取决于的操作状态机接收到的事件以及检测到事件时所处的状态。\n当没有事件时,任务不应空闲,而是阻塞在 RTOS 函数创建的某个屏障处,该屏障应该传递下一个事件相关事件。
\n\n实现这样的任务意味着编写一个任务函数,该函数由一个简短的初始化块和一个无限循环组成,该无限循环首先调用 RTOS 库以获取下一个逻辑事件(见下文...),然后调用处理该逻辑事件的代码。\n现在,逻辑事件不必由 RTOS 事件表示(虽然这可能发生在简单的情况下),但也可以通过 RTOS 队列、邮箱或其他来实现。\n在这样的设计模式中,基于 RTOS 的软件的任务“永远”存在,等待下一个作业执行。
\n\n您必须检查如何将编程问题分解为不同的任务。
\n\n\n\n\n目前,我有一个函数,每当需要更改灯光的颜色时就会调用该函数,这只会一步步更改它。我想让它在颜色之间淡入淡出,这需要一个运行一两秒的函数。将此块作为程序的主要执行显然会使其非常无响应,因此我需要将其作为任务运行。
\n
我希望我正确理解了您的应用程序的目标:\n系统正在驱动不同颜色的多个光源,并且某些“请求源”正在选择要显示的下一个颜色。\n当请求不同的颜色时,应进行更改不会立即执行,但在一段时间内会出现一些“淡入淡出”。\n即使发生淡入淡出,系统(及其请求源)也应保持响应,可能会改变中间淡入淡出的方向。
\n\n我想你没有说颜色请求来自哪里。\n因此,我猜测这个请求源可能是某个按钮、串行接口或运行在中的复杂算法(或随机数生成器?)背景。现在真的不重要了。
\n\n\n\n\n我面临的问题是,我只想一次运行一个淡入淡出函数的副本,如果在完成之前第二次调用它,则第一个副本应该退出(无需等待开始第二个副本之前的完整淡入淡出时间)。
\n
您本质上要寻找的是如何随时更改状态(此处:光褪色的目标颜色),以便旧的、正在进行的褪色过程变得过时,但输出(=光)行为不会以不连续的方式改变。
\n\n我建议您设置以下任务:
\n\n一项(或多项)任务用于生成颜色更改请求......无论您在这里需要什么。
一项任务用于评估当前应输出哪种颜色混合。\n该任务应准备好接收
\n\n零个、一个或多个任务通过驱动系统的输出功能来实现颜色混合值(例如,配置 GPIO 或 PWM,或通过串行连接传输信息...我们不知道)。\n如果调整输出部分只是分配一些寄存器,“零”在这里适合您。否则,尝试“一个或多个”。
\n\n\n我找到了 vTaskDelete,但如果我在任意点终止淡入淡出功能,某些变量和 LED 本身将处于未知状态。为了解决这个问题,我想到使用“kill flag”全局变量,淡入淡出函数将检查其每个循环。
\n
只是不要这样做。\n终止一项任务,即使是一个没有准备从内部终止的任务,也会导致您的软件提出后续管理和清理输出内容的要求,您最终会想知道为什么你开始使用 RTOS。
\n\n我确实知道,在您从未这样做过的情况下开始以这种方式进行设计和编程是一项巨大的努力,就像跳入冷水一样。\n请相信我,这样您将学习如何设计和实现出色的嵌入式系统的基础知识.\n专业教育公司提供有关 RTOS 集成、响应式编程和状态机设计的课程,价格高达数千美元/\xe2\x82\xac/\xc2\xa3,这是此类工作知识的良好指标。
\n\n祝你好运!\n在此过程中,您会遇到很多详细问题,欢迎您将这些问题发布到此板上(或查找早期答案)。
\n 归档时间: |
|
查看次数: |
5736 次 |
最近记录: |