Выплескивание эмоций

Тема в разделе "Флудилка", создана пользователем alp69, 15 окт 2016.

  1. akl

    akl Гуру

    Атмега8. На данный момент занято применро 70% Program Memory и 15% Data Memory. Если взять эту пачку глобальных переменных и засунуть их внутрь мейна, то становится примерно 60% и 6% соответственно. то есть по 10% убавляется.
    Код вот такой, хз какая у него глубина, но примитивность точно высокая. Мне еще примерно 10% надо доделать вот и думаю как лучше сэкономить память.
     

    Вложения:

    • main.c
      Размер файла:
      12,7 КБ
      Просмотров:
      298
  2. SergeiL

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

    :). Стиль или надежность? Что правильней? Тут можно долго спорить, нужно смотреть код, как правильно его написать!

    В больших, командных, проектах, при написании библиотек, для последующего использования их другими пользователями - Да!
    Видимость, вернее невидимость, переменных очень важна!

    А, когда код под МК, пишется одним девелопером - вопрос спорный. ;)
    Использование глобальных переменных может не только сократить код, но и снизить риск переполнения стека, или наезда стека на кучу.
    Плюс уменьшается размера кода, повышение скорости работы и стабильности устройства, за счет отказа от закидывания переменных на стек или в регистры, перед вызовом функций.;)
     
    Andrey12 нравится это.
  3. akl

    akl Гуру

    наезд стека на кучу это жутко :eek:
    лучше оставлю большую часть этих переменных глобальными.
    но вообще странно как-то в этот раз у меня програм мемори заполняется сильно быстрее чем дата мемори - возможно что-то делаю не так.
     
  4. SergeiL

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

    Для МК это не страшно, хотя многие тут скажут, что это не правильно - некрасиво. :)

    Я же спрашивал давно тут Никто так и не ответил.
     
    Последнее редактирование модератором: 29 сен 2019
  5. parovoZZ

    parovoZZ Гуру

    У меня есть 10 функций. В каждой из них по 10 переменных. Что мне с ними делать? Объявлять глобальными? Бред.
    Я делаю так. Переменная, которая всегда крутится в главном цикле и которая сто процентов не влезет в регистр (массив структур, например), сразу летит в глобальные по одной простой причине - она живет всегда, пока крутится программа. Та же переменная, но вспомогательная и которая не передаётся в вызываемые функции - такие переменные всегда локальные. Причина ясна - я их не вижу в других функциях, что позволяет не плодить названия переменных.
    Ну а те переменные, которые невозможно передать в вызываемую функцию, но используются в ней (обработчики прерываний) - такие переменные глобальные всегда и с запрещенной оптимизацией.
     
  6. SergeiL

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

    Тут все зависит от проекта.
    Каждый раз передавать переменную или указатель через стек можно, но вызываются дополнительные функции...
     
  7. DetSimen

    DetSimen Guest

    Глобальные и статические переменные кладуца сразу, компилятором в сегмент инициализированных данных (.data) и могут учитываться компилятором при подсчёте занимаемого переменными места. А под локальные переменные функции при входе в эту функцию резервируется место в стеке и немедленно освобождается при выходе из нее. Зато глобальные переменные видно из всей программы, а локальные (и статические) видны только внутри функции.
     
    akl и Andrey12 нравится это.
  8. akl

    akl Гуру

    Но в нашем случае выход из функции "мейн" не просиходит никогда - получается что и место от этих переменных не освободится никогда - значит ли это что лучше эти переменные оставлять глобальными? или их локализация внутри мейна все же даст какие-то выгоды?
     
  9. DetSimen

    DetSimen Guest

    глобальные лучше только тем, что видны отовсюду. Но и испортить их можно отовсюду. Обьявленные в main() видны только в main(), испортить их тоже можно, но только если код кривой.
    Я за разумное сокрытие данных, переменную зазря наружу выставлять не стОит.

    а они валяются себе на стеке и никому не мешают (при правильном и аккуратном программировании)
     
    Последнее редактирование модератором: 29 сен 2019
  10. akl

    akl Гуру

    но с другой стороны эсли эти переменные глобальны - я хотя бы вижу в отчете компилятора что занято столько-то памяти и что пора что-нибудь оптимизировать например или урезать, а засуну их в мейн - и получится что место они все равно занимают, но я не вижу. Есть ли в этой аврстудии какой-то легкий способ отследить не происходит ли какое-нибудь переполнение, наезд на кучу и прочие неприятности? В симуляторе наверно надо как-то гонять и что-то смотреть. Или на глаз как-то прикидывать :oops:

    Вброшу для Бар-Мена:
    Всякая там премодерация и борьба с троллями и ботами - это все фигня. Самая насущная проблема форума - мало смайликов.
    Нужно больше смайликов! Разных.
    Особенно вот этих
    [​IMG] [​IMG]
     
    Последнее редактирование модератором: 29 сен 2019
  11. Igor68

    Igor68 Гуру

    Ага... И задницу дабавить, что б было куда послать. Али ещё чего для на ..... и в .....:D
     
  12. SergeiL

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

    А в Ардуино IDE (GCC) показывает полностью одинаковое использование памяти, что с глобальными, что запихнуть переменные в setup(). ;)
     
  13. akl

    akl Гуру

    как оно это делает? :eek:

    может в студии какую-нибудь приблуду можно подключить чтоб как-то более информативно про использование памяти было? Уже прикрутил Data Size Viewer, оно когда в режиме дебага показывает сколько какая функция занимает, но в этом вопросе с глобально-локальными переменными оно не помогает.

    о наткнулся на такую приблуду https://www.fourwalledcubicle.com/StackChecker.php
    надо будет попробовать
     
    Последнее редактирование модератором: 29 сен 2019
  14. SergeiL

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

    Никак :)
    Выкинул оптимизатор ненужный код. И даже под переменные память не выделял.
    Переменная "с" - не используется, ну и нахрена эти вычисления с константами?
    Понапишут тут всякой хрени, а ему же память экономить нужно :)
     
  15. DetSimen

    DetSimen Guest

    тот самый случай, когда компилятор умнее писавшего. :)

    akl, ты чо на спичках-то экономишь? Когда, и если, твоя программа вдруг слижет коротенькую память 328-й, или наехает куча на стек, ну возьмешь Мегу или того круче, на STM перейдёшь, или на Интел последний. Была б проблема...
     
    Последнее редактирование модератором: 29 сен 2019
    Igor68, Andrey12, parovoZZ и ещё 1-му нравится это.
  16. akl

    akl Гуру

    во-первых - спортивный интерес, я же только учусь, надо понимать как там че работает, и оптимизация никогда лишней не бывает. Иногда бывает программа огромная, а памяти почти не жрет, а в другой раз вроде и мало напрограммировано, а памяти уже в обрез (я в основном атмегу8 использую)
    а во-вторых, вполне возможно что когда стек наедет куда-нибудь и навалит там кучу - это может быть незаметно на первый взгляд, и только будут вылазить непонятные неуловимые глюки.
     
  17. DetSimen

    DetSimen Guest

    Нет, глюков не будет, будет deadtouch.

    тебе Asper Daffy дал хорошую ссылку, там и монитор памяти есть, ты читал?
     
    Последнее редактирование модератором: 29 сен 2019
    akl нравится это.
  18. akl

    akl Гуру

    Где? когда? может не мне? я что-то пропустил походу.
    поискал его последние сообщения http://forum.amperka.ru/members/asper-daffy.16292/ чет не вижу ссылки

    вот это имеется в виду? http://arduino.ru/forum/programmiro...yat-3-dinamicheskie-i-avtomaticheskie-peremen
    да, наверно эта ссылка. это он не мне давал. Но тема кстати интересная и я в нее заходил, но чет не заметил эту ссылку. Спасибо за наводку
     
    Последнее редактирование модератором: 29 сен 2019
  19. DetSimen

    DetSimen Guest

    да, эта ссылка. Еще надо Этюд №1 и 2 прочитать перед этим.
     
    akl нравится это.
  20. akl

    akl Гуру

    Чипдип заменил микросхемы cp2102. Новые хорошие. и паяются хорошо в отличие от тех залоченных.
    Так что если кто-то будет покупать их - увидите на корпусе циферки 1834+ не берите - они левые и не работают как надо, требуйте из другой партии.
     
    Igor68, Airbus и ИгорьК нравится это.