Существует ли какой-либо специальный стандарт C для микроконтроллеров?
Нет, существует стандарт ISO C.Поскольку многие небольшие устройства имеют специальные особенности архитектуры, которые необходимо поддерживать, многие компиляторы поддерживают языковые расширения.Например, поскольку 8051 имеет ОЗУ с битовой адресацией, может быть предоставлен тип данных _bit
.Он также имеет Гарвардскую архитектуру , поэтому предусмотрены ключевые слова для указания различных адресных пространств памяти, которые один адрес не разрешает, так как для адресации этих пространств требуются разные инструкции.Такие расширения будут четко указаны в документации компилятора.Кроме того, расширения в соответствующем компиляторе должны начинаться с подчеркивания.Тем не менее, многие предоставляют неукрашенные псевдонимы для обратной совместимости, и их использование не рекомендуется.
... когда я что-то программировал под ОС Windows, не имеет значения, какой компилятор я использовал.
Поскольку Windows API стандартизирован (Microsoft), и он работает только на x86, поэтому не нужно учитывать никаких архитектурных изменений.Тем не менее, вы все равно можете увидеть макросы FAR и NEAR в API, и это возврат к 16-битному x86 с его сегментированной адресацией, что также требует обработки расширений компилятора.
... что даже это по-прежнему C в его основах, таких как циклы, создание переменных и т. Д.,
Я не уверен, что это значит.Типичное приложение микроконтроллера не имеет ОС или простого ядра, вы должны ожидать, что вы увидите гораздо больше кода «на голом железе» или «системного уровня», потому что не существует обширных API-интерфейсов ОС и интерфейсов драйверов устройств, которые могли бы выполнять большую работу подкапюшон для вас.Все эти библиотечные вызовы - только это;они не являются частью языка;это тот же язык Си;только для другой работы.
... есть некоторый тип синтаксиса, который я никогда не видел в C для настольных компьютеров.
Например ...?
И, кроме того, синтаксис меняется от версии к версии.
Я сомневаюсь в этом.Снова;например ...?
Я использую компилятор AVR-GCC, а в предыдущих версиях вы использовали функцию для ввода / вывода порта, теперь вы можете обрабатывать порт как переменную в новой версии.
Это связано не с изменениями в языке или компиляторе, а, скорее, с простой «магией препроцессора».На AVR все операции ввода-вывода отображаются в памяти, поэтому, если, например, вы включите заголовок поддержки устройства, он может иметь объявление, например:
#define PORTA (*((volatile char*)0x0100))
Затем вы можете написать:
PORTA = 0xFF;
для записи 0xFF в память, отображенную в регистре по адресу 0x100.Вы можете просто взглянуть на заголовочный файл и посмотреть, как именно он это делает.
Документация GCC описывает конкретные конкретные варианты;AVR конкретно рассматривается в здесь в разделе 6.36.8 и в 3.17.3 .Если сравнить это с другими целями, поддерживаемыми GCC, у него очень мало расширений, возможно, потому, что архитектура AVR и набор команд были специально разработаны для чистой и эффективной реализации компилятора C без расширений.
Чтоопределяет, какие функции и как сделать так, чтобы они были реализованы в компиляторе и при этом назывались C?
Важно понимать, что язык программирования C - это отдельная сущность из его библиотек, ичто функции, предоставляемые библиотеками, ничем не отличаются от тех, которые вы можете написать сами - они не являются частью языка - так что это может быть C без какой-либо библиотеки.В конечном итоге библиотечные функции написаны с использованием одних и тех же базовых языковых элементов.Вы не можете ожидать, что уровень абстракции, скажем, в Win32 API будет существовать в библиотеке, предназначенной для микроконтроллера.В большинстве случаев можно ожидать, что будет реализовано как минимум подмножество стандартной библиотеки C , поскольку она была разработана как библиотека системного уровня с несколькими целевыми аппаратными зависимостями.
Я писал C и C ++ для встраиваемых и настольных систем в течение многих лет и не осознаю огромных различий, которые вы, похоже, чувствуете, поэтому могу только предположить, что они являются результатом неправильного понимания того, что составляет язык C.Следующие книги могут помочь.