Почему чип контролирует язык для выбора - PullRequest
3 голосов
/ 18 июля 2010

Я уже задавал вопрос, на каком языке я должен учиться для разработки встраиваемых систем.Большинство инженеров по встраиванию сказали, что c и c ++ необходимы, но также отметили, что это зависит от чипа.

Может кто-нибудь уточнить?Это проблема с компилятором или как?Есть ли в чипах свои специфические компиляторы (например, компилятор ac или компилятор c ++), и поэтому вы должны использовать язык, который знает компилятор?Разве нельзя кодировать и компилировать его где-то еще, а затем записать на чип непосредственно в скомпилированном состоянии?(Кажется, я слышал, как знакомый что-то говорил по этому поводу)

Я не уверен, как это работает, так как явно не знаю много встроенных систем или как они работают.Это, вероятно, легкий ответ для тех из вас, кто знает.

Ответы [ 8 ]

5 голосов
/ 18 июля 2010

Возможно, они имели в виду, что некоторые наборы инструментов не поддерживают C ++.Да, многие фишки и платы поставляются со своими собственными наборами инструментов.Разные процессоры имеют разные наборы команд, что означает разный компилятор (или, точнее, другой бэкэнд).Это не значит, что вы всегда должны заново учиться.Многие из них основаны на GCC (часто считается наиболее портированным компилятором).Окончательные форматы исполняемых файлов и изображений также могут различаться, поэтому вам необходим конкретный компоновщик.Скорее всего, вы будете (перекрестно) компилировать чип на «обычном» компьютере, а затем записывать его на чип.Однако это не означает, что вы можете использовать типичный компилятор и компоновщик, ориентированный на настольную операционную систему.

3 голосов
/ 21 июля 2010

Он «зависит от чипа» тремя возможными способами:

  1. Некоторые очень ограниченные архитектуры не подходят для C ++ или, по крайней мере, C ++ предоставляет конструкции, не подходящие для таких архитектур, поэтому предлагаетникакой выгоды по сравнению с C. Большинство 8-битных устройств попадают в эту категорию, но далеко не все;Например, я видел полезный код C ++, реализованный в MegaAVR.

  2. Некоторые устройства не поддерживаются компилятором C ++.Например, компилятор Microchip dsPIC / PIC24 предназначен только для C (сторонние инструменты могут иметь поддержку C ++).

  3. Архитектура чипа разработана специально для конкретного языка;например, INMOS Transputers неизменно запускал OCCAM.

Помимо C, C ++, другие возможности - ассемблер, Forth, Ada, Pascal и многие другие, но C почти повсеместен;Немногие производители чипов выпустят новую архитектуру или устройство без компилятора C, доступного с первого дня.Для других языков вам, как правило, придется ждать, пока третья часть решит его разработать, и это ожидание может быть навсегда для нишевой архитектуры.

Разве нельзя кодировать и компилировать ее где-то еще,затем записать его на чип непосредственно в скомпилированном состоянии?

Это называется кросс-компиляцией или кросс-разработкой и является обычным методом разработки для встроенных систем.Большинству встроенных систем не хватает ресурсов ОС, файлов, производительности и памяти для самостоятельного размещения компилятора, и большинству разработчиков нужна комфортная среда разработки с интегрированными средами разработки, отладчиками и т. Д. В знакомой ориентированной на пользователя настольной ОС.

Я не уверен, как это работает, так как ясно, что я не знаю много встроенных систем или как они работают.

Освойте некоторые из них:

2 голосов
/ 18 июля 2010

Вы правы: у чипов есть вариации на компиляторах. Большинство / многие современные чипы имеют порт gcc; но не все.

2 голосов
/ 18 июля 2010

Да, есть много архитектур, для которых существует компилятор C, но нет компилятора C ++.Чем меньше и менее полнофункциональный процессор вы выберете, тем выше вероятность возникновения такой ситуации.

Для встроенной разработки вы почти всегда компилируете код «в другом месте», как вы говорите, и затем отправляете его вчип для исполнения / отладки.Процесс компиляции кода для архитектуры, отличной от той, для которой построен сам компилятор, называется кросс-компиляцией.

1 голос
/ 31 июля 2010

Нет прямой научной причины для этого. Во многих случаях это связано с управлением и политикой конкретной компании.

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

