Разрабатываются как микросхемы, так и готовые устройства радиоэлектронной аппаратуры. Также выполняются работы по разработке корпуса устройства, 3. D моделирования, расчты тепловых режимов, расчты наджности радиоэлектронных устройств и СБИС. Имеется полный инструментарий для разработки СБИС по технологическим проектным нормам 4. За время работы компанией разработаны и изготовлены микросхемы на базе микропроцессорных ядер ARM9, ARM Cortex M4, ARM Cortex M0, SPARC v. ATMEGA1. 02. Производственные мощности включают в свой состав современную линию по сборке печатных плат и участок механической обработки. Имеется свидетельство на товарный знак. Как сделать свой С код кроссплатформенным Ведь С кроссплатформенный язык. В целом, это так А вдруг это расширение моего компилятора. Они пишут код, запускают сборку и чинят места, на которые выругался их компилятор. В итоге получаем приложение, которое, в некоторой степени, заточено под конкретный компилятор и даже под его конкретную версию и целевую ОС. Более того, из за скудности стандартной библиотеки С некоторые вещи просто невозможно написать, не воспользовавшись специфичным API системы. Так было и у нас в Тензоре. Гигапром, ООО, ИНН 7721731465, КПП 772101001, ОГРН 1117746594327. Адрес Москва г, ул. Газгольдерная, д. Реквизиты, телефон, почта email. Мы писали на MS Visual Studio 2. Наши продукты были 3. Windows приложениями. И, само собой, код был пронизан всевозможными завязками на технологии от Microsoft. Однажды мы решили, что пора осваивать новые горизонты пора научить СБИС работать под Linux и другими ОС, пора попробовать перейти на другое железо POWER. В данном цикле статей я расскажу, как мы сделали свои продукты настоящими кроссплатформенными приложениями как заставили их работать на Linux, Mac. OS и даже под i. OS и Android как запустили свои приложения на множестве аппаратных архитектур x. Http Анализатора Сбис' title='Http Анализатора Сбис' />POWER, ARM и другие как научили работать на big endian машинах. Основа всех наших продуктов собственный фреймворк Платформа СБИС далее по тексту Платформа, который по масштабности сравним с Qt. В платформе есть практически все, что нужно разработчику от простых функций быстрого преобразования числа в строковую форму до мощного отказоустойчивого сервера приложений. На базе Платформы наши разработчики реализуют свои продукты даже мобильные приложения, решающие всевозможные бизнес задачи. Нам хотелось освободить их код далее по тексту будем называть их код прикладным от всевозможных завязок на целевую программную и аппаратную платформу, спрятав всю специфику в глубинах нашего фреймворка. Платформа СБИС написана на С, но это вовсе не ограничивает прикладного программиста в выборе языка, кроме C могут быть использованы Java. Script, Python, SQL. Наша компания активно развивает свои продукты, поэтому нужно было чинить поезд на полном ходу. Нужно было работать так, чтобы остальные разработчики не пострадали от нашей деятельности и с комфортом продолжили разрабатывать свой функционал под Windows на MSVC. Это требование сильно повлияло на многие технические решения и сильно усложнило работу. Для того чтобы у читателя сформировалось представление о масштабности работ, я приведу некоторые цифры Объем кода нашего фреймворка 2 миллиона строк. Объем прикладного кода код, основанный на платформе СБИС, решающий конкретные бизнес задачи, сложно оценить, но он в разы превышает объем Платформы. Платформа СБИС написана на С, но это вовсе не ограничивает прикладного программиста в выборе языка, кроме C могут быть использованы JavaScript. То есть, как только мы захотели сделать простейший HTTPзапрос, мы вынуждены написать некроссплатформенный код Я смотрел в справочнике Микроконтроллеры AVR семейства Mega. SBICSBIS, ограничения там к сожалению не указаны. Не подскажете как называется Ваш справочник где. Свыше тысячи программистов в десяти центрах разработки. Скучное вступление закончено. Теперь приблизимся к делу и рассмотрим, с какими проблемами мы столкнулись. Использование API операционной системы. Как упоминалось выше, стандартная библиотека С очень скудная, она не включает многих всюду необходимых возможностей. Например, в С1. Есть несколько способов Пишем свой класс, с несколькими платформоспецифичными реализациями, основанными на вызовах API целевой системы. Во время сборки препроцессорными директивами ifdef выбираем подходящую реализацию. Используем кроссплатформенные библиотеки есть множество готовых кроссплатформенных библиотек опять же, использующие внутри себя платформоспецефичные реализации, которые сильно облегчают нашу задачу. Например, для реализации HTTP клиента мы взяли c. URL. Особенности реализаций компиляторов. В каждой программе есть ошибки. Исследование и разработка конструктивнотехнологических методов повышения радиационной стойкости глубокосубмикронных СБИС с помощью. НПО ИНТЕГРАЛ, предназначенных для условий работы в космических летательных аппаратах. Приобрести дополнительные лицензии и сопровождение на требуемое количество рабочих мест АРМ 407П, а также лицензию для Сервера блокировок и сообщений СБИС. Осуществить перевод БД MS Access на СУБД MSSQL или СУБД ORACLE инструкция предоставляется. Установить обновление. И компилятор тоже не исключение. Поэтому даже на 1. Стандарту код может не собраться на каком то компиляторе. Так же практически все разработчики компиляторов считают своим долгом добавить в сво детище возможностей, не предусмотренных Стандартом, и тем самым провоцируют программистов к написанию непереносимого кода. Что получаем в итогеКод, который написан четко по Стандарту, может не собраться на каком то компиляторе код, который компилируется и работает на одном компиляторе, может не собраться или заработать не так на другом. Вот одна из них throw std exception. В этих случаях помогает только опыт, накопленный при изучении используемых в работе инструментов, и хорошее знание Стандарта С. В последующих статьях я вернусь к этому вопросу, подробно опишу наиболее часто встречающиеся проблемы и предложу методы их решения. Неопределенное поведение. В Стандарте С есть интересный термин undefined behavior неопределенное поведение. Вот его определение из Википедии Неопределнное поведение англ. Другими словами, спецификация не определяет поведение языка библиотеки, микросхемы в любых возможных ситуациях, а говорит при условии А результат операции Б не определн. Инструкция Whirlpool Awg 875 D здесь. Допускать такую ситуацию в программе считается ошибкой даже если на некотором компиляторе программа успешно выполняется, она не будет кроссплатформенной и может отказать на другой машине, в другой ОС или при других настройках компилятора. Если вы допустите undefined behavior в своей программе, то это вовсе не значит, что она будет падать или выдавать какие то ошибки в консоль. Такая программа вполне может работать ожидаемым образом. Но любое изменение настроек компилятора, переход на другой компилятор или на другую версию компилятора, или даже модификация любого фрагмента кода может поменять поведение программы и все сломать Многие ситуации с undefined behavior на одном конкретном компиляторе выдают стабильно одинаковое поведение, и ваше тщательно оттестированное приложение будет работать как швейцарские часы. Но как только мы меняем окружение например, пытаемся запустить программу, собранную другим компилятором, эти баги начинают заявлять о себе и полностью ломают программу. Классический пример undefined behavior это выход за границы массива на стеке. Ниже приведен упрощенный фрагмент кода одного из наших приложений с такой проблемой. Этот баг никак не проявлял себя под Windows в течение нескольких лет и выстрелил только после портирования под Linux std string Some. Function. А в GCC проблема стала проявляться интересным образом программа падала далеко от этого кода, в другой функции видимо, GCC заинлайнил эту функцию, и она стала переписывать локальные переменные другой функции. Есть и более изящные, трудноуловимые ситуации с UB. Например, на очень интересные грабли можно наступить при использовании std sort std vectorlt std string v someА все дело в плохом компараторе. Рассмотрим, что выдаст наш компаратор, если ему на вход подать две пустые строки s. Следовательно, мы нарушили требования std sort к аргументам и получили неопределенное поведение. И это не придуманный пример. Такую проблему мы поймали при переходе на Linux. Компаратор с подобной ошибкой работал долгие годы под Windows и. Что интересно, баг ведет себя по разному даже на разных дистрибутивах Linux с разными GCC на борту где то приложение падает, где то зависает, где то попросту сортирует не так, как ожидалось. Зачастую ситуации с undefined behavior можно отловить статическими анализаторами в том числе и встроенными в компилятор. Поэтому в настройках сборки стоит всегда выставлять максимальный уровень предупреждений. А чтобы не потерять полезный warning в толпе предупреждений вида неиспользуемая переменная, полезно однажды прибраться в коде, после чего включить опцию сборки трактовать предупреждения как ошибки, чтобы не допустить появления новых незамеченных предупреждений.