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

Строка - хранить или нет

Я могу сохранить строку
 

static const char* const ok = "Data Save OK\r";

static const char* const err = "Data Save ERROR\r";

и потом использовать в функции.

или создать строку динамически в функции

uint32_t COM_Save(uint32_t argc, char** args)
{
    int status;
    
    char ok[] = "Data Save OK\r";
    char err[] = "Data Save ERROR\r";
    
    status = FLASH_WriteSerializedData(FLASH_PARAM_PAGE);
     
    if (status == 0)  
        SYS_SendData(ok);
    else
       SYS_SendData(err);
    
    return MSG_OK;
}

что лучше? прогрузить стак или флэш?

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


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

3 minutes ago, jenya7 said:

прогрузить стак или флэш?

Странный вопрос. А в стек строка откуда загрузится?

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


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

2 minutes ago, aaarrr said:

Странный вопрос. А в стек строка откуда загрузится?

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

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


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

Думать надо регулярно.

Данные в переменную на стеке кто будет загружать и откуда ?

P.S. Из приведенного фрагмента понятно, что думать надо больше.

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


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

12 minutes ago, jenya7 said:

что лучше? прогрузить стак или флэш?

Странный вопрос. Флеш вы и так "прогрузите".

5 minutes ago, jenya7 said:

и при выходе из функции удалиться

Скажем так, указатель стэка будет прирощен на размер вашей строки, а данные ещё какое-то время побудут там (озу), пока эта область памяти не понадобится другой задаче.

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


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

24 minutes ago, haker_fox said:

Странный вопрос. Флеш вы и так "прогрузите".

Скажем так, указатель стэка будет прирощен на размер вашей строки, а данные ещё какое-то время побудут там (озу), пока эта область памяти не понадобится другой задаче.

в листинге вижу

849              char ok[] = "Data Save OK\r";
   \        0xC   0x4668             MOV      R0,SP
   \        0xE   0x....             LDR.N    R1,??DataTable16_50
   \       0x10   0x2210             MOVS     R2,#+16
   \       0x12   0x....'....        BL       __aeabi_memcpy4

но я не вижу чтоб DataTable16_50 где то освобождался.

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


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

4 minutes ago, jenya7 said:

но я не вижу чтоб DataTable16_50 где то освобождался

Кто ж его из флеш освободит-то?

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


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

23 minutes ago, aaarrr said:

Кто ж его из флеш освободит-то?

то есть мы приходим к первому варианту?

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


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

Женя, подумайте о том, где хранятся строки, пока контроллер отключен от питания, и о том, откуда они загружаются в ОЗУ...

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


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

8 minutes ago, demiurg_spb said:

Женя, подумайте о том, где хранятся строки, пока контроллер отключен от питания, и о том, откуда они загружаются в ОЗУ...

Подумал :). Рабочий регистр не может хранить строку, он может получить только указатель на строку.

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


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

16 minutes ago, jenya7 said:

то есть мы приходим к первому варианту?

Внезапно, да! То есть второй вариант подобен первому, но с копированием строки из флеш в ОЗУ и повышенным расходом стека.

 

2 minutes ago, jenya7 said:

Рабочий регистр не может хранить строку, он может получить только указатель на строку.

Ой! Зря я сорвал покровы и открыл тайное знание в предыдущем сообщении.

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


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

10 hours ago, jenya7 said:

или создать строку динамически в функции

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

uint32_t COM_Save(uint32_t argc, char** args)
{
    int status;
    
    static const char ok[] = "Data Save OK\r";
    static const char err[] = "Data Save ERROR\r";
    
    status = FLASH_WriteSerializedData(FLASH_PARAM_PAGE);
     
    if (status == 0)  
        SYS_SendData(ok);
    else
       SYS_SendData(err);
    
    return MSG_OK;
}

 

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


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

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

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

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

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

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

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

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

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

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