Нескольно простых вопросов о программировании AVR на Си.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Z_h_e »

Создать заголовочный файл для переменных.

Код: Выделить всё

#ifdef MAIN_C
#define MAIN_EXTERNAL
#else
#define MAIN_EXTERNAL extern
#endif // MAIN_C

//переменные
MAIN_EXTERNAL type var;


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

Код: Выделить всё

#define MAIN_C
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
ozonn
Вымогатель припоя
Сообщения: 522
Зарегистрирован: Чт янв 21, 2016 15:59:10

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ozonn »

спасибо :)
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3818622#p3818622"]KorbenDallas, не говорите ерунды. Обычный C, с ассемблерными вставками. Ну и ещё идиотскими отступами по коду.[/uquote]

Нет. Никакой ерунды. В языке С на уровне файла не допускаются инициализации вида

Код: Выделить всё

const int A = 42;
const int B = A;  /* <- Ошибка: инициализатор должен быть константным выражением! */


Переменные, объявленные с `const`, в языке С (в отличие от С++) не являются константами времени компиляции и не могут быть использованы там, где требуются константные выражения. В частности, `const` переменные не могут быть использованы для инициализации переменных со статическим классом хранения, то есть не могут быть использованы для инициализации других переменных уровня файла.

Вышеприведенный код (как и код автора вопроса) принимается компиляторами группы GCC/Clang только в качестве нестандартного расширения языка С. Это расширение появилось в GCC начиная с версии 8

GCC 7.3: https://godbolt.org/z/0wEtZJ
GCC 8.1: https://godbolt.org/z/Tw8kL9

[uquote="WiseLord",url="/forum/viewtopic.php?p=3818622#p3818622"]Но не под GCC, а под какой-то другой компилятор[/uquote]

Нет. Именно под GCC или совместимый компилятор (Clang?). Остальные компиляторы С по прежнему продолжают честно отлавливать эту ошибку.

---

[uquote="ozonn",url="/forum/viewtopic.php?p=3818654#p3818654"]подскажите, как сделать так, чтобы переменная, объявленная в одном файле, была видна во всех остальных?[/uquote]

1. В стандартном языке С вам придется идти по классическому пути: создать заголовочный файл с extern-объявлением переменной (без инициализатора).

Код: Выделить всё

extern int a;


А в одном из файлов реализации сделать определение этой переменной (возможно с инициализатором)

Код: Выделить всё

int a = 42;


2. Многие компиляторы языка С (GCC, Clang, MSVC и т.д. и т.п.) поддерживают популярное нестандартное расширение языка С, разрешающее множественные глобальные определения переменных между разными единицами трансляции, при условии, что такие переменные не содержат инициализатора. Это позволяет вам напрямую, прямо в заголовочном файле сделать определение переменной



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

3. В языке С++ у вас есть либо классический способ (см. 1), либо определение переменной прямо в заголовочном файле как `inline`

Код: Выделить всё

inline int a = 42;


Последний вариант доступен начиная с С++17
Последний раз редактировалось KorbenDallas Чт мар 26, 2020 22:09:32, всего редактировалось 4 раза.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение NStorm »

KorbenDallas, уже месяц назад написали, что это CodeVision AVR. Там видимо тоже подобные "нестандартные" расширения допускаются. По структуре объявления прерываний и остальному видно прекрасно, что это CVAVR. И прошивку уже в CVAVR собрали на тот вопрос и работает она. Че вы некропостом этим пытаетесь доказать?
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="NStorm",url="/forum/viewtopic.php?p=3818903#p3818903"]KorbenDallas, уже месяц назад написали, что это CodeVision AVR. Там видимо тоже подобные "нестандартные" расширения допускаются.[/uquote]

Видимо да.

[uquote="NStorm",url="/forum/viewtopic.php?p=3818903#p3818903"]Че вы некропостом этим пытаетесь доказать?[/uquote]

Во-первых, тут нет никакого "доказательства". Доказывать можно теорему. Я лишь упомянул аксиомы языка. Данная тема, напомню, посвящена именно языку С.
Во-вторых, "пытаться" я не смогу даже если захочу: я сказал свое слово - все вопросы сразу разрешились.
В-третьих, оставьте, пожалуйста, такое понятие как "некропост" там, где ему самое место - в конце девяностых-начале двухтысячных. Такого понятия уже давно не существует. Это, если хотите, уже давно некропонятие ))
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

