Modern Event-Driven Programming for Arduino
Traditionally, Arduino programs are written in a sequential manner, which means that whenever an Arduino program needs to synchronize with some external event, such as or a timout (
delay()), a button press, or arrival of a character through the serial port, it explicitly waits in-line for the occurrence of the event. Waiting “in-line” means that the Arduino processor spends all of its cycles constantly checking for some condition in a tight loop (called the polling loop).
Although this approach is functional in many situations, it doesn’t work very well when there are multiple possible sources of events whose arrival times and order you cannot predict and where it is important to handle the events in a timely manner. The fundamental problem is that while a sequential program is waiting for one kind of event (e.g., a button press), it is not doing any other work and is not responsive to other events (e.g., characters from the serial port).
For these and other reasons experienced programmers turn to the long-know design strategy called event-driven programming, which requires a distinctly different way of thinking than conventional sequential programs…
Discontinued Support for AVR-based Arduinos
Due to the decision to discontinue the QP-nano framework, the support for AVR-based Arduinos will be also discontinued in the future. Moving forward, we will only support the QP/C++ framework for ARM-based Arduinos (e.g., SAM-based Arduino DUE, etc.)
Using QM with the Arduino IDE
The “External Tools” menu in QM is no longer configured for direct building Arduino projects. This is because Arduino kept changing their build process and it was impossible to keep adjusting the External Tools. Also, after introducing support for ARM-based Arduino (QP/C++ library for Arduino), the support for Arduino builds has become even more problematic.
So, instead of using QM directly, the intended way of working with the Arduino examples is to use the Arduino IDE for building and downloading the code, but to configure it to “Use external editor”. (To configure Arduino IDE to “Use external editor”, click on the menu File | Preferences and check the checkbox in the “Preferences” dialog box, as shown below:)
This “external editor” is now the QM modeling tool, where you can work with the models (.qm files) and then to generate code from these models. In this scenario, the Arduino IDE is used only to build and upload the code to the Arduino board(s).
The following screen shot shows this workflow. The “external editor” mode of the Arduino IDE is really nice, because it automatically picks up any changes made to the project files.