23.02.2018, 12:31
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Препроцессор, линкёр...
akegor, таки лучше заложить основы в концепции от авторов, усугубить особенностями конкретной среды и пользоваться.
Личные особенности лучше не привносить - сложнее будет с библиотеками и чужим кодом работать.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
23.02.2018, 12:42
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,121
Сказал спасибо: 2,569
Сказали Спасибо 11,944 раз(а) в 5,991 сообщении(ях)
|
Re: Препроцессор, линкёр...
mike-y-k, так об этом жеж и говорю - "сначала читать".
Про личные - если для себя, то как удобней. Если в компашке - лучше единая генеральская линия. А если понял, что почем, то никакой разницы, особенно, в современных ИДЕ, которые подсказывают где и что лежит.
Просматривая чужие варианты, пришел к тому, что у каждого (индивидуала или коллектива) свой стандарт и подходы. В мелочах, конечно. И этот стандарт позволяет работать "на автомате", не отвлекаясь по мелочам.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
23.02.2018, 16:54
|
|
Гражданин KAZUS.RU
Регистрация: 22.07.2007
Адрес: Владивосток
Сообщений: 984
Сказал спасибо: 435
Сказали Спасибо 375 раз(а) в 197 сообщении(ях)
|
Re: Препроцессор, линкёр...
Сообщение от akegor
|
Несогласен относительно начальных значений. Начальные значения в заголовочном файле удобней. Типа паблика в плюсах. Но тут тоже надо делать разницу между "текущими" (проще модифицировать) и "типа библиотечными" или стандартными из набора среды разработки (или стандартных библиотек к чипу) - там нехрен ковыряться, можно только посмотреть.
|
Тут вы правы в части того, что я упустил про константы. Очень часто в заголовочных файлах содержится множество констант. Обычно в виде #define. Но переменные - нет. Переменные должны быть объявлены extern, т.е. определяться (и инициализироваться) в другом месте. Т.е. в заголовке можно написать
extern int power;
но не
int power = 127;
или
int power;
|
|
|
|
03.03.2018, 20:53
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Препроцессор, линкёр...
По просьбе топикстартера.
Касательно вообще структуры проекта, инклюдов и связей. В общем случае, схема решаемой задачи будет такова:
То есть, есть main, из которого запускается инит хардвара самого МК, портов, из него же посылается команда включения дисплея, и из него же отправляются в дисплей какие-то сообщения, а так же в этот же main приходят дешифрованные нажатия кнопок клавиатуры, уже в виде конечных действий.
Формированием строки сообщения занимается модуль io, относящийся к категории middleware. Этот же модуль распознает нажатые кнопки. Классически, это функции printf и scanf, подогнанные по реализации непосредственно под текущую задачу.
Ну а управляет дисплеем драйвер дисплея. Причем он поделен на два уровня - верхний уровень формирует управляющие комбинации, а нижний уровень непосредственно передает сигналы на порты МК.
Однако, в зависимости от дисплея и от МК, можно не разделять на два уровня, а вполне обойтись одним.
Та же ситуация и с клавиатурой. В зависимости от реализации клавиатуры и требуемой универсальности, могут различаться и уровни разделения функционала. Самый нижний уровень всегда работает непосредственно с портами и обеспечивает распознавание нажатий кнопок. Уровень повыше координирует работу низкого уровня, выдавая команды "проверить состояние ног", и исходя из их состояния, решает вопрос о том, была ли нажата кнопка, фильтрует дребезг и фиксирует факт срабатывания кнопки, передавая на более высокие уровни код нажатой кнопки.
Подводя итог схемы, можно сказать, что если из main нам надо вывести в дисплей что-то, то мы можем написать printf("Voltage: %d", value); а дальше модуль io самостоятельно составит массив значений в формате интерфейса дисплея, самостоятельно переведя числовой тип value в последовательность ANSI, и затем через драйвер дисплея подергает ножками в нужном порядке, выводя полную строку.
Это - наиболее универсальный способ, при котором строка printf вообще не зависит от того, какой конкретно дисплей подключен - хоть двустрочник, хоть графический TFT или OLED.
Я как бы не знаю, надо ли писать и выкладывать программные тексты, поскольку не уверен, поймет ли затею топикстартер. Да и задача абстрактная. Да и еще тот факт, что я работаю в другой среде разработки и вообще с другими МК, отчего аппаратные особенности отличаются. В том числе и вообще по способу написания кода, да и по реализации даже высокоуровневых функций.
Тут вроде бы уже писали, что такое заголовочники и интерфейсы модулей.
Правда, как я заметил, некоторые представители "старой школы" (или как их еще назвать?) любят спихивать все заголовочники в один бальшой-пребальшой заголовочник и пихать его куда попало.
Как я уже писал в соседней теме, особенность языка Си не позволяет на уровне языка управлять связями, отсюда видимо и родился стиль пихания куда попало без разбора в одну кучу. Он не является ошибочным на уровне языка, язык это просто не отслеживает, но ошибочный он именно по логике.
Хотя... наверно именно из-за отсутствия жесткого контроля со стороны языка и появилось столько вариантов написания проги. И нельзя однозначно сказать, какой из вариантов более правильный.
Вобщем, тут ваапсче... я так подумал, что просто нет смысла приводит один вариант. Пишите так, как вам понятнее. В любом случае, это вы поймете сами после набивания собственных шишек.
PS. Касательно названия темы.
Строго говоря, препроцессор - это расшифровыватель всяких #define, #ifdef, макросов, typedef, вобщем, текстовых замен и переопределений.
А линкер - это формирователь объектных файлов, отслеживающий связи между файлами, ищущий все вхождения, ссылки.
Ну и еще есть непосредственно компилятор, который просматривая слинкованные объектные файлы, переводит текст на языке Си в машинные коды согласно набору инструкций МК.
И еще есть скрипты загрузчика, по которым распределяется память ОЗУ и ПЗУ, определяются адреса и способы хранения.
Последний раз редактировалось NewWriter; 03.03.2018 в 21:22.
|
|
|
|
04.03.2018, 05:15
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Препроцессор, линкёр...
Сообщение от NewWriter
|
А линкер - это формирователь объектных файлов
|
А я всегда думал, что линкер - это "формирователь" единой программы из уже имеющихся объектных файлов. А "формирователями" объектных файлов являются компилятор и ассемблер. Или нет?
|
|
|
|
04.03.2018, 13:10
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
|
Re: Препроцессор, линкёр...
Перед утверждениями некоторым стоит просто даже в wiki заглянуть .
Препроцессор - обработчик дополнительны инструкций, преобразующий их в код для компилятора.
Компилятор (ассемблер его разновидность) - преобразователь исходного кода в машинные команды в объектном коде.
Линкер - сборщик объектного кода в исполняемый код нужного формата. Тут уже и сами исполняемые файлы, и динамические библиотеки, и прошивки,…
А по вопросу о структуре кода и содержимом файлов заголовков стоит для образования посмотреть несколько проектов на GitHub, kernel.org,… желательно с большими коллективами разработчиков.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
04.03.2018, 19:04
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Препроцессор, линкёр...
Гыыы.. Да я специально наоборот написал, чтобы проверить, не вымерли ли еще тут люди, шарящие в тематических вопросах ))) А то форум совсем задохся, как я вижу. Только с Алегиром вон бодаются извечно, да политику мусолят, и всё так же обсуждают старенький копировщик домофонных ключей
|
|
|
|
04.03.2018, 19:10
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,121
Сказал спасибо: 2,569
Сказали Спасибо 11,944 раз(а) в 5,991 сообщении(ях)
|
Re: Препроцессор, линкёр...
Сообщение от NewWriter
|
специально наоборот написал, чтобы проверить
|
как проверяют написанное. Как-то, большого желания не возникло читать длинную портянку о том, что и так давным-давно...
Значит - надо проверять шутников, а то вопрошающие примут хрень
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 06.03.2018 в 08:33.
|
|
|
|
06.03.2018, 06:43
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Препроцессор, линкёр...
Сообщение от NewWriter
|
Гыыы.. Да я специально наоборот написал, чтобы проверить, не вымерли ли еще тут люди, шарящие в тематических вопросах ))) А то форум совсем задохся, как я вижу. Только с Алегиром вон бодаются извечно, да политику мусолят, и всё так же обсуждают старенький копировщик домофонных ключей
|
Т.е. ваше длиннейшее "спаслание" - всего лишь шутка?
|
|
|
|
06.03.2018, 08:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Препроцессор, линкёр...
Сообщение от Bill
|
Т.е. ваше длиннейшее "спаслание" - всего лишь шутка?
|
Да опиСался он))
А оправдание про проверку - эт пародия на нашего местного юродивого Алегюра, который глупые вопросы задает, оказывается, чтоб проверить, есть ли ещё на форуме спецы, или он самый крутой
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:06.
|
|