- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我之前有编写基于事件和轮询的嵌入式系统的经验(适用于没有抢占式操作系统的微型 MCU)。
在基于事件的系统中,任务通常在队列上接收事件(消息)并依次处理它们。
在基于轮询的系统中,任务以一定的时间间隔轮询状态并响应变化。
你更喜欢哪种架构?两者可以共存吗?
更新:积分
基于轮询
- 与时序方面相关的紧密耦合(@Lundin)
* 可以使用队列与事件系统共存 (@embedded.kyle)
* 适用于较小的程序 (@Lundin)
基于事件
+ 从长远来看更灵活的系统 (@embedded.kyle)
- RTOS 版本增加了复杂性(@Lundin)
*小程序=状态机控制(@Lundin)
* 可以使用队列和“ super 循环”(内部 Controller /主)来实现(@embedded.kyle)
* 只有真正的“事件”是硬件中断(@Lundin)
相关问题
* Looking for a comparison of different scheduling algorithms for a Finite State Machine (@embedded.kyle)
相关信息
*“更喜欢使用事件对象而不是裸线程”(@Miro)
http://www.drdobbs.com/parallel/prefer-using-active-objects-instead-of-n/225700095
*“正确使用线程=隔离+异步消息”(@Miro)
http://www.drdobbs.com/parallel/use-threads-correctly-isolation-asynch/215900465
最佳答案
在裸骨 MCU 平台上确实没有“事件驱动”这样的东西,尽管流行语喷子试图告诉你什么。您可以接收的唯一真实事件是硬件中断。
根据应用程序的性质及其实时要求,中断可能适合也可能不适合。通常,使用轮询系统实现确定性实时要容易得多。但是,仅依赖轮询的系统很难维护,因为所有计时方面之间都存在紧密耦合。
假设您尝试启动速度较慢的 LCD。与其在空循环中燃烧 CPU 周期时反复轮询某个计时器,不如决定在此期间通过总线接收一些数据。然后你想把接收到的数据打印在 LCD 上。这样的设计在 LCD 启动时间和串行总线之间产生了紧密耦合,在串行总线和数据打印之间产生了另一种紧密耦合。从面向对象的角度来看,这些东西根本没有关联。如果您在将来的某个时候加速串行总线,那么您可能会突然遇到 LCD 打印错误,因为当您尝试在其上打印时它尚未完成启动。
在一个小程序中,像上面的例子一样使用轮询是完全没问题的。但是如果程序有增长的潜力,轮询会让它变得非常复杂,紧耦合最终会导致许多奇怪和致命的错误。
另一方面,多线程和 RTOS 增加了很多额外的复杂性,这反过来也会导致错误。在哪里划线并不容易确定。
出于个人经验,我想说,除了简单的状态机之外,任何小于 20-30k LOC 的程序都不会从调度和多任务中受益。如果程序变得更大,我会考虑多任务实时操作系统。
此外,低端 MCU(8 位和 16 位)远不适合运行操作系统。如果您发现需要一个操作系统来处理 8 位或 16 位平台上的复杂性,您可能一开始就选择了错误的 MCU。我对任何在小于 32 位的操作系统上引入操作系统的尝试持怀疑态度。
关于event-handling - 基于事件或轮询的嵌入式 MCU 系统架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299125/
我有一段代码看起来像这样: void update_clock(uint8_t *time_array) { time_t time = *((time_t *) &time_array[0]
我有一 block 带有特殊 UEXT connector 的 Olimex A20 板它可以连接 SPI、I2C 和 RS 232。我喜欢使用 Olimex 的 MOD Zigbee 模块直接通过
我有一个在基于 ARM Cortex-M 的 MCU 上运行并用 C 和 C++ 编写的应用程序。我用 gcc和 g++编译它并希望完全禁用任何堆使用。 在 MCU 启动文件中,堆大小已设置为 0。除
我目前正在学习微 Controller 和处理器,我对两者之间的一些区别有一些疑问。据我了解,MCU 包含一个实现处理器架构的处理器。例如,我正在使用 SAML22 微 Controller ,其处理
有很多类似的问题,但似乎没有一个问题完全相同。我正在将 STML4 MCU 连接到 6 轴传感器 (LSM6DS3)。我已经成功地在 I2C 中实现了所有内容,但想要 SPI 的额外速度(和 DMA,
我正在尝试将部分二进制文件的 md5 哈希值插入到二进制文件中,以跟踪 MCU 固件版本。 我是这样处理的:在链接脚本中,我将 Flash 分成两部分 MEMORY
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在尝试弄清楚如何为我的 C8051F020 MCU 创建一个定时器。以下代码使用通过以下公式传递给 init_Timer2() 的值: 65535-(0.1/(12/2000000)=48868。
我之前有编写基于事件和轮询的嵌入式系统的经验(适用于没有抢占式操作系统的微型 MCU)。 在基于事件的系统中,任务通常在队列上接收事件(消息)并依次处理它们。 在基于轮询的系统中,任务以一定的时间间隔
我是 python 的新手,我正在使用 2.7 和 spyder 我有一个运行这个的 anduino 风格的板子: void setup() { Serial1.begin(115200); }
我是 python 的新手,我正在使用 2.7 和 spyder 我有一个运行这个的 anduino 风格的板子: void setup() { Serial1.begin(115200); }
我想使用JAVA提取JPEG文件的各个MCU。我在JPEG header 中找不到有关MCU的信息。信息如下:JPEg的MCU大小是8x8、16x8、8x16还是16x16?或提取单个 MCU 所需的
我正在致力于将字节数组的内容从 Android 移动应用程序传输到 MCU。我能够成功地逐字节传输数据(多个数据包),但无法成功发送整个数组(作为一个数据包)。应该注意的是,数据将通过 GATT 配置
我正在从事一个项目,该项目涉及让 FreeRTOS 的 CMSIS-RTOS 打包在 STM32F051C6 上运行。我在 Visual Studio 中使用 VisualGDB 编写和调试代码,并使
下面的代码是如何在单片机上使用实时时钟的示例。 我的问题与回调和函数指针有关。 我在下面包含了 rtc_config_t 的结构声明。 我的问题是,在线 cfg.callback = rtc_exam
在我看来,MCU RAM 包含链接器值、全局范围变量、堆、堆栈,然后某些部分未使用。 因此,工程师是否倾向于发布固件,使一些 MCU RAM 未被使用,因为应用程序不需要它来运行? 最佳答案 这取决于
这里是新手。我目前正在从事一个涉及在 MCU(NUC200LE3AN) 闪存上保存密码的项目。 这些代码工作得很好。写入后,即使在 MCU 重新启动后,我也能够读取 user_password1 的确
简介:我设计了一个带有 ATSAME54N20A 的嵌入式系统。 32 位 ARM® Cortex®-M4F MCU。该板将很快组装好并准备好进行编程,因此我正在设置我的编程环境。我选择了一个简单的解
我只是尝试使用 Scott Meyers 在“Effectice C++ in an Embedded Environment”中建议的 placement new 运算符。 DefaultM
我有一个带有集成和可自定义聊天系统(基于 XMPP)的网站。 我尝试过很多 WebRTC 框架,比如 licode , muaz-khan's , jinja 的插件, OpenTok对于 WebRT
我是一名优秀的程序员,十分优秀!