{"id":1832,"date":"2020-12-09T06:18:47","date_gmt":"2020-12-09T06:18:47","guid":{"rendered":"http:\/\/thmuda.com\/?page_id=1832"},"modified":"2026-06-20T02:49:05","modified_gmt":"2026-06-20T02:49:05","slug":"projects","status":"publish","type":"page","link":"https:\/\/thmuda.com\/index.php\/projects\/","title":{"rendered":"Projects"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1832\" class=\"elementor elementor-1832\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-78781ef elementor-section-stretched elementor-section-height-min-height elementor-section-boxed elementor-section-height-default elementor-section-items-middle elementor-invisible\" data-id=\"78781ef\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;stretch_section&quot;:&quot;section-stretched&quot;,&quot;animation&quot;:&quot;fadeIn&quot;}\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-overlay\"><\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-no\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-031dfa6\" data-id=\"031dfa6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0746c02 elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-heading\" data-id=\"0746c02\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Projects<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f1f400c elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"f1f400c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Engineered and validated in real-world conditions, our products go beyond lab testing to ensure durability, practicality, and reliable performance under actual operating environments.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-0e9f2c0 e-flex e-con-boxed e-con e-parent\" data-id=\"0e9f2c0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b2abc33 elementor-widget elementor-widget-heading\" data-id=\"b2abc33\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><span><span data-dobid=\"hdw\">Heterogeneous <\/span><\/span><span><span dir=\"ltr\">sensor integration into an RTOS-based application.<\/span><\/span><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-dcc51e5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"dcc51e5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-10fbd7d\" data-id=\"10fbd7d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2b88295 elementor-widget elementor-widget-image\" data-id=\"2b88295\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/sensor-array-1024x768.jpg\" class=\"attachment-large size-large wp-image-5422\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/sensor-array-1024x768.jpg 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/sensor-array-300x225.jpg 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/sensor-array-768x576.jpg 768w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/sensor-array-1536x1152.jpg 1536w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/sensor-array.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-fe76e2c\" data-id=\"fe76e2c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4b96376 elementor-widget elementor-widget-text-editor\" data-id=\"4b96376\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In this project, we use a mix of sensors: one (1) SPI-based sensor, one (1) ADC-based sensor, three (3) I\u00b2C sensors sharing a common bus, and three (3) GPIO-based sensors. Instead of starting from scratch, we reuse our existing driver framework, which has been proven in real projects. This ensures consistent implementation, easier integration, and reliable performance across different microcontroller platforms and hardware configurations.<\/p><p><span dir=\"ltr\">\u00a0<\/span><\/p><p>Most effort goes into properly developing and validating the drivers. We ensure correct operation over SPI, I\u00b2C, ADC, and GPIO, covering timing, data handling, conversion, calibration, and error management. Each module is tested and well documented to keep the design clear and maintainable. This helps reduce confusion during updates and makes the system easier to support and extend over time.<\/p><p><span dir=\"ltr\">\u00a0<\/span><\/p><p>With a stable hardware and operating system abstraction layer, integrating these sensors into a new project is typically fast, often under 30 minutes. The same drivers work in both bare-metal and RTOS environments without major changes. Under RTOS, shared peripherals like I\u00b2C and SPI are managed safely, allowing multiple tasks to access resources without conflicts or integration issues.<\/p><p><span dir=\"ltr\">\u00a0<\/span><\/p><p>Using pre-developed drivers greatly reduces development time. Instead of focusing on low-level integration and debugging, we can concentrate on application-level features that deliver real value, such as control logic, data processing, and system behavior. Since the drivers are already validated in real use cases, technical risk is lower. This approach enables faster, more efficient delivery of robust embedded systems.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4b1b561 elementor-widget elementor-widget-text-editor\" data-id=\"4b1b561\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">STM32G491, CAN-FD, FreeRTOS, SEGGER J-Link, I\u00b2C, SPI, ADC<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-4f342dc e-flex e-con-boxed e-con e-parent\" data-id=\"4f342dc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c51c429 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"c51c429\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3ac1e65 e-flex e-con-boxed e-con e-parent\" data-id=\"3ac1e65\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e6b5dff elementor-widget elementor-widget-heading\" data-id=\"e6b5dff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">RTOS, embedded software profiling with SEGGER SystemView.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-bbd79b2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"bbd79b2\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-6446f07\" data-id=\"6446f07\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1968a2e elementor-widget elementor-widget-image\" data-id=\"1968a2e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"744\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/systemview-cand-fd-1024x744.jpeg\" class=\"attachment-large size-large wp-image-5061\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/systemview-cand-fd-1024x744.jpeg 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/systemview-cand-fd-300x218.jpeg 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/systemview-cand-fd-768x558.jpeg 768w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/systemview-cand-fd-1536x1116.jpeg 1536w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/systemview-cand-fd.jpeg 1823w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-72c01e6\" data-id=\"72c01e6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ee874af elementor-widget elementor-widget-text-editor\" data-id=\"ee874af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>The behavior of embedded software can be erratic under certain conditions. Sometimes such behavior begins with the software&#8217;s interrupt service routine (ISR) taking slightly more or slightly less time than usual. This situation can be caused by interrupt priority, priority inversion, and unforeseen events that may occur intermittently.<\/div><div>\u00a0<\/div><div><p>SEGGER SystemView is one of the tools we used to quantify and measure the performance of our software under specific load conditions in order to cover at least most, if not all, worst-case scenarios. This amazing tool helps measure every interrupt and the time consumption of RTOS events. All of this can be collected as evidence to present to our customers and strengthen their confidence in the software package to be delivered.<\/p><p>\u00a0<\/p><p>Referring to the image on the left, the orange block shows when CAN-FD interrupt was triggered for a new message. Interestingly, this takes about 60 \u00b5s in the debug version, while it takes significantly less time with compiler optimization, namely about 35 \u00b5s. Without this tool, there is no way to measure the time required by the ISR so accurately without causing delays in the system.<\/p><p>\u00a0<\/p><p>In addition to measuring interrupt and RTOS events, this tool can also measure CPU utilization in percent, real-time stack and heap utilization, and other debugging messages, helping to reduce software development time, build confidence, and detect serious errors earlier. It goes without saying that RTOS development benefits most from such a tool.<\/p><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27b99fa elementor-widget elementor-widget-text-editor\" data-id=\"27b99fa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">STM32G491, CAN-FD, FreeRTOS, SEGGER SystemView<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-c44ad2b e-flex e-con-boxed e-con e-parent\" data-id=\"c44ad2b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5dfd98a elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"5dfd98a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-659c0ff e-flex e-con-boxed e-con e-parent\" data-id=\"659c0ff\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-84ac9b9 elementor-widget elementor-widget-heading\" data-id=\"84ac9b9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">High-speed, low-latency data acquisition via CAN-FD.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-88280ab elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"88280ab\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-7dce3c0\" data-id=\"7dce3c0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d0681c6 elementor-widget elementor-widget-image\" data-id=\"d0681c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"723\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/can-fd-data-logging-1024x723.jpg\" class=\"attachment-large size-large wp-image-5405\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/can-fd-data-logging-1024x723.jpg 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/can-fd-data-logging-300x212.jpg 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/can-fd-data-logging-768x542.jpg 768w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/can-fd-data-logging-1536x1084.jpg 1536w, https:\/\/thmuda.com\/wp-content\/uploads\/2026\/05\/can-fd-data-logging.jpg 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-695a030\" data-id=\"695a030\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c9ee9bb elementor-widget elementor-widget-text-editor\" data-id=\"c9ee9bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>The STM32G491 provides two CAN-FD channels, supporting data rates up to 8 Mbit\/s, significantly higher than classic CAN at 1 Mbit\/s. In this project, multiple CAN nodes are used, each transmitting at 5.5 ksps with 16-byte payloads. This results in a total data throughput requirement of approximately 2.8 MB\/s, which must be handled reliably by the system.<\/div><div>\u00a0<\/div><div>To meet this requirement, we designed a robust system architecture supported by careful implementation and validation. Extensive measurement and testing were carried out to ensure reliable communication under load. The system successfully achieved more than 40 ksps overall throughput, exceeding the minimum requirement, with an average of 5.7 ksps per node, while continuously logging data to an SD card.<\/div><p>\u00a0<\/p><p>The software implementation reuses our existing BSPs, drivers, and supporting libraries, which have already been proven in other projects. This significantly reduces development effort and allows us to focus on application-level features that provide real value to customers. By leveraging validated components, we also improve reliability and reduce integration risks across different subsystems and communication interfaces.<\/p><p>\u00a0<\/p><p>The system architecture supports both FreeRTOS-based and bare-metal modules, depending on functional requirements. Despite this mixed approach, both environments share the same BSP, sensor drivers, and communication libraries. This ensures consistency across the entire project, simplifies maintenance, and allows flexible deployment strategies while maintaining predictable behavior and performance across all CAN-FD nodes and data logging operations.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e035f8f elementor-widget elementor-widget-text-editor\" data-id=\"e035f8f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">STM32G491, CAN-FD, FreeRTOS, DAQ<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-de2b076 e-flex e-con-boxed e-con e-parent\" data-id=\"de2b076\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f403f62 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"f403f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b132d82 e-flex e-con-boxed e-con e-parent\" data-id=\"b132d82\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-705055a elementor-widget elementor-widget-heading\" data-id=\"705055a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">IMU performance comparison under same platform.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0d86de8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0d86de8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-013f854\" data-id=\"013f854\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b82ed31 elementor-widget elementor-widget-image\" data-id=\"b82ed31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"745\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/mpu9250-vs-icm42688-1024x745.png\" class=\"attachment-large size-large wp-image-5075\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/mpu9250-vs-icm42688-1024x745.png 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/mpu9250-vs-icm42688-300x218.png 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/mpu9250-vs-icm42688-768x558.png 768w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/mpu9250-vs-icm42688-1536x1117.png 1536w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/12\/mpu9250-vs-icm42688.png 1847w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-1617dd9\" data-id=\"1617dd9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e9720c0 elementor-widget elementor-widget-text-editor\" data-id=\"e9720c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Evaluating IMU performance is an important step before selecting a sensor for any project. In most cases, we aim for higher accuracy, lower latency, and minimal jitter. To support this decision-making process, we conducted an experiment comparing the TDK ICM-42688 and the TDK MPU-9250, with the goal of demonstrating which sensor provides better stability and measurement quality.<\/div><div>\u00a0<\/div><div>The comparison was carried out under controlled conditions, where both sensors were placed at rest in the same environment and room temperature. Both devices used the same software framework and configuration to ensure a fair comparison without external influence. This setup allows the observed differences in output signals to be attributed directly to the sensor performance itself.<\/div><p>\u00a0<\/p><p>From the recorded data, we observed that the MPU-9250 exhibits noticeably higher jitter, especially on the Y-axis, with fluctuations of around 1 deg\/s. In contrast, the ICM-42688 shows much lower noise levels of approximately 0.1 deg\/s. This represents about a tenfold improvement in signal stability, indicating significantly better performance in terms of measurement consistency and noise suppression.<\/p><p>\u00a0<\/p><p>Based on these results, the ICM-42688 is a more suitable choice for high-precision applications where stability and low noise are critical. Although it may come at a higher BOM cost compared to the MPU-9250, the improvement in performance justifies its selection. This evaluation provides clear, data-driven support for making informed sensor selection decisions in future system designs.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fd5f310 elementor-widget elementor-widget-text-editor\" data-id=\"fd5f310\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">TDK MPU-9250, TDK ICM-42688, IMU, Grafana<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-2743ca6 e-flex e-con-boxed e-con e-parent\" data-id=\"2743ca6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-08a2b36 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"08a2b36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b56819a e-flex e-con-boxed e-con e-parent\" data-id=\"b56819a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8b90af6 elementor-widget elementor-widget-heading\" data-id=\"8b90af6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Path Tracking with u-blox NEO-6 GPS.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1e4dbbf elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1e4dbbf\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-02267a8\" data-id=\"02267a8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-eb07770 elementor-widget elementor-widget-image\" data-id=\"eb07770\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"657\" height=\"549\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/ublox-neo6-gps-path.webp\" class=\"attachment-large size-large wp-image-4761\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/ublox-neo6-gps-path.webp 657w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/ublox-neo6-gps-path-300x251.webp 300w\" sizes=\"(max-width: 657px) 100vw, 657px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-adefd4d\" data-id=\"adefd4d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-40e0df5 elementor-widget elementor-widget-text-editor\" data-id=\"40e0df5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>The u-blox NEO-6 is a GPS receiver based on the u-blox 6 positioning engine. Driver development started with defining core and alternative use cases, along with API design for parsing NMEA messages. A sample project was also created using CMake, GCC, and the NXP LPC54114 platform to ensure early validation and a structured development workflow from the beginning.<\/div><div>\u00a0<\/div><div>Development was built on our stable HAL and BSP for the NXP LPC54114 (v0.5.0). In the early phase, we simulated NMEA messages including cold start, valid, and invalid cases to cover edge scenarios defined in the requirements. Unit tests were also created to verify expected behavior, ensuring that the implementation is robust and behaves correctly under different input conditions.<\/div><p>\u00a0<\/p><p>The driver supports key NMEA sentence parsers including RMC, VTG, GGA, GSA, GSV, and GLL. By default, these messages are enabled on the NEO-6 module using a UART baud rate of 9600. Development continued with real hardware testing to validate accuracy and reliability, ensuring that parsed outputs matched actual GPS behavior under real operating conditions.<\/p><p>\u00a0<\/p><p>The system was validated through real-world testing, where GPS receivers were mounted on a vehicle and data was recorded while driving through a residential area. Coordinates were captured using Python scripts and visualized with Google Earth to confirm route accuracy. This end-to-end validation helped ensure that the driver performs reliably in practical use cases, not only in simulation environments.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22f9fe2 elementor-widget elementor-widget-text-editor\" data-id=\"22f9fe2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">u-blox NEO-6, GPS, NXP LPC54114, Google Earth<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-5983de5 e-flex e-con-boxed e-con e-parent\" data-id=\"5983de5\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-abeb7b8 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"abeb7b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-98061fb e-flex e-con-boxed e-con e-parent\" data-id=\"98061fb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bd78b67 elementor-widget elementor-widget-heading\" data-id=\"bd78b67\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Sensor driver development for TDK MPU9250, an IMU sensor.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9d419e4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9d419e4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-42bc580\" data-id=\"42bc580\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e7b72f7 elementor-widget elementor-widget-image\" data-id=\"e7b72f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"519\" height=\"299\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drv-tdk-mpu-9250.webp\" class=\"attachment-large size-large wp-image-4762\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drv-tdk-mpu-9250.webp 519w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drv-tdk-mpu-9250-300x173.webp 300w\" sizes=\"(max-width: 519px) 100vw, 519px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-c47d441\" data-id=\"c47d441\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6a010b6 elementor-widget elementor-widget-text-editor\" data-id=\"6a010b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>The TDK MPU-9250 is an IMU that integrates an accelerometer, gyroscope, magnetometer, and internal temperature sensor. The driver development began with clearly defined use cases supported by design artifacts such as use case diagrams, class diagrams, and sequence diagrams. This structured approach ensured a clear understanding of functionality before implementation, improving design clarity and reducing development ambiguity.<\/div><div>\u00a0<\/div><div>The driver was developed and tested using the NXP LPCXpresso54114 development board, leveraging our existing BSP for the LPC54114. This BSP provides stable I\u00b2C peripheral support, which significantly accelerates development. By relying on the established hardware abstraction layer, we were able to focus primarily on implementing and validating the sensor driver logic rather than low-level hardware configuration.<br \/><br \/><\/div><p>The driver exposes 15 functions covering the most commonly used sensor features. During initialization, the user specifies the I\u00b2C channel connected to the sensor, along with configuration parameters such as low-pass filter settings and measurement scale factors. This flexible setup allows the driver to be easily adapted to different application requirements while maintaining consistent and predictable sensor behavior.<\/p><p>\u00a0<\/p><p>The project documentation is automatically generated using Doxygen, providing clear and structured API references. From the class diagram, it is evident that the driver depends only on the HAL I\u00b2C interface, ensuring hardware independence. The <code data-start=\"1636\" data-end=\"1650\">app_config.h<\/code> file is used to store user-defined I\u00b2C configuration settings, allowing easy customization without modifying the core driver implementation.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-72bde77 elementor-widget elementor-widget-text-editor\" data-id=\"72bde77\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">TDK MPU-9250, IMU, NXP LPC54114<br \/><\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-ac0cd26 e-flex e-con-boxed e-con e-parent\" data-id=\"ac0cd26\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3fafd57 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"3fafd57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0a8dc94 e-flex e-con-boxed e-con e-parent\" data-id=\"0a8dc94\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-973807f elementor-widget elementor-widget-heading\" data-id=\"973807f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Generic bootloader program for firmware update.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c0472f8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c0472f8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-65ff9ad\" data-id=\"65ff9ad\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4c4f26b elementor-widget elementor-widget-image\" data-id=\"4c4f26b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"701\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/generic-bootloader-sequence-diagram.webp\" class=\"attachment-large size-large wp-image-4763\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/generic-bootloader-sequence-diagram.webp 850w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/generic-bootloader-sequence-diagram-300x247.webp 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/generic-bootloader-sequence-diagram-768x633.webp 768w\" sizes=\"(max-width: 850px) 100vw, 850px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-0fd42dd\" data-id=\"0fd42dd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-260054d elementor-widget elementor-widget-text-editor\" data-id=\"260054d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>A bootloader is a small program responsible for loading and starting the main application firmware. A well-designed bootloader is essential for reliable field updates without requiring a debugger. It enables end users to update software through communication interfaces such as UART, SPI, or CAN, making maintenance easier and reducing the need for direct engineering support during deployment.<\/div><div>\u00a0<\/div><div>In this project, we designed, implemented, and tested a generic bootloader that serves as a reusable component across different applications. It supports firmware updates via UART and is structured for portability and reuse. To simplify the update process, we also developed a Python-based tool that allows end users to perform firmware upgrades with minimal supervision or technical knowledge.<\/div><p>\u00a0<\/p><p>The bootloader is optimized for a small footprint, with a code size of approximately 4.8 kB. This leaves sufficient space for user-specific routines, as typical bootloader memory allocation is around 8 kB. On the Microchip PIC32MK platform used in this project, 16 kB is reserved, providing additional flexibility while still maintaining a compact and efficient bootloader design.<\/p><p>\u00a0<\/p><p>This implementation improves long-term product maintainability by enabling safe and straightforward firmware updates in the field. By reducing dependency on external debugging tools, it simplifies deployment and support workflows. The combination of a lightweight bootloader and an easy-to-use update script ensures that system upgrades can be performed reliably, helping extend product lifecycle and reduce operational maintenance costs.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e1d2bd8 elementor-widget elementor-widget-text-editor\" data-id=\"e1d2bd8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">Bootloader, Microchip PIC32MK<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-c840445 e-flex e-con-boxed e-con e-parent\" data-id=\"c840445\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1054830 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1054830\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3e01f76 e-flex e-con-boxed e-con e-parent\" data-id=\"3e01f76\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3f1007f elementor-widget elementor-widget-heading\" data-id=\"3f1007f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Newly support OSAL FreeRTOS for Microchip PIC32MK.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-48c6c84 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"48c6c84\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-686caaf\" data-id=\"686caaf\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b353f36 elementor-widget elementor-widget-image\" data-id=\"b353f36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"244\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2025\/01\/freertos-on-pic32mk-500px-300x244.png\" class=\"attachment-medium size-medium wp-image-4871\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2025\/01\/freertos-on-pic32mk-500px-300x244.png 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2025\/01\/freertos-on-pic32mk-500px.png 616w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-cbd2c9b\" data-id=\"cbd2c9b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1dbebd5 elementor-widget elementor-widget-text-editor\" data-id=\"1dbebd5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>The Microchip PIC32MK offers a wide range of on-board peripherals, including CAN (6 channels), I\u00b2C (4 channels), SPI (6 channels), and UART (6 channels), along with additional features such as a Memory Protection Unit (MPU) and configurable pin multiplexing. It is also designed with safety-oriented capabilities that support development toward standards such as ISO 26262.<\/div><div>\u00a0<\/div><div>To fully utilize these peripherals efficiently, an RTOS is recommended to manage concurrency and ensure low latency, responsiveness, and deterministic behavior. In our implementation, FreeRTOS integrates seamlessly with our proprietary Board Support Package (BSP), which provides HAL drivers for easy configuration and use of all available peripherals. This combination simplifies system design while maintaining predictable real-time performance.<\/div><p>\u00a0<\/p><p>The FreeRTOS version used is based on kernel v11.0, with only minimal modifications specific to PIC32MK configuration. No core kernel logic was altered, ensuring compatibility and stability. This approach allows us to maintain a standard RTOS foundation while adapting it to the hardware platform. It also simplifies maintenance and future upgrades to newer FreeRTOS versions.<\/p><p>\u00a0<\/p><p>In our sample implementation, all available BSP modules were successfully used simultaneously across multiple peripherals without blocking system operation. This demonstrates that the architecture can handle high peripheral load while maintaining responsiveness. It also confirms that the combination of PIC32MK, BSP, HAL, and FreeRTOS provides a stable and scalable foundation for complex embedded applications requiring multiple concurrent communication channels.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-351f3c3 elementor-widget elementor-widget-text-editor\" data-id=\"351f3c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">OSAL, FreeRTOS, Microchip PIC32MK, ISO26262<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-89d710c e-flex e-con-boxed e-con e-parent\" data-id=\"89d710c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-36bbd16 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"36bbd16\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c775318 e-flex e-con-boxed e-con e-parent\" data-id=\"c775318\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d148d48 elementor-widget elementor-widget-heading\" data-id=\"d148d48\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Finite State Machine with event driven capabilites.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4c339f8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4c339f8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-c8963ef\" data-id=\"c8963ef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f98ae14 elementor-widget elementor-widget-image\" data-id=\"f98ae14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"845\" height=\"620\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/fsm-embedded.webp\" class=\"attachment-full size-full wp-image-4765\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/fsm-embedded.webp 845w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/fsm-embedded-300x220.webp 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/fsm-embedded-768x564.webp 768w\" sizes=\"(max-width: 845px) 100vw, 845px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-480c84b\" data-id=\"480c84b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4849af7 elementor-widget elementor-widget-text-editor\" data-id=\"4849af7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>A common issue with existing embedded FSM frameworks is poor documentation, untested code, and overly complex interfaces. We addressed these problems by delivering a fully tested solution with 100% line and branch coverage. The framework also complies with C coding standards and MISRA C:2012, ensuring high code quality, reliability, and suitability for safety-conscious embedded development environments.<\/div><div>\u00a0<\/div><div>The framework is supported by clear and practical documentation, including usage examples, sequence diagrams, and class diagrams. These materials help visualize internal behavior and simplify understanding of state transitions and use cases. This structured documentation approach makes it easier for developers to adopt the framework quickly and apply it consistently across both simple and complex embedded system projects.<\/div><p>\u00a0<\/p><p>The FSM is fully platform agnostic, meaning it does not depend on any specific HAL, BSP, OSAL, or microcontroller. It can be easily integrated into different systems with minimal effort. The implementation is lightweight and requires fewer than 50 lines of code for basic usage, making it highly accessible while still supporting scalable designs for more advanced applications.<\/p><p>\u00a0<\/p><p>To enhance reliability, the FSM includes built-in safety mechanisms that strictly control state transitions based on user-defined rules. It also supports state recovery, allowing the system to handle failures during state entry gracefully. With only two public APIs, the interface remains simple while still providing essential FSM functionality, making it well-suited for robust and maintainable embedded software design.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33d1417 elementor-widget elementor-widget-text-editor\" data-id=\"33d1417\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">Event Driven, Finite State Machine, FSM, MISRA, CERT, CWE<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-5e47bc1 e-flex e-con-boxed e-con e-parent\" data-id=\"5e47bc1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7e7e515 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"7e7e515\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-046e141 e-flex e-con-boxed e-con e-parent\" data-id=\"046e141\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c7a2b45 elementor-widget elementor-widget-heading\" data-id=\"c7a2b45\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Newly support Board Support Package for Microchip PIC32MK.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-97d07b6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"97d07b6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-a9925ca\" data-id=\"a9925ca\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cf3c59f elementor-widget elementor-widget-image\" data-id=\"cf3c59f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-microchip-pic32.webp\" class=\"attachment-large size-large wp-image-4766\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-microchip-pic32.webp 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-microchip-pic32-300x225.webp 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-microchip-pic32-768x576.webp 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-6be0b4c\" data-id=\"6be0b4c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d954857 elementor-widget elementor-widget-text-editor\" data-id=\"d954857\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Developing a reusable Hardware Abstraction Layer (HAL) and Board Support Package (BSP) is a challenging but effective approach for simplifying microcontroller migration and driver development. This architecture allows software to be reused across projects with minimal changes. As a result, it helps reduce development effort, improves consistency, and provides long-term value for companies working on multiple embedded systems.<\/div><div>\u00a0<\/div><div>We provide a complete BSP implementation for the Microchip PIC32MK1024MCM100 microcontroller, covering all major peripheral interfaces. This includes UART, I\u00b2C, SPI, can, GPIO, timers, ADC, DAC, PWM, real-time clock and calendar, watchdog, and other core functions. The implementation is designed to be production-ready, with a focus on reliability, maintainability, and ease of integration into new embedded projects.<br \/><br \/><\/div><p>All developed code is thoroughly tested and aligned with industry standards such as MISRA C, CERT, and CWE guidelines. This ensures that the software meets high levels of quality, safety, and reliability. By following these standards, we reduce potential bugs and risks early in development, resulting in more stable firmware that is suitable for production environments and long-term deployment.<\/p><p>\u00a0<\/p><p>The BSP package also includes example projects designed to validate all peripheral functions on the Microchip PIC32MK MCM Curiosity Pro development board. These examples help verify correct hardware operation and provide a practical starting point for new development. They also simplify onboarding, allowing engineers to quickly understand and use the BSP effectively in real application scenarios.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b0b5e6 elementor-widget elementor-widget-text-editor\" data-id=\"2b0b5e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">BSP, HAL, Microchip PIC32MK<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-b238fea e-flex e-con-boxed e-con e-parent\" data-id=\"b238fea\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f9dee57 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"f9dee57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-757ed10 e-flex e-con-boxed e-con e-parent\" data-id=\"757ed10\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-26409e7 elementor-widget elementor-widget-heading\" data-id=\"26409e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Drive-by-wire software development for vehicle motion control.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1e0b2be elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1e0b2be\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-d568b42\" data-id=\"d568b42\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3c0f1e0 elementor-widget elementor-widget-image\" data-id=\"3c0f1e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drive-by-wire-operation-sequence.webp\" class=\"attachment-large size-large wp-image-4767\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drive-by-wire-operation-sequence.webp 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drive-by-wire-operation-sequence-300x225.webp 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/drive-by-wire-operation-sequence-768x576.webp 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-c6b92a7\" data-id=\"c6b92a7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-49a1536 elementor-widget elementor-widget-text-editor\" data-id=\"49a1536\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>In this project, we designed and deployed a drive-by-wire system for gas-powered vehicles for a research institute in Malaysia. The system uses both UART and CAN bus communication to receive velocity and steering commands from an onboard autonomous control computer. This dual-communication setup ensures reliable data exchange between the vehicle control system and the higher-level autonomy module.<\/div><div>\u00a0<\/div><div>The software was developed in C and C++, built on our reusable Hardware Abstraction Layer (HAL) and Board Support Package (BSP) designed for Atmel microcontrollers. With FreeRTOS as the operating system, the system supports concurrent control tasks while maintaining strict timing requirements. This structure ensures that critical vehicle control functions run reliably alongside other non-critical system operations.<br \/><br \/><\/div><p>To support system safety and maintainability, we delivered complete documentation, including user manuals, Software Detailed Design (SDD), troubleshooting notes, and Hazard Analysis and Risk Assessment (HARA). These materials help ensure clear understanding between stakeholders and development teams. They also provide structured guidance for system operation, maintenance, and future enhancements, reducing ambiguity during deployment and long-term support phases.<\/p><p>\u00a0<\/p><p>We used UML as a standardized approach to define the system architecture and detailed software design before implementation. This provided a clear blueprint for firmware development and improved communication between stakeholders. By structuring the system design upfront, we reduced development risks and ensured alignment with requirements, resulting in a more robust, traceable, and maintainable drive-by-wire software solution.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b0f56d elementor-widget elementor-widget-text-editor\" data-id=\"2b0f56d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">Atmel, C++, FreeRTOS, Drive by Wire, HARA, Risk Assessments<br \/><\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-720e35d e-flex e-con-boxed e-con e-parent\" data-id=\"720e35d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1ca6602 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1ca6602\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2196c51 e-flex e-con-boxed e-con e-parent\" data-id=\"2196c51\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8785685 elementor-widget elementor-widget-heading\" data-id=\"8785685\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Newly support OSAL FreeRTOS for ESP32.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-15384a3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"15384a3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-870bf33\" data-id=\"870bf33\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-30131dc elementor-widget elementor-widget-image\" data-id=\"30131dc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"927\" height=\"678\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/osal-freertos-1.webp\" class=\"attachment-large size-large wp-image-4768\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/osal-freertos-1.webp 927w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/osal-freertos-1-300x219.webp 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/osal-freertos-1-768x562.webp 768w\" sizes=\"(max-width: 927px) 100vw, 927px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-55ffc5e\" data-id=\"55ffc5e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-df43319 elementor-widget elementor-widget-text-editor\" data-id=\"df43319\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>In this project, we developed a flexible Operating System Abstraction Layer (OSAL) with RTOS support using FreeRTOS, along with a generic Hardware Abstraction Layer (HAL) tailored for the ESP32 chipset. These interfaces are designed to be reusable and portable across projects. This helps reduce development effort and simplifies adaptation when working with different microcontroller platforms and customer requirements.<\/div><div>\u00a0<\/div><div>The main benefit of this architecture is the reduction in migration effort. When moving from ESP32 to another MCU, such as an NXP platform, most of the application and middleware code remains unchanged. Only the HAL layer needs to be adapted. This significantly reduces redevelopment time and helps maintain consistency across different hardware targets without affecting higher-level software components.<br \/><br \/><\/div><div>The OSAL is designed to isolate the application layer from the underlying RTOS implementation. This allows the system to switch between different real-time operating systems without major code changes. Supported options include FreeRTOS, SAFERTOS, MicriumOS, and others. This flexibility ensures that projects can meet different safety, performance, or licensing requirements while keeping the application logic stable and reusable.<\/div><p>\u00a0<\/p><p>Overall, this layered architecture improves software portability, maintainability, and long-term scalability. By standardizing both HAL and OSAL interfaces, we minimize dependency on specific hardware and RTOS choices. This reduces integration risk and development cost while enabling faster project delivery. It also ensures that core application features remain intact even when underlying hardware or operating system components are changed.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f582fa2 elementor-widget elementor-widget-text-editor\" data-id=\"f582fa2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">OSAL, FreeRTOS, C, C++, ESP32<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-115a91a e-flex e-con-boxed e-con e-parent\" data-id=\"115a91a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5bde515 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"5bde515\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-447a138 e-flex e-con-boxed e-con e-parent\" data-id=\"447a138\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bffd0fa elementor-widget elementor-widget-heading\" data-id=\"bffd0fa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Newly support Board Support Package for NXP LPC54114.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-86a3ca8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"86a3ca8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-d5c31a0\" data-id=\"d5c31a0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c5aa030 elementor-widget elementor-widget-image\" data-id=\"c5aa030\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-nxp-lpc54114.webp\" class=\"attachment-large size-large wp-image-4769\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-nxp-lpc54114.webp 1024w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-nxp-lpc54114-300x225.webp 300w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bsp-nxp-lpc54114-768x576.webp 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-96c52c3\" data-id=\"96c52c3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3191e6e elementor-widget elementor-widget-text-editor\" data-id=\"3191e6e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>In this project, we developed a comprehensive Hardware Abstraction Layer (HAL) for NXP LPC microcontrollers. It covers key peripherals such as GPIO, I\u00b2C, SPI, ADC, PWM, and timers. The interface is designed to be flexible and reusable across different projects. This approach improves development efficiency and provides clear long-term value, especially when adapting to varying customer requirements and system constraints.<\/div><div>\u00a0<\/div><div>The BSP implementation demonstrates smooth portability between different MCU platforms. We successfully migrated from the LPC845 to the LPC54114, which provides higher memory capacity for application use. Importantly, this transition required no changes to the application layer, HAL, OSAL, or middleware. This highlights the strength of the abstraction design and its ability to isolate hardware differences effectively.<\/div><div>\u00a0<\/div><p>The LPC54114 BSP was integrated as a direct replacement for the LPC845 BSP without impacting existing software components. This seamless swap confirms that the system architecture is well-structured and hardware-independent at higher layers. It also reduces migration effort in future projects, allowing faster scaling to new hardware while maintaining consistent behaviour across different NXP LPC microcontroller variants.<\/p><p>\u00a0<\/p><p>Overall, this abstraction-driven design significantly reduces development effort when supporting new hardware platforms. By standardizing peripheral access through HAL and BSP layers, application code remains unchanged across MCU upgrades. This improves maintainability, reduces integration risks, and ensures better reuse of software assets. It also delivers clear return-on-investment by minimizing redevelopment effort for future embedded system projects.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-72a6af7 elementor-widget elementor-widget-text-editor\" data-id=\"72a6af7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">BSP, HAL, NXP LPC845, NXP LPC54114<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-19fc851 e-flex e-con-boxed e-con e-parent\" data-id=\"19fc851\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8d1342f elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"8d1342f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ad151e0 e-flex e-con-boxed e-con e-parent\" data-id=\"ad151e0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5c8b9bb elementor-widget elementor-widget-heading\" data-id=\"5c8b9bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Customized object recognition with YOLOv4.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-354746e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"354746e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-cbaeb1f\" data-id=\"cbaeb1f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3866f23 elementor-widget elementor-widget-image\" data-id=\"3866f23\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"662\" height=\"442\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/python-yolov4.webp\" class=\"attachment-large size-large wp-image-4770\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/python-yolov4.webp 662w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/python-yolov4-300x200.webp 300w\" sizes=\"(max-width: 662px) 100vw, 662px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-fca4027\" data-id=\"fca4027\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0bb19df elementor-widget elementor-widget-text-editor\" data-id=\"0bb19df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>This project is developed using Python and relies on TCP and UDP communication for remote drone control. It also integrates a YOLOv4-based object recognition framework to detect and track pre-trained objects. In addition, gesture recognition is used to support intuitive drone operation, allowing more flexible and interactive control of the system during real-time flight scenarios.<\/div><div>\u00a0<\/div><div>Since the system uses multiple UDP ports for sensor data, camera frame capture, and command transmission, careful multi-threading management is required. To keep this manageable, the overall logic is structured using a Finite State Machine (FSM). This helps clearly define drone behaviour, coordinate concurrent tasks, and ensure that system responses remain predictable under different operating conditions.<\/div><div>\u00a0<\/div><p>The FSM also simplifies control flow by separating system states such as idle, tracking, and command execution. This makes the system easier to extend and debug, especially when handling asynchronous data streams. By organizing logic in a structured way, we reduce complexity in thread coordination and improve overall system stability during real-time drone operation and communication handling.<\/p><p>\u00a0<\/p><p>All application code, including the FSM framework, is validated using Python\u2019s unittest framework. Unit tests are run regularly to ensure functional correctness and detect issues early during development. This process helps maintain code quality, especially during refactoring or feature updates. It also reduces the risk of unexpected bugs, ensuring more stable and reliable behaviour throughout the development lifecycle.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2f1caff elementor-widget elementor-widget-text-editor\" data-id=\"2f1caff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">Python, State Machine, Object Recognition, AI, Machine Learning<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-79103bc e-flex e-con-boxed e-con e-parent\" data-id=\"79103bc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9b81963 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"9b81963\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-011a253 e-flex e-con-boxed e-con e-parent\" data-id=\"011a253\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e88203f elementor-widget elementor-widget-heading\" data-id=\"e88203f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Quality gates with CI\/CD in Bitbucket pipeline.<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-786421e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"786421e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-71c18bd\" data-id=\"71c18bd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-49f6e00 elementor-widget elementor-widget-image\" data-id=\"49f6e00\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"661\" height=\"509\" src=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bitbucket-pipeline.webp\" class=\"attachment-large size-large wp-image-4771\" alt=\"\" srcset=\"https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bitbucket-pipeline.webp 661w, https:\/\/thmuda.com\/wp-content\/uploads\/2024\/12\/bitbucket-pipeline-300x231.webp 300w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-e217b9d\" data-id=\"e217b9d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-be58744 elementor-widget elementor-widget-text-editor\" data-id=\"be58744\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>We have the capability to automatically build the software, run unit tests, check code coverage, and perform static analysis for every Pull Request, as well as for commits to the Master or Release branches. This ensures that each change is verified early and consistently, maintaining a stable codebase and enforcing the required quality standards before integration or release.<\/p><p>\u00a0<\/p><p>This automated workflow helps us detect issues quickly, including functional bugs, regression problems, and coding standard violations. By running these checks on every change, we reduce the risk of defects reaching later stages of development. It also improves code reliability and gives developers immediate feedback, making it easier to maintain a high-quality and stable embedded software baseline over time.<\/p><p>\u00a0<\/p><p>Our CI\/CD pipeline is built using Docker-based environments to ensure consistent and reproducible builds across all stages. The infrastructure is integrated with Atlassian tools such as Bitbucket and Pipelines, providing smooth version control and automation support. This setup allows us to standardize the build process, simplify environment management, and ensure that all builds run in controlled and predictable conditions.<\/p><p>\u00a0<\/p><p>We are also able to support and guide CI\/CD implementation for your projects, helping establish automated build, test, and deployment workflows. This includes improving internal development processes and software delivery efficiency. With our experience, we can help align your pipeline with best practices, ensuring better scalability, higher code quality, and faster release cycles for embedded and software systems.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ebf4188 elementor-widget elementor-widget-text-editor\" data-id=\"ebf4188\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"color: #0049db;\">CI\/CD, BitBucket, Gitlab, Docker, Unit Test, Code Coverage<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-bc48979 e-flex e-con-boxed e-con e-parent\" data-id=\"bc48979\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5dfa1e1 e-flex e-con-boxed e-con e-parent\" data-id=\"5dfa1e1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6af4e72 elementor-widget-divider--separator-type-pattern elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"6af4e72\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\" style=\"--divider-pattern-url: url(&quot;data:image\/svg+xml,%3Csvg xmlns=&#039;http:\/\/www.w3.org\/2000\/svg&#039; preserveAspectRatio=&#039;none&#039; overflow=&#039;visible&#039; height=&#039;100%&#039; viewBox=&#039;0 0 24 24&#039; fill=&#039;none&#039; stroke=&#039;black&#039; stroke-width=&#039;1&#039; stroke-linecap=&#039;square&#039; stroke-miterlimit=&#039;10&#039;%3E%3Cpolyline points=&#039;0,18 12,6 24,18 &#039;\/%3E%3C\/svg%3E&quot;);\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b4f3c87 e-flex e-con-boxed e-con e-parent\" data-id=\"b4f3c87\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b69d357 elementor-widget elementor-widget-spacer\" data-id=\"b69d357\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Projects Engineered and validated in real-world conditions, our products go beyond lab testing to ensure durability, practicality, and reliable performance under actual operating environments. Heterogeneous sensor integration into an RTOS-based application. In this project, we use a mix of sensors: one (1) SPI-based sensor, one (1) ADC-based sensor, three (3) I\u00b2C sensors sharing a common [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1832","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"murtadhabazlitukimat","author_link":"https:\/\/thmuda.com\/index.php\/author\/murtadhabazlitukimat\/"},"uagb_comment_info":0,"uagb_excerpt":"Projects Engineered and validated in real-world conditions, our products go beyond lab testing to ensure durability, practicality, and reliable performance under actual operating environments. Heterogeneous sensor integration into an RTOS-based application. In this project, we use a mix of sensors: one (1) SPI-based sensor, one (1) ADC-based sensor, three (3) I\u00b2C sensors sharing a common&hellip;","_links":{"self":[{"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/pages\/1832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/comments?post=1832"}],"version-history":[{"count":99,"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/pages\/1832\/revisions"}],"predecessor-version":[{"id":5685,"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/pages\/1832\/revisions\/5685"}],"wp:attachment":[{"href":"https:\/\/thmuda.com\/index.php\/wp-json\/wp\/v2\/media?parent=1832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}