Обсуждаем контроллеры компании Atmel.
Ответить

Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 16:42:45

Зачем нужны директивы предпроцессора?
Директивы не транслируются непосредственно в код. Вместо этого они используются для указания положения в программной памяти.
CSEG Программный сегмент Flash
DSEG Сегмент данных RAM
ESEG Сегмент EEPROM
BYTE Зарезервировать байты в ОЗУ
DB Определить байты во флэш или EEPROM (только cseg eseg)
ORG Установить положение в сегменте
DW Определить слова во флэш или EEPROM

Ведь можно то же самое делать при помощи команд.
Поясните пожалуйста где это можно применить? И для чего? Если можно все то же самое делать командами к примеру.
POP, PUSH, RET, SPM, LPM, JMP, CALL, LDS, STS, LD, ST и тому подобное.
Не могу понять для чего нужны директивы.

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 16:55:06

Ведь можно то же самое делать при помощи команд.

При помощи инструкций кода всё делается ВО ВРЕМЯ РАБОТЫ программы в МК. А препроцессинг происходит во время генерации самого кода. Например, директива определения значения константы через ее имя используется для читабельности кода и удобства изменения значения константы при ее многократном использовании в коде. Достаточно изменить #define и препроцессор автоматически подставит вместо символического имени реальное значение во всех местах использования этого символического имени.
Так же директивы препроцессора позволяют управлять самим процессом трансляции текста в бинарный код, создавая возможности для условной трансляции, изменять расположение в памяти программ участков кода, размещать дефолтные (исходные при программировании МК) значения данных в ЕЕПРОМе, выделять память для переменных ну и так далее.
Вы же не будете писать непосредственные адреса переменных в ОЗУ. Вы используете символические имена, а препроцессор выделит память под эти имена и подставит значение адреса в код.

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 17:08:03

Ведь можно то же самое делать при помощи команд.

При помощи инструкций кода всё делается ВО ВРЕМЯ РАБОТЫ программы в МК. А препроцессинг происходит во время генерации самого кода. Например, директива определения значения константы через ее имя используется для читабельности кода и удобства изменения значения константы при ее многократном использовании в коде. Достаточно изменить #define и препроцессор автоматически подставит вместо символического имени реальное значение во всех местах использования этого символического имени.
Так же директивы препроцессора позволяют управлять самим процессом трансляции текста в бинарный код, создавая возможности для условной трансляции, изменять расположение в памяти программ участков кода, размещать дефолтные (исходные при программировании МК) значения данных в ЕЕПРОМе, выделять память для переменных ну и так далее.
Вы же не будете писать непосредственные адреса переменных в ОЗУ. Вы используете символические имена, а препроцессор выделит память под эти имена и подставит значение адреса в код.


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

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 17:12:39

Или бывают ситуации когда написание кода без использование директив невозможно?

Вам нужно заполнить ЕЕПРОМ таблицей данных. Вы как собираетесь это сделать? Вы же не можете значения таблицы записать во время исполнения кода.
Есть определение секций кода. Без них линкер выдаст ошибку, ибо не узнает куда девать ваш оттранслированный код. И что вообще делать с этим кодом.
И причем тут украшательство? Без символических имен практически невозможно написать даже код средней сложности. Вы через пару минут запутаетесь.
Я не понимаю проблемы. Директивы не используют программный флеш МК. Что вас не устраивает?

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 17:18:52

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

дерективы предпроцессора - это просто замены.
Код:
#define LO   0
#define HI   1    

компилятор при генерации кода будет заменять слова "LO" на "0", "HI" на "1".
есть более сложные замены - макросы, но это всё теже замены.

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 17:20:56

дерективы предпроцессора - это

дИрективы прЕПроцессора.

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 17:26:36

Поясните пожалуйста где это можно применить? И для чего? Если можно все то же самое делать командами к примеру.
POP, PUSH, RET, SPM, LPM, JMP, CALL, LDS, STS, LD, ST и тому подобное.
Не могу понять для чего нужны директивы.

Это как спросить: зачем пишут на Си если можно писать на ассемблере. На Си пишут потому что код более читаем, + компилятор делает за вас много работы.

дерективы предпроцессора - это

дИрективы прЕПроцессора.
Видите, вы поняли что написано. :)
Предварительный процессинг -- Пре(д)процессинг .

Re: Зачем нужны директивы предпроцессора?

Чт янв 27, 2022 17:49:52

Видите, вы поняли что написано. :)
Предварительный процессинг -- Пре(д)процессинг .

Из того факта, что можно понять текст с ошибками не следует, что эти ошибки следует делать.
Термины нужно употреблять в том виде, в котором они определены.
Хотя бы для того, чтобы не было путаницы. ПреДпроцессинг - это о другом... :))) :))) :)))

Re: Зачем нужны директивы предпроцессора?

Пт янв 28, 2022 10:34:08

Зачем нужны директивы предпроцессора?
Ведь можно то же самое делать при помощи команд.

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