Firmware and Software

In embedded systems, the term firmware is very common and describes the software that runs close to the hardware usually with limited resources and commonly in a deterministic execution time frame. Don’t be fooled, however; Firmware can be many thousands of code lines and be a complete application.

How such a piece of software is debugged? It is often stated that debugging is an art. Debugging embedded systems is even more difficult. Electronics that control physical resources (like motors) cannot freeze while stepping in the code, making the process challenging. It would be really hard to trace a problem in this case. So experts in the field use multiple approaches often not found in usual software development projects to trace intermittent errors or problems that relate to the unpredictable environments in real-time.

Software/firmware quality is something that cannot be easily assessed by non-experts. There are a few guidelines though, which give an indication of the written code quality.

  • How many bugs are revealed during testing?
  • How difficult are these faults to be pinpointed?
  • How easy is to change operation or add features?
  • How fast can you port to other microcontroller architectures?

The first rule of debugging in embedded systems is to avoid creating bugs in the first place. A good architectural design and coding practice are required to achieve a low bug count and reduce debug time. On a medium scale of an embedded project expect a significant amount of time before you see any actual line of code. This time goes for architectural decisions and tests that will pay off later with faster coding and a quality product.

From more than 40 man-years of embedded firmware experience, we have mastered these techniques. Using Test-Driven Development methods, layered architectures, timing evaluations, best coding practices, and system testing we achieve our goals on time. Furthermore, we leave support for debugging in cases these are needed during later phases of the product’s lifecycle. There is also strong experience in production-grade safety-critical systems that can help create such applications or provide consulting on the process.

We use C and Assembly, creating code that can be ported to different microcontroller architectures fast and support development or product with Python and GUI scripting. Our debug strategies include a combination of debuggers, oscilloscopes, and logic analyzers to effectively pinpoint difficult to resolve issues if ever arise.

Hardware Design

As every design process starts from the requirements document, hardware design is no exception. A detailed specification is created from these requirements which drives the schematic drawing phase. An often neglected part is the selection of parts to accomplish an electronic design. Selecting parts with high availability and less lead delivery times is an important task. Another aspect is selecting the components packages as these affect the board (PCB) area and the assembly process. A denser PCB may require a higher manufacturing class and thus increase production costs. A good understanding of the PCBA production phases is required to have an efficient design that can be produced smoothly in quantities without disruptions.

Producing is not the end of the line though. Testing is another major factor that should be considered. There are many test strategies employed depending on the technology used, production quantities, and yield. The board shall have provisions for the selected method(s) of testing, like In-Circuit Test, Functional Test, JTAG/Boundary Scan, or other custom testing.

Understanding the above issues explains why there are many failures in kick-start type projects when it comes to hardware. Taking the wrong decisions may end up well out of the estimated cost and time budget. We use top-of-the-line CAD tools (Altium Designer) to tackle all these aspects of product design and lifecycle maintenance.

Example PCB Design

Our hardware experience with systems that went to production offers many years of experience in embedded systems design, starting from specifications down to product support. Our portfolio of work includes dc motors, sensing, microcontrollers, FPGAs, and mechanical integration. In addition, design tools offer strong collaboration capabilities enhancing documentation, changes, and reviews.

System & Product Design

Creativity and innovation may be important when designing a new product. However, the recipe for success requires more skills and competencies; it is common to compromise in an attempt to balance effectively features and costs. Also, a good understanding of the end-user, development effort, and product design stages is necessary to complete the design cycle and deliver the final product.

Common Questions

  • Have an idea but do not have the technical expertise to make it happen
  • Do not know what kind or resources will be required
  • Difficult to partition your product in hardware and software
  • Are the electronics designed efficiently to minimize production costs
  • Which is the dominant factor costs, features or quality of the product
  • What is the required safety or electromagnetic compatibility certifications

These are some of the questions that could make someone uncomfortable or even make him/her abandon a great idea. In other cases, someone may start on the wrong path and could find him/herself in the middle of a difficult-to-resolve situation, leading to missing the critical time-to-market advantage.

We tackle all these aspects, either by consulting you and presenting viable options with offering new perspectives so that you can make informed decisions about your idea or we perform the hardware implementation to your specifications.

Our expertise spans multiple domains of electronic design, firmware development, automation tools, mechanical integration, instrumentation, and testing to cover all aspects of product development.