jenya7 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба Я могу сохранить строку 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; } что лучше? прогрузить стак или флэш? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 3 minutes ago, jenya7 said: прогрузить стак или флэш? Странный вопрос. А в стек строка откуда загрузится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 2 minutes ago, aaarrr said: Странный вопрос. А в стек строка откуда загрузится? во втором случае она будет создана динамически на стеке я думаю. и при выходе из функции удалиться. как любая локальная переменная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба Думать надо регулярно. Данные в переменную на стеке кто будет загружать и откуда ? P.S. Из приведенного фрагмента понятно, что думать надо больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 12 minutes ago, jenya7 said: что лучше? прогрузить стак или флэш? Странный вопрос. Флеш вы и так "прогрузите". 5 minutes ago, jenya7 said: и при выходе из функции удалиться Скажем так, указатель стэка будет прирощен на размер вашей строки, а данные ещё какое-то время побудут там (озу), пока эта область памяти не понадобится другой задаче. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 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 где то освобождался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 4 minutes ago, jenya7 said: но я не вижу чтоб DataTable16_50 где то освобождался Кто ж его из флеш освободит-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 23 minutes ago, aaarrr said: Кто ж его из флеш освободит-то? то есть мы приходим к первому варианту? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба Женя, подумайте о том, где хранятся строки, пока контроллер отключен от питания, и о том, откуда они загружаются в ОЗУ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 8 minutes ago, demiurg_spb said: Женя, подумайте о том, где хранятся строки, пока контроллер отключен от питания, и о том, откуда они загружаются в ОЗУ... Подумал :). Рабочий регистр не может хранить строку, он может получить только указатель на строку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 16 minutes ago, jenya7 said: то есть мы приходим к первому варианту? Внезапно, да! То есть второй вариант подобен первому, но с копированием строки из флеш в ОЗУ и повышенным расходом стека. 2 minutes ago, jenya7 said: Рабочий регистр не может хранить строку, он может получить только указатель на строку. Ой! Зря я сорвал покровы и открыл тайное знание в предыдущем сообщении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться