Передача энергозависимого массива в strncpy - PullRequest
2 голосов
/ 20 января 2012

В моем ISR у меня есть буфер, который заполняется из USART, поэтому я объявил буфер как volatile:

volatile uint8_t RxBuffer1[BUFFER_LENGTH];

Хорошо, проблем нет. Я считаю, что это стандартная практика.

Где-то в main () мне нужно скопировать часть этого массива, так как массив является кольцевым буфером и будет уничтожен в будущем:

strncpy(Data, RxBuffer1, len);

О, но это нет, нет! мой компилятор покорно говорит мне:

передача аргумента 2 из 'strncpy' отбрасывает квалификатор 'volatile' из целевого типа указателя

, поскольку strncpy делает 's2' постоянным символом *

Я не думаю, что я делаю что-то, что не было сделано в качестве стандартной практики. Как мне сделать это правильно?

Ответы [ 3 ]

1 голос
/ 20 января 2012

Приведите аргумент, переданный const char *

1 голос
/ 20 января 2012

Я думаю, что лучше использовать memcpy в этом случае.Strcpy и strncpy оптимизированы для строк (массивов символов).

Синтаксис похож на strncpy:

void* memcpy (void* dest, void* src, size_t bytes);

В вашем случае:

memcpy (Data, RxBuffer1, sizeof(uint8_t) * len);

(можноопустите sizeof (uint8_t), поскольку он равен 1).

0 голосов
/ 04 октября 2013

Почти наверняка безопасно сбросить энергозависимость, но технически это зависит от компилятора.

Volatile просто указывает компилятору не применять оптимизацию, когда он помещает копию некоторой памяти в регистр, и использует ее вместо того, чтобы каждый раз возвращаться и читать память.

В приложении, о котором вы говорите, вас волнует то, что memcpy не должен возвращать те же данные, что и в прошлый раз, когда вы вызывали его, потому что он не перечитал буфер. Но на практике это вряд ли будет реализовано таким образом, поскольку это будет означать, что компилятор хранит вещи в регистрах через вызовы функций. Это теоретически возможно, но это не имеет большого смысла.

И вы почти наверняка не заботитесь о том, чтобы memcpy оптимизировал последующие копии одной и той же памяти в рамках одного вызова memcpy.

...