KorbenDallas писал(а):Переменные, объявленные с `const`, в языке С (в отличие от С++) не являются константами времени компиляции
Хм, это было интересно.

Код: Выделить всё

static const uint32_t R_POT_H   = 4700;         // Pot pull-up resistor
static const uint32_t R_POT     = 100000;       // Pot resistance

// TODO: calibration settings for potentiomenters
static const int32_t R_POT_TH   = 67;           // Experimental threshold
static const int32_t R_POT_MAX  = (((ADC_MAX) * R_POT / (R_POT + R_POT_H)) - R_POT_TH);
Использовал этот код для STM32 и даже не подозревал, что версией компилятора пониже я бы это мог и не собрать.

Тем больше хочется уйти в сторону C++, где на constexpr можно вообще чудеса творить...
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

Именно поэтому в С для объявления именно констант (а не "неизменяемых переменных") по-прежнему доминирует `#define`. В ряде случаев можно воспользоваться `enum`. А вот применимость `const` объявлений очень ограничена.

Даже если компилятор позволяет использовать `const` переменные для статической инициализации, он скорее всего не позволит использовать их для указания ширины bit-field, для формирования case-метки, для указания размера не-VLA массива и т.п.
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение NStorm »

Ну конкретно на AVR применимость есть вот такая: https://gcc.gnu.org/onlinedocs/gcc/Name ... paces.html
Конечно это опять же не стандарт языка... но архитектура такова.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

На самом деле, особенно применительно к микроконтроллерами, особой разницы между #define, enum и static const я уже давно не вижу. Оптимизация (-Os) для всех случаев приводит к побайтно идентичному коду, из моего опыта.

А контакты и встраиваемые функции использовать удобнее (по сравнению с теми же макросами, ввиду нулевой разницы на выходе). С ними IDE обычно без проблем работают, давая более адекватные подсказки при автодополнении кода.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

WiseLord писал(а):особой разницы между #define, enum и static const я уже давно не вижу
разница появляется в тех случаях, когда создаются указатели на эти объявления - хоть Си является языком нестрогой типизации, в большинстве компиляторов предусмотрены варнинги для формально несовпадающих типов, что иной раз сильно выручает.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3819011#p3819011"]На самом деле, особенно применительно к микроконтроллерами, особой разницы между #define, enum и static const я уже давно не вижу. Оптимизация (-Os) для всех случаев приводит к побайтно идентичному коду, из моего опыта.[/uquote]

Это нормально. Сгенерированный код запросто может оказаться идентичным даже если убрать `const` вообще. Если компилятор знает значение переменной в конкретном контексте, то всякий уважающий себя оптимизирующий компилятор не преминет подставить в сгенерированный код ее значение, вместо того, чтобы формировать полноценное обращение к хранилищу. `const` лишь дает ему больше прав.

В данном же случае речь именно о формальной корректности с точки зрения языка.

Добавлено after 8 minutes 21 second:
[uquote="ARV",url="/forum/viewtopic.php?p=3819026#p3819026"]разница появляется в тех случаях, когда создаются указатели на эти объявления - хоть Си является языком нестрогой типизации, в большинстве компиляторов[/uquote]

Язык С является языком со очень строгой типизацией.

В строгости типизации языки С и С++ фактически идентичны. Различия в типизации между С и С++ сводятся только к возможности неявного преобразования указателей из `void *` в С и возможности неявного преобразования из `int` в `enum` в С (плюс еще ворох нюансов помельче).

[uquote="ARV",url="/forum/viewtopic.php?p=3819026#p3819026"]предусмотрены варнинги для формально несовпадающих типов, что иной раз сильно выручает.[/uquote]

Все эти "варнинги" - это полноценные ошибки компиляции с точки зрения языка С.

В режиме по умолчанию они не прерывают компиляцию только потому, что используемый вами компилятор в первую очередь предназначен для компиляции огромного наследия старинного и низкокачественного кода, который битком-набит такими ошибками. Исправлять этот старинный "гамнокод" никто не хочет - проще заставить компилятор глотать его с "варнингами".
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

Хотелось бы пруфов на авторитетов о том, что Си - язык со строгой типизацией.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="ARV",url="/forum/viewtopic.php?p=3819370#p3819370"]Хотелось бы пруфов на авторитетов о том, что Си - язык со строгой типизацией.[/uquote]

