What is embedded software development?

11 February 2019 / embedded software development process
Challenges and problems in the development of embedded software
The development of embedded software puts many difficult challenges before programmers. Let’s list the most important ones:
high business risk caused by the variability of customer requirements and short deadlines;
because later updates are not possible, hardware and software must be reliable after the production stage, which is associated with a large number of tests;
high divisibility of tasks makes communication between teams working on hardware and software critical.
Depending on the chosen management model, these challenges may cause various problems at the design stage. If we decide on a cascade model and we do not ensure that all changes are recorded in the documentation, then with time the assumptions will be significantly off from actual progress. This may make management more difficult and the final effect will be different than expected. Before the product is ready for testing, we will need an average of 6 months of work. This delayed entry of the quality department into action leads to last-minute detection of problems and repairs, which may in turn cause delays. Lack of smooth communication and – due to the formal hierarchy – anticipation for acceptance of the proposed solutions will also have negative consequences in the timeliness of the schedule. The agile development model can be the answer to most of these problems.
The agile programming manifesto sounds lofty, but does this method guarantee success in creating embedded systems? Of course not. Each project management method has its pros and cons. The first ones will emerge in the hands of a well-coordinated team, but the second will be reflected in activities to which chaos makes its way. Systematic work is the key to success in agile programming. Poorly coordinated communication will bring a domino effect. It is also very important to plan work during sprints and set realistic goals. If you cannot keep pace with your plans, find alternative ways to show your progress. Unnecessary rush can make sprints turn into discussions about the accumulating errors, and all work will be reduced to compensating for mistakes. This will not bring any good results.
Some companies cannot opt for one methodology or are afraid of transitioning to an agile software model. That is why they do it step by step. Therefore, they create a kind of hybrid called scrummerfall at their own discretion. Sitting back and doing nothing will not bring positive effects. In this way, the team does not benefit from any of the adopted assumptions, or worse, leads to disorganization of the set-out work schedule.
How to build embedded systems?
The creation of embedded systems should be similar to embedded systems themselves. Each team member should have clearly defined functions and be an integral part of a larger whole. In the event of problems, use the principle of redundancy. The effects of the work should be predictable and visible in the completed cycle. This will all add up to the image of a reliable mechanism.
Mobile app development: hybrid or native — which one should you opt for?
Coke or Pepsi? Christmas Eve or Easter? A question from the developers world can undoubtedly join the ranks of these perennial discussions: hybrid or native app? There is no right or wrong here.
Your Full Guide to Embedded Software Development: Definition, Applications & Benefits
![]()
When it comes to promoting digital transformation in many sectors, embedded software is crucial. It makes it possible to make smart, connected gadgets that have a big effect on our daily lives. To keep up with the rest of the business world in a modern technology-driven environment, entrepreneurs must explore embedded software development. Embedded software products allow you to create smart devices that improve customer experiences and simplify processes, resulting in a higher return on investment.
What is Embedded Software?
Software and hardware work together to power embedded systems. The hardware follows the software’s instructions on how to process data, calculate, and exchange information with other devices. The hardware is programmed to do these actions by use of specific printed-circuit boards.
This allows embedded systems to work and send the required data to consumers on time. Embedded software systems are crafted to function inside the hardware of the device, allowing for the execution of tasks without human intervention.
What is Embedded Software Development?
Unlike standard personal computers, «Embedded Software» is designed to manage specific hardware. Embedded systems form when non-computer components are combined with engineering. They are now widely used in many different industries, including manufacturing, telecommunications, transportation, consumer electronics, tracking devices, and medicine.
You need OSes, microcontrollers, and suitable tools for coding to create an embedded system. Python, C, etc. are only some of the languages that may be used to build applications for embedded systems.
Embedded software development is the process of writing code in a machine-readable language (or several languages) so that a computer can execute it on an embedded system. It usually happens via custom development services that tailor an embedded system to specific company needs.
Different Types
various kinds of embedded systems with their respective use cases and associated specifications are as follows:
- Independent or stand-alone: Embedded systems like calculators and digital cams that operate in isolation from the rest of the web are said to be «stand-alone.» They’re doing everything on their own.
- Real-time: Real-time embedded devices carry out their operations with a minimal lag (measured in microseconds, milliseconds, or even seconds), resulting in seamless integration into operational workflows. Examples include factory machinery, surgical robots, and other medical equipment.
- Networked: Embedded systems that function as part of a larger network. To get where they need to go, a plethora of Embedded Systems form interconnected networks. IoT gadgets, traffic lights, etc., are only a few examples.
Embedded Systems Development
Embedded development requires careful planning. Plus, there are some factors you must consider:
Defining Needs
Spend a bit of time to identify the system’s needs before beginning to create an embedded system. For instance, what are the system’s goals and how can they happen?
Design
The next step is thinking about the system’s architecture or structure once you’ve identified all needs and established your strategy. Pick out each piece of hardware or software you’ll need.
System design also involves considering other elements such as power consumption, performance, overall cost, etc. The future is an important factor to think about, and you should ask yourself questions about scalability and future-proofing.
Getting the Hardware
Once you have the answer, you may go on to the next step, which is gathering the necessary hardware and software for your system. Listen to comments and discuss these needs with the rest of the team and any interested parties.
Choosing the proper hardware development platform is essential when creating embedded software. Think about things like how long the battery lasts, how much power the device uses, and how fast it can process data. Pick hardware that is widely available and has a vibrant group of developers behind it.
Architecture Design
Your project’s success depends on the solidity of the software framework underlying the embedded system. Expert embedded software consultants will determine the most appropriate design, such as a layered architecture or event-based design for your specific requirements.
Firmware Development
Creating firmware is the backbone for creating embedded software. The development staff uses hardware-friendly programming languages including C, C++, and Python. Developers may make the most of the hardware’s potential and create algorithms and principles that are tailored to the software by using the right programming language. Making sure the code is efficient, brief, and well-documented is essential for making changes and finding bugs down the line.
Security Check
When it comes to managing critical tasks or dealing with sensitive information, embedded systems must adhere to the highest standards of security. The development team incorporates robust security mechanisms, such as authentication and reliable boot procedures, to mitigate such dangers.
Prototyping
You have defined your needs, gathered the required resources, and are now ready to build a system prototype. Build a prototype using the selected parts of the system.
Build your prototype with the specifications and layout in mind. Once you have completed this step, you will be ready for the next.
Testing
Once you have a working prototype of your system, testing may begin. Use the tools in your hand to put your system through its tests; if you come across any problems, you can then work to fix them.
Check whether the system complies with your specifications. Continue refining the system until all of its tasks work flawlessly.
Three Vital Tips
Focusing on efficiency and code reliability is essential while programming for embedded devices. To create reliable software for embedded systems, programmers must stick to established principles such as:
Code Efficiency
Since embedded systems typically run out of resources, it is essential to write code efficiently. In order to provide the best possible performance, programmers should tailor their code to the system’s hardware and software.
Using Various Debugging Strategies
Finding and correcting software bugs requires a range of debugging strategies. There are various debugging strategies, such as stepping through code, creating breakpoints, and inspecting variables.
Testing and Validation
For stable and effective software, testing and evaluation are essential. It is wiser for developers to use numerous strategies, such as unit testing, and system evaluation.
Key Components of Embedded System
There are different hardware and software components that make up an embedded system. Here are the main ones:
Power Source
It is a crucial part of modern ULP designs. In most cases, the range of voltage is between 1.7V and 3.2V. As you would expect, the component’s primary responsibility is to provide energy to a designated circuit inside the embedded system. An appropriate power source must be in line with the needs of the application. It is always best to have a supply that is stable, seamless, and efficient.
Microcontroller
This is the system’s brain and the most crucial element to its efficiency. Given the project at hand, processors and controllers come in a wide range of forms. A computer’s processing unit may be anywhere from 8 to 32 bits.
Timer
Specific embedded software programs incorporate time-based automation capabilities. Therefore, a timer is included in the embedded system. The user’s needs dictate how this part is incorporated into the embedded system.
Input / Output
The input part communicates with the embedded system to do some tasks. As a rule, a sensor will provide this information. The system’s output terminal is where the end product is sent.
Circuitry
Different embedded system parts are linked together via this circuit. When choosing a circuit for an embedded system, it is important to consider the nature of the system’s final use. For instance, if the goal of your system is to take temperature readings, you’ll need a circuit designed for temperature sensors.
Benefits of Embedded Systems
Now that you have a good understanding of embedded systems and how they work, it’s time to see why you need them in the first place. What are the benefits?
Easy Management
General-purpose embedded systems need little in terms of maintenance. These gadgets are low-maintenance since the materials used to construct them are inexpensive and durable.
If your company’s success depends on embedded systems, it may be worthwhile to invest in the technical expertise of an established company.
The technical staff can assist in troubleshooting any program-related issues because the complexity of embedded systems depends on the software utilized.
Quick
Multiple variables affect an embedded system’s efficiency. Optimizing a system’s performance requires developers to meet non-functional constraints such as processing time, power usage, and memory space.
The effectiveness of an embedded system is affected by design scalability and other efficiency metrics. Single-purpose embedded systems are quick and robust.
Small
Embedded systems can be easily handled since they are much more compact than regular computers. Power consumption is reduced for embedded systems given their smaller dimensions.
Because there are fewer components to maintain, the smaller size also improves loading times. Making them in huge numbers guarantees a manufacturer’s scalability. Keep in mind that the loading time will be less if the embedded system is smaller.
Worth the Money
As an added bonus, the hardware rarely needs upgrades like more memory, making it suitable for gadgets of any size.
The user also doesn’t have to physically interact with the embedded gadget. The hardware is cheaper since it is tailored to a single purpose.
The hardware is cheaper, but the system’s reliability and efficiency are still excellent.
Embedded Software Examples in Real Life
With such benefits, there’s no doubt that many industries use embedded software development to bring in more customers. Here are some of the primary sectors that rely on embedded system software:
Transportation
The embedded technology market is dominated by the transportation industry. The transportation and automotive industries heavily utilize embedded applications; thus, let’s investigate this more. The in-car cockpits are a good place to begin.
The primary function of in-car cockpits is to centralize controls in a single, easy-to-use location. These days, it’s common practice to equip vehicles with such an integrated system and a touchscreen, allowing the driver and passengers to control the vehicle remotely.
The cockpits of today’s vehicles are integrated systems that may have many features and configurations. The built-in guidance system is one example. The GPS system’s primary function is to direct the driver from one location to another.
Navigation systems are growing more advanced with the advancement of technology, and now they can include voice help, traffic reports, and more. Turn-by-turn instructions and organizing routes are just some of the features that GPS devices need to include. Other than the navigation system, outstanding examples of integrated technology are the brakes, cruise control, and wipers.
Healthcare
The embedded app development market is dominated by the healthcare industry. The embedded technology is the foundation for many medical equipment. They are programmed to carry out a certain job on a particular machine, at a particular time. They are designed to function with as little human input as possible. Small devices like heart pacemakers or basic blood pressure and pulse monitors may benefit from embedded applications just as much as big ones.
Smart IoT Home
The phrase «Smart Home» describes a modern dream in which every facet of a household’s electronics—including appliances, lights, electricity, and security systems—can be managed remotely. Adding intelligence and autonomy to these devices is also becoming increasingly common as a way to make people’s lives easier. In a nutshell, Smart Home solutions are compatible with everything and everything.
Household electronics were profoundly impacted by the development of embedded technology. Some of them are smart TVs, consoles, and digital cams.
Retail
Keeping up with technological developments is essential for retailers to survive in today’s market. Businesses now must go through a digital revolution if they want to survive in a market that demands constant innovation.
There are several technological channels through which company owners might advance their operations. Embedded applications, such as point-of-sale (POS) systems, are a common solution.
With such devices, businesses can:
get comments from customers
Create and edit customer records
Customize promotional products (like coupons)
Manufacturing
The manufacturing sector makes extensive use of industrial embedded systems, which may be found in a wide range of equipment and application areas. CNC machines and airplanes are only two examples of industries that use embedded applications. Many embedded systems used in this industry serve as the command and control OS for bigger equipment. Each one is set to do unique tasks.
As an example, let’s consider a manufacturing facility. Assembly lines are managed by embedded systems. Embedded systems are utilized for both controlling and monitoring functions. Embedded programs might track variables like temperature, output, pressure, efficiency, and power in a manufacturing setting.
Embedded Software Development: An Outlook
Embedded software has clearly made its way into almost every industry and company. Fast-developing embedded software is a vital factor in the development of more sophisticated electronic gadgets, and its potential uses seem endless.
Embedded software in hardware is what makes IoT devices able to connect to the web. Growing interest from customers is fueling the industry’s meteoric rise, since embedded software is essential to many cutting-edge innovations such as 5G networks, the IoT, and autonomous gadgets based on robotics and AI. Using LANARS’s technologies , you can capitalize on all of these trends.
FAQ
What is an embedded system?
An embedded system is a subset of a larger system that has its own hardware and software to perform a specific task. Microprocessors or microcontrollers are often used to monitor and control various system operations. When you turn on a device with embedded software, the program immediately begins running. The program often operates without human intervention. On the other hand, it is not unusual for an embedded system to feature a user interface that offers external oversight.
What are some challenges in embedded system development?
Although embedded system design is becoming increasingly important, it still faces several challenges that must be solved before it can fully realize its potential. These include problems with security and safety, hardware and software updates, energy use, integration, and validation and testing. It is crucial to prevent unexpected behavior that might put users at risk while designing an embedded system.
Why should we outsource embedded system development to a third-party expert team?
In some cases, companies have enough extra in-house resources and experts to develop an embedded system for their specific needs. But, that’s often a road that requires a lot of effort, headache, and trial and error. An expert third party, on the other hand, already has a track record of developing embedded systems for different companies, and they can do the same for you, with no hassles.
Is it expensive to develop an embedded system?
There’s no specific dollar amount to put on your embedded system development budget because it depends on your specific needs. But, it’s a project that will come with a high ROI.
Embedded software engineering 101: введение
Я запускаю цикл статей по обучению разработке встроенного программного обеспечения. Мы начнем с описания простого микроконтроллера, и после того, как Вы поймете, как он работает, разовьем это до понимания работы относительно сложных систем, таких как Fitbit или Nest.
Я назвал эту серию Embedded Software Engineering 101, и она начинается с этой недели прямо здесь в этом блоге.
Продолжайте читать для дальнейших объяснений и подробностей.

Одни строительные блоки на других строительных блоках.
Я работаю со встроенными системами и разрабатываю микросхемы уже более 14 лет. Мне нравятся встроенные системы — железо, софт и ограничения, которые связывают их вместе.
Любительская электроника и такие идеи, как Arduino, Adafruit и Sparkfun дали возможность легко накидать что-то из железа и софта за выходные (или месяц, или семестр), создав что новое, интересное и может быть даже полезное.
Это здорово! Предоставление людям возможности созидать — изумительная штука; если бы я хотел выражаться выспренно, то с придыханием назвал бы это «демократизирующей технологией».
Большая часть любительских проектов единовременные. Вы собираете нечто, делаете это настолько хорошим, насколько хватает времени или энергии, и двигаетесь дальше.
Я провел свою карьеру на противоположном конце спектра — создавая продукцию, которая выпускается в сотнях тысяч или миллионах или больше экземпляров — и это требует совсем другого образа мышления и системного подхода.
Я хочу учить людей, как писать встроенное ПО для такого рода систем. Я уже давно вынашивал эту идею курса/руководства/книги/блога «Embedded Software Engineering 101», и благодаря блогу Embedded.fm начинаю ее реализацию сейчас.
Я человек фундаментального типа, так что мой план — начать с основ, с простого описания простого микропроцессора, и развивать эту основу, пока вы не поймете, как работает относительно сложная встроенная система.
Моя цель — чтобы к концу этого цикла вы могли разобраться как работает Fitbit, термостат Nest или подобная встроенная система. Вы сможете начать работать со встроенными программными системами используя профессиональный опыт.
Embedded Software Engineering 101 предназначен для:
- Выпускников вузов в сфере компьютерных наук, компьютерной инженерии или электроники, интересующихся встроенными системами.
- Электронщиков-любителей, желающих более глубоко понять, как работает их система на Arduino, и узнать, как им двигаться дальше (и нужно ли!).
- Профессиональных программистов без опыта со встроенными системами, желающих сместиться вниз по технологическому стеку и понимать, как они работают.
- Инженеров, работающих со встроенными системами и желающих понять, чем занимаются их коллеги-программисты.
Так вот, я не Фейнман, но я уверен, что лучший способ понять систему — это начать с основ. Вооруженные этим пониманием, вы сможете создавать простые встроенные системы с простым софтом. И поняв сначала очень простую программу, вы сможете развивать это, создавая более сложное ПО по мере роста опыта.
Основы в первую очередь — это конечно только мое личное убеждение. Множество людей сделали полезные штуки с Ардуино без понимания чего бы то ни было из основ. Этот цикл статей для тех, кто все-таки хочет понимать основы и все, что на них построено.
Конечно мы должны задаться вопросом — где правильный уровень чтобы начать с этих самых «основ»? Транзисторы и логические вентили? Нет, это слишком низкий уровень для старта со встроенным ПО. Подключение к распространенным датчикам? Нет, это слишком высокий уровень, требуется слишком много знаний чтобы начать с этого.
Я думаю правильный уровень основ это встроенный микропроцессор. Не обязательно понимать физику или электронику чтобы использовать встроенный микропроцессор, также не обязательно быть экспертом в программировании.
Так что с этого мы и начнем в следующей статье.
Предупреждение о предвзятости: в прошлой жизни я был архитектором/разработчиком процессоров. Начать этот цикл с понимания как работает ЦПУ может быть не лучшим способом для понимания встроенных систем, но именно так работает мой мозг. Обязательно попробуйте другие курсы/руководства и т.д., если не станете понимать этот после нескольких статей.
Embedded software engineering 101: основы микроконтроллера
Мы начнем наше путешествие Embedded Software Egineering 101 со скромного микроконтроллера. Микроконтроллер (или микропроцессор) это основной строительный блок всех вычислительных систем, встроенных и прочих.
МК кажется довольно сложным, но он состоит из трех простых вещей: инструкции, регистры и память. Инструкции это те штуки, которые микроконтроллер знает как выполнять. Простой МК умеет выполнять не так уж много — у него может быть например 20 или 30 инструкций. В дальнейшем в этом цикле я буду использовать микроконтроллер MSP430 от Texas Instruments, у которого только 27 инструкций.

