Перейти к содержанию
    

Переопределение переменной в теле функции.

1 hour ago, jcxz said:

инициализация каждого data выполняется непосредственно перед его использованием - на другом компиляторе (более умном) может оказаться неверным.

Гм.. а вот здесь есть повод задуматься. Если компилятор Си++, то он просто обязан инициализировать объект в начале блока, и уничтожить (если есть деструктор) при выходе. Но простые типы, без конструкторов, да, возможно и соптимизирует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще ТС почему-то посчитал нужным вырезать довольно интересный кусок листинга.
А именно - резервацию стека вначале и освобождение в конце функции ILI9341_Init().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, Arlleex said:

А еще ТС почему-то посчитал нужным вырезать довольно интересный кусок листинга.
А именно - резервацию стека вначале и освобождение в конце функции ILI9341_Init().

 

ILI9341_Init:
    PUSH     {R7,LR}
    SUB      SP,SP,#+72
      
    ............................................... 
          
    ADD      SP,SP,#+76
    POP      {PC}             ;; return

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, jcxz сказал:

В данном конкретном случае компиляции - разная.

Разная кто (и вопрос ТСу - какую область имели ввиду)? ОЗУ под data[] в каждом из блоков? Я вижу тут один и тот же кусок памяти (с небольшим перехлестом).

2 часа назад, jcxz сказал:

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

Не понял, где Вы увидели инициализацию обоих data[] в начале функции?
Я вижу инициализацию непосредственно перед их использованием.
Т.е., если смотреть на Си-код, после входа в каждый из блоков...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Разная кто (и вопрос ТСу - какую область имели ввиду)? ОЗУ под data[] в каждом из блоков? Я вижу тут один и тот же кусок памяти (с небольшим перехлестом).

Где Вы там "перехлёст" увидели? В нижнем копировании целевой адрес == SP+28 и записывается в него 4 байта: SP+28+4, что равно целевому адресу верхнего копирования SP+32.

Цитата

Не понял, где Вы увидели инициализацию обоих data[] в начале функции?

Я вижу инициализацию непосредственно перед их использованием.

Вы внимательнее прочитайте мой пост:

4 часа назад, jcxz сказал:

более умный оптимизатор запросто может перенести инициализацию обоих data в начало функции

Т.е. - выйдет новая версия существующего компилятора, которая будет умнее. И сделает так.

Может такое быть? Может! Так как 5+3=8 байт, что как раз можно обеспечить верхней парой команд LDRD\STRD, значит нижнее копирование не нужно. А стек по любому выровнен на 8.

2 часа назад, haker_fox сказал:

то он просто обязан инициализировать объект в начале блока, и уничтожить (если есть деструктор) при выходе. Но простые типы, без конструкторов, да, возможно и соптимизирует.

Умные оптимизаторы могут переносить операции таким образом, чтобы это не нарушало логику программы. А, так как например нижняя data не используется нигде до нижнего блока, то ничего не мешает перенести её инициализацию наверх, объединив с верхней инициализацией.

"Уничтожить" - не значит что-то с ним физически сделать. Достаточно просто удалить из таблицы переменных внутри компилятора. Раз нет деструктора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

53 минуты назад, jcxz сказал:

Вы внимательнее прочитайте мой пост...

Да, пардон. Под вечер темы все интереснее кажутся, а внимание рассеивается:biggrin:

Вот интересно еще, на что эта функция резервирует аж 72 байта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 минут назад, Arlleex сказал:

Вот интересно еще, на что эта функция резервирует аж 72 байта.

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

Товарищ не знает не только про "static const", но и про циклы.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, Arlleex said:

Вот интересно еще, на что эта функция резервирует аж 72 байта

Блин, ну вбейте уже в гугл "ILI9341 init" и насладитесь десятком вариаций кода, который скармливает этому дисплею портянки каких-то байтиков (без комментариев, что именно эти байтики значат. очень удобно). Там подобных writedata ещё несколько штук должно быть.

 

Очередная тема ни о чём. "Хочу оптимайзить код мач беттер зен компайлер, но не хочу и не буду ридить мануал". Прям вот классика, уже не первая тема тут такая.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, esaulenka said:

"ILI9341 init" и насладитесь десятком вариаций кода

Не наш подход) Лучше прочитать мануал, подумать, и сделать самому. Ну уже совсем если не получается, то только что разве посмотреть на то, как делают другие.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, haker_fox said:

