inline

Тема в разделе "Микроконтроллеры AVR", создана пользователем parovoZZ, 6 янв 2019.

  1. parovoZZ

    parovoZZ Гуру

    ну в симуляторе для меня было шоком, когда выполнение программы вылетело из цикла, сделало декремент переменной перед циклом и обратно нырнуло в цикл...переменной внутри цикла не было.
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Что "ADC.h"? В нём есть тело Вашей функции? Раньше Вы писали
    А если в adc.h нет тела Вашей функции, то взять его компилятору для подстановки просто просто негде. Ну не лезет он в другие файлы. Не лезет и даже не знает об их существовании.

    Или Вы пишете в adc.h полное тело функции со словом inline и тогда она подставится в любом файле, куда adc.h включён. Или же Вы оставляете тело в файле adc.c (как писали), а в adc.h вставляете заголовок. Но про inline тогда забудьте. Ни в каком файле (кроме самого adc.c) она не может быть подставлена inline.

    ЕШЁ раз, если тело функции в постороннем файле, который не включается в данный по include, то компилятору НЕГДЕ его (тело функции) взять для inline подстановки. Ну, не ищет он ни в каких посторонних файлах.

    Неужели тут какие-то сложности и непонятки?
     
  3. Asper Daffy

    Asper Daffy Иксперд

    Вы что-то перепутали. Освежите в памяти разделы 11.3.5 и 11.4.1 стандарта, а то и впрямь хрень.
     
  4. какого из стандартов
     
  5. Asper Daffy

    Asper Daffy Иксперд

    ISO-IEC 14882 - 2017, конечно. А Вы знаете какой-то другой действующий стандарт С++?

    В общем, Вы что-то напутали. volatile и const в описании функции имеют смысл только для функций, являющихся нестатическим членом класса (п. 11.4.1(5)). Для любых других функций они не имеют смысла.

    Кстати, нетрудно убедиться, что в компиляторе GCC слово volatile в этом месте смысла не имеет (как и положено по стандарту). Просто откройте ардуино IDE, включите в настройках "показывать все предупреждения" и попробуйте скомпилировать вот такой скетч:
    Код (C++):
    volatile uint16_t f(void) {
        return ADC;
    }

    void setup() {
        Serial.begin(9600);
        Serial.println(f());
    }

    void loop(void) {}
     
    Он скомпилируется, но выдаст предупреждение: "warning: type qualifiers ignored on function return type". Вас не смущает, что компилятор, скотина такая, просто проигнорировал и выбросил столь важное по Вашему мнению слово? :)))
     
    Последнее редактирование: 9 янв 2019
  6. parovoZZ

    parovoZZ Гуру

    Я, ребята, вообще ничего не понимаю(((((

    Вставил в ADC.h такую функцию (без её объявления)
    Код (C++):
    inline void ADC_Off (void)
    {
         ADCSRA =    0;
    }
    Вызываю её однократно в main.c
    Размер кода 1164 Б. Если её определить макросом всё в том же заголовочнике
    Код (C++):
    #define ADC_Off            ADCSRA =    0
    Размер кода не изменится (ну это ожидаемо).
    НО
    В режиме симуляции не могу поставить точку останова в main.c на
    Код (C++):
    ADC_Off();
    если она определена как функция. Но в дизасме она есть и при симуляции по шагам я на нее попадаю, но только в ADC.h. В ADC.h точка останова выбирается, но только на фигурной скобке(!). При этом у меня перестают видится какие-то переменные (Unknown location). Если ADC_Off() определить как макрос, то всё хорошо))) Дальше еще интереснее. Есть цикл матацикл мать его за колесо
    Код (C++):
     
    //main.c
              do
                {
                    ADC_Change_in(ADC_channels[ADC_current_channel]);

                    Sleep(SLEEP_MODE_ADC);

                    Value_current[lsb][ADC_current_channel] = ADCL;
                    Value_current[msb][ADC_current_channel] = ADCH;

                } while (ADC_current_channel--);
    Он проходит три итерации. Sleep() также определена в main.c. В ADC.c:
    Код (C++):
    void ADC_Change_in (uint8_t Analog_input)
    {
        ADMUX = (1<<REFS1) | (0<<REFS0) | Analog_input;
    }
    Перед однократным вызовом ADC_Change_in(ADC_channels[ADC_current_channel]); в дизасме идут чередом LDI, ADD, ADC и только потом вызов. Размер кода в таком варианте 1232 Б! Определяю макрос
    Код (C++):
    #define ADC_Change_in(Analog_input)    ADMUX = (1<<REFS1) | (0<<REFS0) | (Analog_input)
    и вуаля! Наши 1164 Б! Но в дизасме мой верхний цикл полностью развернулся. Все три вызова Sleep() заинлайнились. Если написать так
    Код (C++):
    __attribute__ (( __noinline__ ) ) void Sleep ...
    то размер кода 1220 Б и цикл не разворачивается. Оптимизация O3. Устройство питается от батарейки, поэтому чем быстрее я уйду в IDLE или NOISE_ADC, тем лучше.
     
    Последнее редактирование: 10 янв 2019
  7. Asper Daffy

    Asper Daffy Иксперд

    Ну.я не знаю, что там за симуляция, ничего не могу сказать.
     
  8. SergeiL

    SergeiL Оракул Модератор

    Возможно это особенность компилятора по добавлению отладочной информации.

    Так это нормально, это вытаскивание из памяти и передача функции параметров.

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

    В свое время, когда интегрировали MS Си в нашу RTOS, мы отключали оптимизацию, и смотрели, что получается в асме. Потом включали, и смотрели, что получается, где, что нужно добавить убрать.
     
  9. SergeiL

    SergeiL Оракул Модератор

    Зато их помнит nmake (make), и прекрасно передаст в каждый компилирующийся файл.
    Где нужно вставит, где не нужно уберет на прекомпиляции.
    Давно все это было ;)
     
  10. Asper Daffy

    Asper Daffy Иксперд

    Т.е. Вы предлагаете руками расписывать в какой файл передать, а в какие не передавать предопределённый дефайн? Ну, это же убивает саму идею мейка! А я выбросил тот самый файл куда передавал - мне надо вспомнить. что нужно лезть в мейк и добавить передачу в какой-нибудь другой?
    Прекращайте, это уже пошли отмазки. чтобы не признавать ошибку. я не люблю так разговаривать. Всегда можно вывернуться через зад, только кому и зачем это надо?

    Для ограничения зоны видимости функции одним файлом используется static. Поставил и функция из других файлов не видна. Можно в другом заводить с таким же именем. Все нормальные люди так делают и чего тут огород-то городить? Давайте, хватит уже.
     
  11. SergeiL

    SergeiL Оракул Модератор

    Это же я Вам и говорил в посте #44
     
  12. SergeiL

    SergeiL Оракул Модератор

    А ограничение зоны видимости на МК - это конечно актуально, особенно, когда пишет один человек!
     
    parovoZZ нравится это.
  13. Asper Daffy

    Asper Daffy Иксперд

    Это моя ошибка была - я не должен был отвечать, что-то расслабился, та дискуссия закончена. Проехали.

    Мы теперь с дядеq Вите за волатильность треплемся, так шо занят я :)
     
  14. SergeiL

    SergeiL Оракул Модератор

    Да, да, я понимаю, встретились два профессионала на любительском форуме.
    Каждый здесь считал себя лучшим! :)
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Важно не количество человек, а количество файлов.

    А что до человека, то один человек пишет выключение света у себя в сортире. А вот, например, вот в такой штуке (Вы не поверите, но системой охлаждения компьютера управляет ардуино микро) требуется полная, по ГОСТ оформленная документация и возможность изменения другими людьми.

    Я уже Вам говорил сегодня. что ограничение зоны видимости свойственно профессиональным проектам. Свет в сортире можно и так выключить.
     
  16. SergeiL

    SergeiL Оракул Модератор

    :):):)

    Ну вот смешно пишете! Профессионал и ардуино микро. :)
    Ардуино вообще любительская вещь.

    Я - любитель, который пишет код для МК, ардуино и ESP, для автоматизации своей квартиры, дачи, и т.д.
    Мне глубоко пофиг на ограничение видимости, потому, что это - мой личный проект.
    Можно хоть все переменные сделать глобальными, никто не заметит, и по памяти ничего не изменится.
    Главное, чтобы багов не было, и работало надежно! :)

    Ну штукой не удивили.
    Более 20 лет назад мы писали под свой троироавнный вычислитель.
    И под свою собственную ОС, которую писали коллективом в 6 человек.
    Но это было очень-очень давно ;), с тех пор софт пишу только для себя :)
    А написанный софт, как ни странно, до сих пор работает ...
     
    Последнее редактирование: 10 янв 2019
  17. parovoZZ

    parovoZZ Гуру

    там реально потребовалось 32 кБ памяти для управления охлаждением компьютера?
    а кому она нужна?
    для меня откровение, что развернутый цикл с inline функциями занимает меньше кода, чем замкнутый и с вызовами...
     
  18. Asper Daffy

    Asper Daffy Иксперд

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

    Вот фото компьютера:

    [​IMG]
     
    Последнее редактирование: 10 янв 2019
  19. Asper Daffy

    Asper Daffy Иксперд

    Профессионал так никогда не сделает, даже в поделке для выключения света в сортире. И не потому. что это кто-то заметит или не заметит, а потому, что он так не делает никогда - привычки, стиль.
     
  20. SergeiL

    SergeiL Оракул Модератор

    :):):)
    Так я же не утверждаю, что я профессионал в этой области :)
    У меня это хобби. Делаю то, что мне нравится, в свободное время, для себя.
    Мне казалось форум как раз для хоббистов, а не для профессионалов. Не так?

    Я сказал так можно, и сказал, что это не повлияет на надежность. Отрицаете?
     
    Последнее редактирование: 10 янв 2019