Другие компании не имеют персонала или таланта и используют решение на стороне и иногда берут все, что могут получить. И у вас может получиться одноразовый инструмент, который после увольнения подрядчика никогда не обновляется и не исправляется, или, если он исправлен, это кто-то другой - исправление. Чтобы заработать деньги, нужны деньги, но если у вас закончились деньги, прежде чем вы сможете продать свой продукт, у вас все равно не получится.

Иногда у вас есть компании, в которых есть сотрудники, которые имеют свой штат, должны покупать у них инструмент И есть люди, которые также участвуют в открытых инструментах, таких как gcc.

Иногда в политике или руководстве компании есть люди, которые твердо убеждены в том, каким должен быть мир, и позволяют разрабатывать инструменты только для конкретного языка. Или, возможно, они принадлежат или являются партнером или просто компанией, у которой есть определенный язык, и этот чиповый продукт просто предназначен для поддержки этого языка.

Вдобавок ко всему этому у вас есть очень реальные технические проблемы с объемом памяти, качеством и эффективностью набора команд, а также с тем, насколько он удобен для компилятора. Некоторые архитектуры могут подойти ассемблеру, но скомпилированный код более высокого уровня слишком быстро уничтожает ограниченные ресурсы памяти.

В частности, у Gcc много внутренних проблем (не как людей, а как самого программного обеспечения / исходного кода). Я призываю вас написать бэкэнд, даже с учебниками, которые есть. Компании требуются специальные таланты для того, чтобы год от года создавать и поддерживать gcc-сервер, в противном случае вас бросают. если ваша архитектура чипов не 32-битная или больше, вы уже сражаетесь с gcc, ваша архитектура чипов может быть дружественной к компилятору, но просто не дружной с популярной конструкцией компиляторов.

В ближайшем будущем llvm будет светить как кросс-компилятор по отношению к gcc, потому что он еще не создал эту внутреннюю массу, и, возможно, поскольку внутренние кишки сами по себе являются определенным языком / системой, он может никогда не пострадать от того, что случилось с НКА. По мере того, как все больше людей будут чувствовать себя комфортно с llvm, мы увидим несколько архитектур, перенесенных на него. Серверная часть msp430 была сделана специально, чтобы продемонстрировать, что вы можете добавить цель буквально во второй половине дня. К концу следующего месяца у некоторых мотивированных людей все цели, о которых большинство из нас когда-либо слышали, были перенесены на llvm. И вам не нужно создавать кросс-компилятор, это всегда кросс-компилятор. Я упоминаю llvm только потому, что теперь дверь открыта для целей, которые пострадали от плохих инструментов для восстановления.

Некоторые компании, в частности микроконтроллеры, могут и будут делать интерфейс программирования проприетарным, чтобы вы могли использовать их инструмент программирования (или взломать его и рискнуть, публикуя эти результаты, или или просто изменить их на победить тебя). И они, возможно, сделали только инструменты для Windows, оставив людей Linux и Apple зависшими на ветру. Или они делают так, чтобы единственные загружаемые им двоичные файлы были сгенерированы их инструментами, и здесь вы снова можете взломать двоичный формат, разрешив альтернативный компилятор, и они могут или не могут победить вас.

Несмотря на технические проблемы, самая большая из них - это политика компаний, менеджмент, маркетинговые команды, а также наличие или недостаток талантов в инженерном персонале.В итоге, следуйте долларам, а не технологиям или науке, чтобы понять, почему этот язык поддерживается, а не тот, или поддержка этого языка хорошая, плохая или незначительная.

Какой язык выучить в результатевсего этого?Начните с ассемблера как минимум на трех разных архитектурах.Затем C и C ++, если вы чувствуете, что вам это действительно нужно.C и ассемблер являются вашими основными языками для встроенных (в зависимости от вашего определения встроенного).Нет, мы пишем ассемблер в основном для начального загрузочного кода и для поддержки C, прерываний или специальных инструкций, которые необходимы компилятору.В таких местах, как микроконтроллеры, вполне может иметь смысл использовать ассемблер по разным причинам, таким как инструменты, ограниченные ресурсы микросхем и т. Д. Даже если вы не используете ассемблер, зная, что это делает вас гораздо лучшим программистом высокого уровня.