Не наш подход)

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

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

Вместо этого пятая страница переливаний из пустого в порожнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, esaulenka said:

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

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

 

З.Ы. А вы давно статус модератора получили, чтобы мне указывать куда "влезать" и оценивать мои советы? Если получили такой статус модератора, то озаботьтесь тем, чтобы он мне был виден. А то написано, что вы - "свой". Т.е. у вас прав говорить ровно столько же, сколько и у меня. И наборот. И прекратите мне в будущем указывать, что здесь делать и не делать. И да, кроме вас - никто не указывал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12.11.2020 в 14:38, haker_fox сказал:

Опять двадцать пять)

Это как? У армов же линейное пространство памяти. Неважно, откуда читать: из ОЗУ или ЭСПЗУ. На LPC4337 можно даже из EEPROM читать. И нет никакой разницы, кроме быстродействия. Но это к чтению не относится.

1) я не ведал что сие АРМ, у АВР например к флешке через задний ход надо лезть.

2) даже на АРМ доступ к флеше резко медленней чем к РАМ. в разы. и даже если у вас есть кеш, который очень выручит, то вполне имеет смысл не убивать его чтением данных из флеша, а запасти при инициализации в данные РАМ.

12.11.2020 в 16:04, jcxz сказал:
12.11.2020 в 13:54, AlexRayne сказал:

Но может это потому что WriteData умеет только из RAM читать.

Опять 25.... Объясните пожалуйста - каким образом вызывающая функция умеет не только из RAM читать, а вызываемая - не умеет? Это как это???  :wacko2:

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

Но если у нас флеша в особой области памяти , как у АВР например, то к ней нужен специального вида указатель - не сможет одна и таже функция у вас копировать из РАМ и из флеш. Разные функции надо делать. 

А еще может быть фокус например с ДМА - он в какието сегменты памяти например не имеет доступа, и ему какой попало указательне не передать. А еще, как я уже упомянул, может быть флеш супир тормозная, и лучше с ней вообще дела не иметь, тогда все что можно лучше положить в РАМ. инициализация при стартапе все сгладит.

 

Изменено пользователем AlexRayne

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, AlexRayne said:

1) я не ведал что сие АРМ, у АВР например к флешке через задний ход надо лезть.

То, что это ARM я тоже увидел только благодаря кусочку листинга, любезно выложенному автором. Про AVR знаю, т.к. работал с ними около 10 добрых лет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, AlexRayne сказал:

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

Во-первых: Посмотрите ещё раз внимательнее на исходное сообщение темы и ответьте - причём тут некий "стартап"? Вы о чём вообще???  :wacko2:

2 часа назад, AlexRayne сказал:

Но если у нас флеша в особой области памяти , как у АВР например, то к ней нужен специального вида указатель - не сможет одна и таже функция у вас копировать из РАМ и из флеш. Разные функции надо делать.

И опять - Вы о чём??? :wacko2:

Разжую подробнее: У автора в исходном посте есть функция1, вызывающая другую функцию2. Почему функция1 может читать из флешь (или копировать флешь->ОЗУ), а функция2 - этого сделать не может?

Приведите реальный пример: на каком процессоре/компиляторе такое возможно? Только реальный пример, а не сферический, притянутый за уши (я понимаю, что при желании можно извратиться и добиться такого, но это ещё надо постараться).

2 часа назад, AlexRayne сказал:

А еще может быть фокус например с ДМА - он в какието сегменты памяти например не имеет доступа, и ему какой попало указательне не передать. А еще, как я уже упомянул, может быть флеш супир тормозная, и лучше с ней вообще дела не иметь, тогда все что можно лучше положить в РАМ. инициализация при стартапе все сгладит.

Причём тут DMA-неDMA, "тормозная флешь" и какой-то ещё "стартап"?  :wacko2:

 

PS: У меня складывается ощущение, что вы не понимаете предмета обсуждения..... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, AlexRayne сказал:

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

При каком старте? Какой стартап? При чем он в данном конкретном случае?

Локальные переменные (не статические) инициализируются каждый раз при входе в их область видимости (блок). Ни в каком не в стартапе. А каждый раз при входе в функцию в месте её вызова (или в каждый блок внутри функции). Это уже на усмотрение компилятора.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...