Ну в первую очередь надо спросить у вас, что вы имели в виду под "нестрогой типизацией" в конкретном случае. Вы ведь вели речь о "ворнингах", то есть имели в виду конкретные ситуации в коде, а не какой-то огульный холивор.

Приводите примеры. А далее - стандарт языка С. Авторитетнее некуда.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

Сравните синтаксис Паскаля и Си, и вы уразумеете, что значит строгая типизация. В паскале целочисленной переменной вы не присвоите значение действительной переменной, например. В Си - легко, и даже варнинга не будет.
В общем, рекомендую. А, говорят, Ада ещё и паскалю 100 очков даст.
Си - это просто вакханалия, один char чего стоит...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="ARV",url="/forum/viewtopic.php?p=3819445#p3819445"]Сравните синтаксис Паскаля и Си, и вы уразумеете, что значит строгая типизация. В паскале целочисленной переменной вы не присвоите значение действительной переменной, например. В Си - легко, и даже варнинга не будет.[/uquote]

Если вы имели в виду возможность неявного преобразования плавающих типов к целым в С, то да - в этом отношении язык С нестрого типизирован.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

Не в ЭТОМ смысле, а ВООБЩЕ.

Добавлено after 3 minutes 4 seconds:
Можете и boolean попробовать, и операции над целыми числами... Паскаль не позволит скомпилировать код, где применяются "несовместимые" типы, Си позволит. Это и есть нестрогая типизация.
А варнинг не ошибка, а костыль, вытекающий из "нюансиков" Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="ARV",url="/forum/viewtopic.php?p=3819553#p3819553"]Можете и boolean попробовать, и операции над целыми числами... Паскаль не позволит скомпилировать код, где применяются "несовместимые" типы, Си позволит. Это и есть нестрогая типизация.[/uquote]

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

[uquote="ARV",url="/forum/viewtopic.php?p=3819553#p3819553"]А варнинг не ошибка, а костыль, вытекающий из "нюансиков" Си.[/uquote]

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

В языке С нет никаких "варнингов" и нет никаких "ошибок" в принципе. А есть только диагностические сообщения, выдаваемые в ситуациях, когда их требует стандарт языка. В языке С все такие диагностические сообщения равны между собой. А что там написал в сообщении ваш компилятор (слово "варнинг" или слово "ошибка") - это целиком и полностью студенческая самодеятельность вашего компилятора. Я уже ясно объяснил выше, откуда у этой самодеятельности ноги растут.

Знать особенности вашего компилятора (т.е. распознавать ситуации, когда он рапортует формальные "ошибки" как "варнинги") - это ваша обязанность. Некоторые компиляторы могут помочь вам в этом (напр. ключ `-pedantic-errors` в GCC и Clang), а с некоторыми вам придется опираться исключительно на собственные знания. Язык С, как таковой, здесь ни в чем не виноват.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

Не пойму я вашего флейма. Ссылки на авторитетные источники о том, что Си есть язык строгой типизации, вы не привели, кормите какими-то баснями...

Добавлено after 2 minutes 22 seconds:
Почитайте ликбез: https://m.habr.com/ru/post/161205/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="ARV",url="/forum/viewtopic.php?p=3819820#p3819820"]Не пойму я вашего флейма.[/uquote]

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

[uquote="ARV",url="/forum/viewtopic.php?p=3819820#p3819820"]Ссылки на авторитетные источники о том, что Си есть язык строгой типизации, вы не привели,[/uquote]

Не нужно уж совсем вот так нагло врать. Я же ясно сказал: источником является спецификация языка. Авторитетнее некуда.

[uquote="ARV",url="/forum/viewtopic.php?p=3819820#p3819820"]кормите какими-то баснями...[/uquote]

Мои басни - ни что иное как точное, четкое и авторитетное описание свойств языка, который является темой данной ветки. "Ликбез", как вы его назвали.

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

Возникает очевидный вопрос: вы точно не перепутали "ликбез" с "флеймом"? ))

(Что касается статьи по ссылке в самостоятельном рассмотрении: это не "ликбез", а предложенный автором доморощенный вариант классификации. Вполне стройный и логичный, малость устаревший. Не хуже, не лучше других. Авторов этих, каждый со своим вариантом - хоть залейся. Как я уже сказал, мне эти теоретические холиворы не интересны.)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

Так процитируйте спецификацию Си! То место, где говорится о типизации и её строгости (или сильности). Хватит уже собственных интерпретаций! Можете Кернигана процитировать, тоже сойдёт за авторитет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»