Просто фотография МК (TI MSP430F5529)
Эти 27 инструкций — единственное, что MSP430 умеет делать. Он может сложить два числа, вычесть из одного числа другое, переместить числа с одного места в другое или выполнить 24 другие простые операции. 27 операций может показаться недостаточно чтобы сделать что-либо полезное, но на самом деле их хватит с избытком, чтобы выполнить любую мыслимую программу.
Хорошо, значит у микроконтроллера есть инструкции, которые делают что-то с числами. Но где находятся эти числа? Регистры и память! Инструкции оперируют числами, которые хранятся в регистрах и памяти.
Регистры это очень быстрое хранилище, содержащее числа, которыми оперируют инструкции. Можно думать о них, как об используемом инструкциями блокноте. МК содержит немного регистров, обычно 8-32. Например, у MSP430 16 регистров.
Память это тоже хранилище для чисел, но она гораздо объемнее и медленнее чем регистры. У микроконтроллера может быть 64 кБ, 256 кБ или даже более 1 МБ памяти. У MSP430F5529 около 128 кБ памяти; это более чем в 8000 раз превосходит количество его регистров!
Прежде чем мы начнем рассматривать примеры, я призываю вас достать лист бумаги и ручку или карандаш и прорабатывать эти примеры по мере чтения. Прорабатывать их на бумаге сложнее, чем просто читать, что я написал. Таким образом вы внимательнее подойдете к процессу, и шансы на запоминание изученного будут выше.
Давайте рассмотрим вымышленный, но характерный пример микроконтроллера.
Пусть скажем у нашего МК 4 регистра и 8 ячеек памяти. Регистры обычно называют как-нибудь креативно, например «R0», «R1» и т.д., поступим и мы так же. На ячейки памяти обычно ссылаются по их номерам, также называемым адресами памяти, начиная нумерацию с 0. Вот так будут выглядеть наши регистры и память:

И теперь я помещу в них некоторые значения:

Теперь нашему вымышленному микроконтроллеру нужны какие-нибудь инструкции.
Совокупность инструкций, которые знает МК, называется его набором инструкций. Пусть скажем в наборе будет три инструкции: ADD (сложить), SUB (сокращение от «subtract» — вычесть) и MOVE (переместить). Инструкции должны получать откуда-то числа, которыми они оперируют, и также помещать куда-то свои результаты, так что некоторые из них содержат информацию о том, где находятся входные и выходные данные.
Пусть, например, у нашей инструкции ADD два источника и один приемник данных, и все они должны быть регистрами. Руководство может описывать эту инструкцию примерно так:
ADD регИст, регПрм
Инструкция ADD добавляет значение регистра «регИст» к значению регистра «регПрм» и сохраняет результат в регистре «регПрм»
Резюме: регПрм = регИст + регПрм
Пример: ADD R1, R2 выполняет операцию R2 = R1 + R2
Это общепринято в инструкциях — использовать один из источников также в роли приемника, как делает инструкция ADD, используя регПрм в качестве и источника и приемника данных.
«ADD R1, R2» — это язык ассемблер для микроконтроллера, это нативный язык программирования МК.
Давайте определим SUB в том же стиле:
SUB регИст, регПрм
Инструкция SUB вычитает значение регистра «регИст» из значения регистра «регПрм» и сохраняет результат в регистре «регПрм»
Резюме: регПрм = регПрм — регИст
Пример: SUB R3, R0 выполняет операцию R0 = R0 — R3
И наконец пусть у инструкции MOVE один источник и один приемник, и либо:
- оба аргумента регистры, либо
- один — регистр и один — ячейка памяти.
1. MOVE регИст, регПрм
2. MOVE памИст, регПрм
3. MOVE регИст, памПрм
Инструкция MOVE копирует данные из аргумента Ист в аргумент Прм.
Резюме: есть три типа инструкции MOVE
1. регПрм = регИст
2. регПрм = мемИст
3. мемПрм = регИст
Пример: я покажу примеры инструкции MOVE ниже в этом посте.
Одно замечание о слове «move», используемом для этой инструкции: большая часть наборов инструкций используют именно его, хотя в действительности данные копируются, а не перемещаются.
Название «move» может создать впечатление, что операнд-источник инструкции уничтожается или очищается, но на самом деле он остается в покое, модифицируется только приемник.
Давайте пройдемся по нескольким примерам используя наш вымышленный микроконтроллер.
На старте наши регистры и память выглядят так:

Теперь выполним на МК следующую инструкцию:
ADD R1, R2
Она берет значение R1, складывает его со значением R2 и сохраняет результат в R2. Процессор выполняет большую часть инструкций за одну операцию, но я разобью выполнение каждой инструкции ADD, SUB и MOVE на несколько шагов стрелкой «=>» ведущей через замены (регистр/память => значение):
R2 = R1 + R2 => R2 = 37 + 100 => R2 = 137
После выполнения этой инструкции память неизменна, но регистры теперь выглядят следующим образом, с изменившимся значением написанным красным:

Обратите внимание, что R1 неизменен; изменился только регистр-приемник R2.
Следующей давайте попробуем инструкцию SUB:
SUB R3, R0
Она берет значение R3, вычитает его из значения R0, и сохраняет результат в R0:
R0 = R0 - R3 => R0 = 42 - 2 => R0 = 40
После выполнения этой инструкции память неизменна, но регистры теперь выглядят таким образом:

И наконец давайте попробуем пару версий инструкции MOVE:
MOVE R2, R0
Эта инструкция MOVE копирует в R0 значение R2:
R0 = R2 => R0 = 137
И теперь регистры выглядят так:

Дальше мы скопируем регистр в память:
MOVE R3, [3]
Эта инструкция MOVE копирует в ячейку памяти 3 значение R3. Квадратными скобками в нашем наборе инструкций обозначаются ячейки памяти.
[3] = R3 => [3] = 2
Регистры неизменны, но память меняется:

И для нашего последнего примера мы скопируем значение из памяти в регистр:
MOVE [6], R0
Здесь значение ячейки памяти 6 копируется в регистр R0:
R0 = [6] => R0 = 1
Память неизменна, а регистры теперь выглядят следующим образом:

Верите или нет, но если вы поняли большую часть того, что мы только что обсудили насчёт инструкций, регистров и памяти, то вы понимаете основы микроконтроллеров и языка ассемблер.
Конечно я опустил множество деталей. Например, как МК получает инструкции для выполнения?
Есть ли более интересные инструкции, чем только простые математические и инструкции копирования? Память это то же самое, что RAM или флэш, или нет?
Мы ответим на эти вопросы в следующей статье.
- embedded software development
- микроконтроллеры
Alljoyn: взгляд embedded разработчика. Часть 1: знакомство
Не сочтите за расовые предрассудки, но в сегодняшней статье понятие «embedded разработка» будет означать разработку и программирование устройств на микроконтроллерах с использованием языка Си, безо всяких процессоров, Linux’ов, Windows’ов, Pyton’ов и прочего «не хардкора». Я намеренно сделал эту оговорку в самом начале, чтобы не пришлось постоянно акцентировать внимание на этом в дальнейшем.
Alljoyn — это протокол взаимодействия между устройствами разрабатываемый альянсом Allseen. В отличии от распространенных ныне протоколов промавтоматики (ModBus, KNX, BacNET и пр.) Alljoyn изначально рассчитан на применение в бытовых устройствах, т.е. тот самый пресловутый Интернет вещей. Причем Alljoyn претендует на статус глобального мирового стандарта и если взглянуть на список комнаний-участников альянса, вполне можно допустить, что его амбиции не безосновательны.
Сегодня мы попытаемся заглянуть за ширму маркетинговых заявлений об «универсальности, кросплатформенности и простоте использования» и понять что же за зверя пытается изобрести группа самых известных IT компаний со всего мира.
Итак, Alljoyn — это фреймворк с открытыми исходными кодами и документацией. Его идея изначально зародилась в компании Qualcomm и со временем переросла в крупный альянс. Физическим транспортом, в теории может служить любая среда передачи данных, при условии, что в качестве транспорта используется стек TCP/IPv4 или TCP/IPv6. Но в реальности, на данный момент используются только локальные сети (ethernet и Wi-Fi). Заявлена поддержка всех основных платформ: Linux, Windows, IOS, Android, а так же возможность портирования на микроконтроллеры.
Разработчиков железа такой подход привлекает тем, что в теории им не нужно заниматься написанием приложений под телефоны и компьютеры для управления исполнительными устройствами — железячник делает устройство и пишет для него прошивку, а различные красивые приложения для айфончика рисуют специально обученные люди. Многие скажут, что подобные попытки создать стандартизированный протокол уже принимались неоднократно, мне лично тут же вспоминается непростая судьба ZigBee. Тут можно только ждать и надеяться, что на этот раз всё удастся.
Топология

Эту картинку можно часто увидеть, когда речь заходит об Alljoyn, и она действительно важна для понимания принципа взаимодействия между устройствами. Как видно есть два базовых блока:
- APP — блок, реализующий бизнес-логику. Это может быть физическое устройство (такое как лампочка, кондиционер или телевизор), предоставляющее свои интерфейсы управления в Alljoyn шину . Так же это может быть приложение на смартфоне или компьютерная программа, которая преобразовывает Alljoyn-интерфейсы в визуальные интерфейсы пользователя (проще говоря, это приложение на телефоне, с помощью которого мы управляем Alljoyn-устройствами). Причем, APP никогда не взаимодействуют друг с другом напрямую, это взаимодействие всегда происходит через Router.
- Router — блок, реализующий взаимодействие между APPs и шиной Alljoyn. Может находиться как одном физическом устройстве с APP, так и на различных.
Теперь постепенно подбираемся к Embedded части. Есть 2 варианта исполнения фреймворка:
- Standard Core — вариант предназначенный для использования в устройствах с операционными системами (смартфоны, компьютеры, телевизоры и пр.)
- Thin Core — версия фреймворка на «чистом» Си для применения во встраиваемых приложениях (а именно в микроконтроллерах).
В рамках данного цикла нас в основном будет интересовать облегченная версия Thin. Так вот в состав Thin-устройства никогда не входит Router. Самым простым примером такого Thin-устройства является «умная лампочка» с Wi-Fi. и реализованным в ней протоколом AllJoyn.
Таким образом, для того чтобы управлять нашей «лампочкой» в сети должен быть хотя бы один роутер, а так как в «лампочке», в соответствии с идеологией AllJoyn, он находиться не может, выходит, что должно существовать отдельное физическое устройство, в котором реализован блок Router. Внимательный читатель, возразит: пусть Router (раз уж это просто отдельный процесс в операционке) будет находиться в телефоне, с которого мы запускаем приложение для управления «лампочкой». Да, в частном случае такой вариант будет работать. Но только в частном.
Во-первых, в телефоне может оказаться «неправильный» Router, который делает «неправильный мёд» и предоставляет услуги роутинга только для APP, находящихся внутри телефона.
На рисунке слева «правильный» Router получает презентационные данные от всех APP вокруг, включая 2 «лампочки» и начинает их презентовать в окружающую сеть и внутрь себя. В результате получаем возможность управлять «лампочками».
На рисунке справа, Router отказывается презентовать «лампочки», он, по задумке разработчика, служит лишь для вывода «наружу» своих блоков APP. Подчеркну, что термин «неправильный» не подразумевает неверное функционирование (разработчик намеренно не наделяет Router подобными функциями), а лишь показывает невозможность непосредственной работы с «лампочками».
Про Windows 10 и AllJoyn
Microsoft является одним из главных членов Альянса и судя по всему делает определенную ставку на AllJoyn. Так, тут на хабре уже была статья по этому поводу. Цитата из указанной статьи:
в Windows 10 включена полная поддержка данного протокола, а именно:
Во-первых, вам не нужно заботиться об AllJoyn-роутере, описанном выше, так как Windows 10 включает специальный сервис AllJoyn Router Service, который может использоваться как вашими приложениями, так и другими устройствами в сети.

К сожалению, в Windows как раз тот самый «неправильный» Router. Он решает главную поставленную перед ним задачу — убрать необходимость написания блока Router в своих приложениях, но не выполняет маршрутизацию сторонних Thin устройств.

Теперь мы можем представить структуру сети, при которой мы получим работающую систему в любом случае, следующим образом:
Т.е. в сети должно находиться некое, всегда включенное устройство, с запущенным на нем блоком Router. И с этим в текущей реализации фреймворка придется жить. В принципе, на практике это не должно быть какой-то серьезной проблемой — Router, как отдельный сервис, можно запускать на физическом роутере или на какой-нибудь RPi.
Общие принципы взаимодействия в сети
- Broadcast сообщения в порт 9956 (устаревший способ, использовавшийся в ранних версиях)
- Multicast сообщения AllJoyn (адрес 224.0.0.113, порт 9956)
- Multicast сообщения mDNS (адрес 224.0.0.251, порт 5353)
События и действия
События и действия – это базовый механизм, который облегчает взаимодействие между приложениями и устройствами alljoyn. Этот механизм позволяет приложениям и устройствам посылать события в сеть, которые будут видеть все остальные устройства сети. Похожим образом приложения и устройства могут «рассказывать» о действиях, которые они могут осуществлять по команде других устройств. Например, датчик движения может посылать событие, если кто-то проходит мимо, а лампочка выполнять по команде извне действие включения. Возможность обнаружения этих событий и действий, позволяет создавать приложение, которое включает свет при срабатывании датчика. Этот простой механизм обнаружения действий и событий позволяет приложениям создавать динамические реакции на события.
Самый простой пример этого механизма — обратная связь: у нас есть 1 лампочка и 2 телефона, которые ей управляют. С первого телефона выключаем лампочку, и на экране второго тут же видим что лампочка выключена.
Проект «Освещение»
Allseen альянс поддерживает и развивает свой протокол. Одним из способов развития являются «рабочие группы», в которых реализуются различные проекты, например, по профилям устройств.
Проект Освещение разрабатывает библиотеку сервисов освещения Lighting Service Framework (LSF), которая реализует открытый и общедоступный способ взаимодействия с устройствами освещения на базе AllJoyn вне зависимости от производителя. Этот проект позволяет производителям устройств освещения создавать устройства, которые могут взаимодействовать друг с другом и с другими устройствами сети AllJoyn, а разработчикам приложений предоставляется API для общения с устройствами освещения от любого производителя.
- Управление состоянием отдельной лампы: включение/выключение, оттенком, насыщенностью, яркостью и температурой цвета
- Управление группами ламп, включая создание, присвоение имен, удаление групп и управление группой как будто это одна лампа
- Сохранение настроек освещения, называемое пресет, позволяя конкретному состоянию лампы быть сохраненным для будущего использования
- Применение эффектов, например, пульсации или перехода из одного состояния в другое в течение некоторого времени
- Создание сцен освещения, включающих в себя отдельные лампы или группы ламп, и необходимые пресеты и эффекты, которые могут быть установлены для создания настроения и атмосферы
Именно на этот профиль мы обратим свой взор в следующей части цикла, когда займемся практической реализацией «умной» лампочки на связке микроконтроллера SAMD21 (Cortex M0) и Wi-Fi модуля WINC1500.
Что есть на данный момент
На сайте альянса есть страница Product Showcase, на которой публикуется список существующего оборудования. Насколько этот список полон и актуален можно только догадываться. Для глобального мирового стандарта, список весьма скромен, но все-таки альянс находится лишь в начале своего пути. Присутствуют тут и различные «умные» лампочки, розетки и т.п. Но если присмотреться к ним на сайтах производителей, то увидим, что AllJoyn реализован как альтернативный протокол в дополнение к своему проприетарному. Одна из причин этого — практически полное отсутствие реальных мобильных приложений для AllJoyn.
DashBoard 14.12. На момент написания данной статьи, по неведомым мне причинам, это приложение было удалено Play Маркета для Android. Приложение представляет собой панель управления для различных AllJoyn устройств.
LSF Sample App. Приложение для Android, реализующее панель управления для лампочек, поддерживающих профиль LSF. На данный момент его можно скачать только в виде apk-файла или исходных кодов с сайта альянса.
Luminaire. Приложение, имитирующее на экране телефона AllJoyn «умную» лампочку. Использует Thin вариант библиотеки. Отличная вещь для отладки, эта лампочка определяется предыдущим приложение (LSF) как реальная лампочка. К тому же в состав Luminaire включен «Правильный» Router, чьими услугами мы воспользуемся в последствии, когда будем делать «умную лампочку в железе». 
- Блог компании Rainbow
- Программирование микроконтроллеров
- Разработка для интернета вещей