2015-08-23 2 views
0

Есть ли предел для коротких строк, где использование макроса F() приносит больше оперативной памяти, а затем сохраняется?Существует ли минимальная длина строки для F()?

For (надуманный) Например:

Serial.print(F("\n")); 
Serial.print(F("Hi")); 
Serial.print(F("there!")); 
Serial.print(F("How do you doyou how?")); 

ли какой-либо один из них будет более эффективным без F()?

Я предполагаю, что он использует некоторую ОЗУ для перебора по строке и копирования ее из PROGMEM в RAM. Я думаю, вопрос в том, сколько? Кроме того, здесь есть фрагментация кучи?

Я рассматриваю это исключительно с точки зрения сохранения SRAM.

+0

Макрос F() используется для хранения строки во флэш-памяти, полную документацию можно посмотреть в http://playground.arduino.cc/Learning/Memory. Зависит от того, как вы хотите использовать свою строку, вы можете подумать о скорости доступа для флэш-памяти или sram, для этого вы можете увидеть http://arduino.stackexchange.com/questions/221/what-can-i-do-if-i -run-из-флэш-памяти или-SRAM. – user1929959

+0

@ user1929959 В «полной документации» есть полное предложение на макросе 'F()'. Я ясно дал понять, что «я рассматриваю это исключительно с точки зрения сохранения SRAM» в моем вопросе. – frnhr

+0

Единственный правильный ответ - это зависит от этого, поэтому это не по теме: мнение основано и слишком широкое, поскольку объяснение того, как профилировать это, займет больше, чем разрешено в окне ответа. –

ответ

0

Я не думаю, что минимальный размер строки будет полезен. Если вы посмотрите на то, как Выведение осуществляется в Print.cpp:

size_t Print::print(const __FlashStringHelper *ifsh) 
{ 
    PGM_P p = reinterpret_cast<PGM_P>(ifsh); 
    size_t n = 0; 
    while (1) { 
    unsigned char c = pgm_read_byte(p++); 
    if (c == 0) break; 
    n += write(c); 
    } 
    return n; 
} 

Вы можете видеть оттуда, что только один байт памяти используется в то время (плюс несколько переменных), так как она тянет строка из PROGMEM байта за раз. Все они находятся в стеке, поэтому никаких накладных расходов нет.

Я предполагаю, что он использует некоторую ОЗУ для перебора по строке и копирования ее из PROGMEM в RAM. Я думаю, вопрос в том, сколько?

Нет, это не так, как я показал выше. Это выходы байт за раз. Сначала не копируется (навалом) строка в RAM.

Кроме того, здесь есть фрагментация кучи?

Нет, код не использует кучу.

Смежные вопросы