Вам нужно решить, каково ваше определение встроенного.Будут ли API и библиотечные вызовы приложения в (n встроенной) системе Linux (неотличимы от той же программы / вызовов в настольной системе).Или на другом конце спектра вы говорите о микроконтроллере с 256 или 1024 байтами (не мега или гига, а байтами) программного пространства?Или что-то посередине?Большинство «встраиваемых» людей ближе к API-вызовам для приложений в операционной системе (rtos, linux, wince и т. Д.), Чем глубоко внедренные, так что это означает C, может быть C ++ (всегда может падатьвернемся к C), пытаясь избежать Python и других языков сценариев, которые являются боровами ресурсов.

1 голос
/ 31 июля 2010

C / C ++ - очень хороший выбор для разработки прошивки.Таким образом, созданное вами программное обеспечение будет работать на встроенном процессоре / микроконтроллере.Чтобы правильно программировать устройство, вам необходимо знать язык и архитектуру устройства.

Один и тот же код, вероятно, не будет работать на разных устройствах.Итак, вам нужно выучить язык и архитектуру устройства.

Другие варианты - это ПЛИС, которые не являются микроконтроллерами.ПЛИС - это устройства со специализированной ячейкой, способные преобразовывать себя в любой тип синхронной схемы, включая микроконтроллер.FPGA запрограммированы с помощью языков описания аппаратного обеспечения, таких как Verilog и VHDL.«Скомпилированная» (синтезированная) версия программного обеспечения называется шлюзом.

HDL - это те же языки, что и для ASIC.Путь к правильному изучению языка длинный.Поэтому я рекомендую начать с C / C ++ с pic-формы Microchip, которая является недорогим и широко принятым микроконтроллером.

Если вы собираетесь заниматься разработкой на ПЛИС, знания, полученные с помощью C / C ++ / pic, будут полезны иважно, потому что FPGA должны иметь встроенный процессор / микроконтроллер внутри.

1 голос
/ 18 июля 2010

Термин «встроенный» используется для описания широкого спектра оборудования.Большая часть разработки встроенного программного обеспечения будет состоять из написания кода C / C ++ для создания двоичного файла для целевого микропроцессора, но есть устройства, с которыми вы можете работать, которые не кодированы скомпилированным двоичным файлом.

Одним из примеров является программируемая логикаКонтроллер (ПЛК).Эти устройства используют язык под названием « Ladder Logic ».Это прекрасный язык.Мне нравилось работать с ним в прошлом.

Еще одна вещь, с которой вы можете столкнуться, как и в прошлом, это устройства, которые интерпретировали эмуляторы BASIC.Надеюсь, это редкость сегодня.

0 голосов
/ 02 августа 2010

Некоторые 8-битные части не могут эффективно обращаться к данным из стека.Вместо использования стека для передачи параметров, авто-переменные и параметры размещаются статически;как правило, компоновщик выделяет автоматические переменные для main () на одном конце памяти, а затем выделяет переменные для функций, которые вызываются main и ничем иным, затем выделяет переменные для функций, которые вызываются этими функциями, и ничего больше,и т. д. Это довольно легко приведет к оптимальному распределению при условии некоторых оговорок:

  1. Рекурсия может поддерживаться только путем добавления кода для явного копирования переменных в какой-либо вид стека;во многих компиляторах это просто не поддерживается вообще.
  2. Если функция выглядит так, как будто она «может» вызывать другую функцию, компоновщик будет предполагать, что она может делать это во всех случаях (например, может случиться так, что когда «foo» вызывает «bar», один из ее параметров всегда может иметьзначение, такое, что 'bar' не будет вызывать 'boz', но компоновщик этого не узнает).
  3. Любой вызов указателя функции с определенной сигнатурой будет рассматриваться как вызов всех функций с той же сигнатурой, адрес которой взят.
  4. Если для оценки более одного параметра функции требуется выполнить дополнительные вызовы функций, дополнительное временное хранилище обычно должно выделяться пессимистично, даже если оптимальное размещение хранилища параметров могло бы этого избежать.

Существует много типов программ на C, для которых вышеупомянутые ограничения не представляют никакой проблемы, и для многих других они создают неудобства, но не огромные (например, путем добавления фиктивных параметров или возвращаемых значений для обеспечения различныхклассы косвенно вызываемых функций имеют разные сигнатуры).К сожалению, код, сгенерированный прекомпилятором C ++ к C, почти всегда будет включать указатели на функции, чей граф вызовов не может быть разумно предсказан, поэтому использование C ++ на такой платформе может быть трудным, если не невозможным.

...