Darth Vader 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 (изменено) · Жалоба 5 часов назад, jenya7 сказал: void ILI9341_Init() { ILI9341_WriteCommand(0xCB); { uint8_t data[] = { 0x39, 0x2C, 0x00, 0x34, 0x02 }; ILI9341_WriteData(data, sizeof(data)); } ILI9341_WriteCommand(0xCF); { uint8_t data[] = { 0x00, 0xC1, 0x30 }; ILI9341_WriteData(data, sizeof(data)); } //и так далее } стоит пользоваться такой конструкцией? мне она не нравиться честно говоря. Как бы сомнительно она ни выглядела, но она синтаксически и логически корректна. Неоптимальна, но корректна. И будет работать правильно. Я бы переписал так: Скрытый текст void ILI9341_Init() { ILI9341_WriteCommand(0xCB); static const data1[] = { 0x39, 0x2C, 0x00, 0x34, 0x02 }; ILI9341_WriteData(data1, sizeof(data1)); ILI9341_WriteCommand(0xCF); static const uint8_t data2[] = { 0x00, 0xC1, 0x30 }; ILI9341_WriteData(data2, sizeof(data2)); // и так далее } Отсутствует ненужное копирование данных из флеш-памяти в стек. Данные используются сразу из флеша, без ненужного перекладывания их в промежуточные локальные массивы. Изменено 11 ноября, 2020 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 1 час назад, HardEgor сказал: Например в процессе работы первой функции... Да все это понятно, но мы совершенно о другом говорили, а именно о распределении памяти локальных объектов внутри одной функции, но в разных блоках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 11 ноября, 2020 Опубликовано 11 ноября, 2020 (изменено) · Жалоба 1 hour ago, haker_fox said: Автор темы не @Arlleex А @jenya7 действительно не понятно чего хочет. я хочу чтоб моя функция была безупречная. поэтому меня интересует все, и как будет распределена память, и быстрота исполнения, и размер, и генерность и.т.д и.т.п. поэтому увидев такие пассажи в коде я решил узнать насколько это оправданно. :)) Изменено 11 ноября, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 18 minutes ago, jenya7 said: я хочу чтоб моя функция была безупречная. По каким критериям безупречная: оформление кода на языке высокого уровня, расход памяти или по скорости выполнения? Просто "безупречная" это из области фантастики, не имеющий отношения к реальному делу. 19 minutes ago, jenya7 said: поэтому увидев такие пассажи в коде я решил узнать насколько это оправданно. :)) Ещё раз: для ответа на этот вопрос надо понимать уровень квалификации автора данного кода. Ну, а для себя можете сгенерить ассемблерный листинг с различными вариантами оптимизации кода, и посмотреть, что вытворяет компилятор. Или несколько компиляторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 83 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба 25 минут назад, jenya7 сказал: я хочу чтоб моя функция была безупречная. поэтому меня интересует все, и как будет распределена память, и быстрота исполнения, и размер, и генерность и.т.д и.т.п. Небезупречно. "Быстро, качественно, недорого - можно выбрать только два признака из трех." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 (изменено) · Жалоба 11 hours ago, haker_fox said: Ну, а для себя можете сгенерить ассемблерный листинг с различными вариантами оптимизации кода, и посмотреть, что вытворяет компилятор. Или несколько компиляторов. что то я не очень понимаю // 178 ILI9341_WriteCommand(0xCB); MOVS R0,#+203 BL ILI9341_WriteCommand // 179 { // 180 uint8_t data[] = { 0x39, 0x2C, 0x00, 0x34, 0x02 }; ADD R0,SP,#+32 LDR.W R1,??DataTable15_3 LDRD R2,R3,[R1, #+0] STRD R2,R3,[R0, #+0] // 181 ILI9341_WriteData(data, sizeof(data)); MOVS R1,#+5 ADD R0,SP,#+32 BL ILI9341_WriteData // 182 } // 193 ILI9341_WriteCommand(0xCF); MOVS R0,#+207 BL ILI9341_WriteCommand // 194 { // 195 uint8_t data[] = { 0x00, 0xC1, 0x30 }; ADD R0,SP,#+28 LDR.W R1,??DataTable15_4 LDR R2,[R1, #+0] STR R2,[R0, #+0] // 196 ILI9341_WriteData(data, sizeof(data)); MOVS R1,#+3 ADD R0,SP,#+28 BL ILI9341_WriteData // 197 } это та же область или разная ??DataTable15_3: DATA32 DC32 ?_0 SECTION `.text`:CODE:NOROOT(2) SECTION_TYPE SHT_PROGBITS, 0 DATA ??DataTable15_4: DATA32 DC32 ?_1 SECTION `.text`:CODE:NOROOT(2) SECTION_TYPE SHT_PROGBITS, 0 DATA судя по офсету на стеке разная. Изменено 12 ноября, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 (изменено) · Жалоба 33 minutes ago, jenya7 said: что то я не очень понимаю // 178 ILI9341_WriteCommand(0xCB); MOVS R0,#+203 BL ILI9341_WriteCommand // 179 { // 180 uint8_t data[] = { 0x39, 0x2C, 0x00, 0x34, 0x02 }; ADD R0,SP,#+32 LDR.W R1,??DataTable15_3 LDRD R2,R3,[R1, #+0] STRD R2,R3,[R0, #+0] // 181 ILI9341_WriteData(data, sizeof(data)); MOVS R1,#+5 ADD R0,SP,#+32 BL ILI9341_WriteData // 182 } // 193 ILI9341_WriteCommand(0xCF); MOVS R0,#+207 BL ILI9341_WriteCommand // 194 { // 195 uint8_t data[] = { 0x00, 0xC1, 0x30 }; ADD R0,SP,#+28 LDR.W R1,??DataTable15_4 LDR R2,[R1, #+0] STR R2,[R0, #+0] // 196 ILI9341_WriteData(data, sizeof(data)); MOVS R1,#+3 ADD R0,SP,#+28 BL ILI9341_WriteData // 197 } это та же область или разная ??DataTable15_3: DATA32 DC32 ?_0 SECTION `.text`:CODE:NOROOT(2) SECTION_TYPE SHT_PROGBITS, 0 DATA ??DataTable15_4: DATA32 DC32 ?_1 SECTION `.text`:CODE:NOROOT(2) SECTION_TYPE SHT_PROGBITS, 0 DATA судя по офсету на стеке разная. Про какие области вопрос? Если про DataTable, то, естественно, разные - это области из FLASH, откуда читаются команды. Если про передаваемые параметры (стек), то одинаковые. Точнее, начало одинаковое, а конец зависит от размера пакета. Изменено 12 ноября, 2020 пользователем Harvester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба 1 hour ago, Harvester said: Про какие области вопрос? Если про DataTable, то, естественно, разные - это области из FLASH, откуда читаются команды. Если про передаваемые параметры (стек), то одинаковые. Точнее, начало одинаковое, а конец зависит от размера пакета. так где располагается uint8_t data[]? и что тогда DataTable15_х? я вижу это секции выделенные во FLASH. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба 10 minutes ago, jenya7 said: так где располагается uint8_t data[]? Данные для его заполнения располагаются во флеш. Это и логично. При выключении питания эти данные не теряются. Затем, при входе в блок, копируется в ОЗУ на стэке. Перед вызовом функции записи в дисплей в одном регитре указан адрес скопированного массива на стэке. В другом регистре указан размер этого массива. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба 2 minutes ago, haker_fox said: Данные для его заполнения располагаются во флеш. Это и логично. При выключении питания эти данные не теряются. Затем, при входе в блок, копируется в ОЗУ на стэке. Перед вызовом функции записи в дисплей в одном регитре указан адрес скопированного массива на стэке. В другом регистре указан размер этого массива. ваще ничего не понимаю. от слова совсем. зачем мне локальные данные располагать во флеш? попользовался в функции и освободил ресурсы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба // 179 { // 180 uint8_t data[] = { 0x39, 0x2C, 0x00, 0x34, 0x02 }; ADD R0,SP,#+32 // В R0 поместили адрес указателя стэка со смещением LDR.W R1,??DataTable15_3 // В R1 загрузили адрес таблицы, где хранятся данные для массива data[] LDRD R2,R3,[R1, #+0] // LDRD загружает двойное слово в регистры R2:R3 из таблицы, на которую указывает R1 STRD R2,R3,[R0, #+0] // STRD загружает двойное слово из регистров R2:R3 в область на стэке, на которую указаывает R0 // 181 ILI9341_WriteData(data, sizeof(data)); MOVS R1,#+5 ADD R0,SP,#+32 BL ILI9341_WriteData // 182 } 1 minute ago, jenya7 said: зачем мне локальные данные располагать во флеш? Ну вы даёте. А где же вы их возьмете для заполнения массива во время выполнения программы? Где по вашему хранятся все строки для вывода на дисплеи и в консоли, константы и т.п. вещи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 (изменено) · Жалоба 4 minutes ago, jenya7 said: ваще ничего не понимаю. от слова совсем. зачем мне локальные данные располагать во флеш? попользовался в функции и освободил ресурсы. Вы передаете какие-то значения. Откуда их возьмет программа? Если константые данные помещаются в регистры, то их значение хранится в коде команды, как длина data[] в Вашем случае. Изменено 12 ноября, 2020 пользователем Harvester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба 2 minutes ago, haker_fox said: Ну вы даёте. А где же вы их возьмете для заполнения массива во время выполнения программы? Где по вашему хранятся все строки для вывода на дисплеи и в консоли, константы и т.п. вещи? расположу в стеке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба 20 minutes ago, jenya7 said: расположу в стеке? Э... возьмите таймаут часа на два. Отдохните. Затем перечитайте тему и ответы. И сформулируйте адекватный вопрос. Неплохо бы начать что-то изучать по Си для начала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба Just now, haker_fox said: Э... возьмите таймаут часа на два. Отдохните. Затем перечитайте тему и ответы. И сформулируйте адекватный вопрос. Неплохо бы начать что-то изучать по Си для начала. локальные переменные распологаются на стеке, нет? это как бы его предназначение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться