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

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

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));

    // и так далее

}

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

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

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


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

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

Например в процессе работы первой функции...

Да все это понятно, но мы совершенно о другом говорили, а именно о распределении памяти локальных объектов внутри одной функции, но в разных блоках.

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


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

1 hour ago, haker_fox said:

Автор темы не @Arlleex:blum: А @jenya7 действительно не понятно чего хочет.

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

поэтому увидев такие пассажи в коде я решил узнать насколько это оправданно. :))

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

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


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

18 minutes ago, jenya7 said:

я хочу чтоб моя функция была безупречная.

По каким критериям безупречная: оформление кода на языке высокого уровня, расход памяти или по скорости выполнения? Просто "безупречная" это из области фантастики, не имеющий отношения к реальному делу.

19 minutes ago, jenya7 said:

поэтому увидев такие пассажи в коде я решил узнать насколько это оправданно. :))

Ещё раз: для ответа на этот вопрос надо понимать уровень квалификации автора данного кода. Ну, а для себя можете сгенерить ассемблерный листинг с различными вариантами оптимизации кода, и посмотреть, что вытворяет компилятор. Или несколько компиляторов.

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


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

25 минут назад, jenya7 сказал:

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

Небезупречно. "Быстро, качественно, недорого - можно выбрать только два признака  из трех."

 

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


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

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

судя по офсету на стеке разная.

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

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


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

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, откуда читаются команды.

Если про передаваемые параметры (стек), то одинаковые. Точнее, начало одинаковое, а конец зависит от размера пакета.

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

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


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

1 hour ago, Harvester said:

Про какие области вопрос?

Если про DataTable, то, естественно, разные - это области из FLASH, откуда читаются команды.

Если про передаваемые параметры (стек), то одинаковые. Точнее, начало одинаковое, а конец зависит от размера пакета.

 

так где располагается uint8_t data[]? и что тогда DataTable15_х?  я вижу это секции выделенные во FLASH.

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


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

10 minutes ago, jenya7 said:

так где располагается uint8_t data[]?

Данные для его заполнения располагаются во флеш. Это и логично. При выключении питания эти данные не теряются. Затем, при входе в блок, копируется в ОЗУ на стэке. Перед вызовом функции записи в дисплей в одном регитре указан адрес скопированного массива на стэке. В другом регистре указан размер этого массива.

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


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

2 minutes ago, haker_fox said:

Данные для его заполнения располагаются во флеш. Это и логично. При выключении питания эти данные не теряются. Затем, при входе в блок, копируется в ОЗУ на стэке. Перед вызовом функции записи в дисплей в одном регитре указан адрес скопированного массива на стэке. В другом регистре указан размер этого массива.

ваще ничего не понимаю. от слова совсем.  зачем мне локальные данные располагать во флеш? попользовался в функции и освободил ресурсы.

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


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

//  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:

зачем мне локальные данные располагать во флеш?

Ну вы даёте. А где же вы их возьмете для заполнения массива во время выполнения программы? Где по вашему хранятся все строки для вывода на дисплеи и в консоли, константы и т.п. вещи?

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


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

4 minutes ago, jenya7 said:

ваще ничего не понимаю. от слова совсем.  зачем мне локальные данные располагать во флеш? попользовался в функции и освободил ресурсы.

Вы передаете какие-то значения. Откуда их возьмет программа?

Если константые данные помещаются в регистры, то их значение хранится в коде команды, как длина data[] в Вашем случае.

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

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


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

2 minutes ago, haker_fox said:

Ну вы даёте. А где же вы их возьмете для заполнения массива во время выполнения программы? Где по вашему хранятся все строки для вывода на дисплеи и в консоли, константы и т.п. вещи?

расположу в стеке?

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


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

20 minutes ago, jenya7 said:

расположу в стеке?

Э... возьмите таймаут часа на два. Отдохните. Затем перечитайте тему и ответы. И сформулируйте адекватный вопрос. Неплохо бы начать что-то изучать по Си для начала.

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


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

Just now, haker_fox said:

Э... возьмите таймаут часа на два. Отдохните. Затем перечитайте тему и ответы. И сформулируйте адекватный вопрос. Неплохо бы начать что-то изучать по Си для начала.

локальные переменные распологаются на стеке, нет? это как бы его предназначение.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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