In the past, embedded systems often ran very small operating systems with no filesystem, or even ran on the "bare metal." With the increasing power and lower cost of hardware, including SOCs (Systems on a Chip), many embedded systems are moving to a full operating system, often based on Linux.
One advantage of running Linux on an embedded device is that many of the tools and utilities you are familiar with on a desktop Linux system are available in this environment, as well. While the final product may not ship with them, as a developer you can have access to a shell, basic commands, and a full networking stack. It is even feasible to natively compile code on an embedded system, like a Raspberry Pi, if the application is relatively small.
Many of the tools I've mentioned previously in this Qt Developer's Bag of Tricks blog series are applicable to embedded systems. In this installment, I'll focus on some that are useful specifically for embedded systems. This includes both programs for running on an embedded system, or tools that run on a separate development machine that are useful for developing for, or communicating with, an embedded system.
As I mentioned, it is often useful to have a shell and common Linux/UNIX commands (ls, grep, find etc.) on an embedded system. BusyBox (1) provides many of the common UNIX utilities in a single small executable. The commands are for the most part drop in replacements for the full UNIX commands, providing the commonly used features and omitting some of the lesser used options.
This allows the overall footprint (in memory and filesystem space) to be significantly smaller. It includes approximately 300 commands and is configurable so you can include or exclude the commands you want at compile time.
There is often a need to talk to an embedded system through a serial interface. This may be before a system has networking up and running, or to access the boot loader.
A terminal emulator program is used on the host computer side to do this. Minicom seems to be the defacto standard terminal emulator for Linux. While ugly (non-graphical) and a little hard to use, it works and has a rich set of features. It's worth spending some time learning how to use it.
On the Windows platform, the standard utility was HyperTerminal, but starting with Windows 7 it is no longer supported or included with Windows. You can buy a commercial version of HyperTerminal that is supported, or use one of a number of other terminal emulator programs. If you have a copy of Windows XP around, you can also copy the appropriate files (hypertrm.dll and hypertrm.exe) to a newer system (including Windows 10) and it should generally work even though it is not supported.
Typically embedded systems support networking, and that is often the preferred method for transferring files to the system during development. You can run an ssh server on the device, and then use ssh to access the system from a development machine. The sftp program can also be useful, providing a similar interface to ftp (File Transfer Program), but using the more secure ssh protocol.
Most IDEs, like Qt Creator, support using ssh or sftp to transfer files and start remote executables, doing this from a graphical user interface which is often easier than calling the commands directly. There are alternative ssh servers that can be lighter weight than full servers like OpenSSH, and more suitable for running on an embedded system. One popular choice is Dropbear (2).
Android Debug Bridge (adb) (3) is a command-line tool for communicating with a device to perform a variety actions, such as installing, debugging and providing access to a shell. It is a standard tool for development on Android and is included in the Android SDK. Adb can also be used on non-Android systems (4).
The Yocto Project (5) is an Open Source initiative that provides templates, tools and methods to create custom Linux-based systems for embedded products. It was founded in 2010 as a collaboration among many hardware manufacturers, open-source operating systems vendors, and electronics companies. The Qt Company uses it as the basis for their commercial Qt for embedded systems, boot2qt.
(I've covered Yocto in a number of previous blog posts (6)(7)(8) and hosted a webinar (9) on it.)
Buildroot (10) is another commonly used tool for embedded systems for generating a cross-compilation toolchain, root filesystem, kernel image, and bootloader. It is less powerful than Yocto, but can be simpler to use. Between Yocto and buildroot, often the choice comes down not to technical merit but to what is supported by your BSP (board support package) vendor.
I hope this overview was helpful. If so, please share it with your colleagues. You can find earlier installments of this series here.