2012-01-20 3 views
2

В моем ISR У меня есть буфер, который получает чучело от USART, поэтому я объявил буфер в качестве летучего:Передачи летучего массива strncpy

volatile uint8_t RxBuffer1[BUFFER_LENGTH]; 

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

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

strncpy(Data, RxBuffer1, len); 

Да, но это не нет! мой компилятор послушно говорит мне:

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

поскольку strncpy делает «s2» константный символ *

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

+0

Вы можете применить его к const char *. –

+1

Дин динг динг. у нас есть победитель! Спасибо. Это действительно избавилось от ошибки, но я нервничаю по этому поводу. Я действительно просто маскирую проблему или это действительно так, как это делают «профи»? – user1160866

ответ

1

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

+0

Ну, мне нужно оживить эту тему. Я сделал некоторые изменения по другим причинам, и теперь эта строка не работает снова.Вот подробности: – user1160866

+0

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

1

Я думаю, что лучше использовать 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

Нет радости. memcpy делает то же самое, что и strncpy в отношении этой ошибки. Кастинг как (const char *) сделал это. – user1160866

+0

Я просто хотел отметить, что да, вы правы, memcpy будет лучше в этой ситуации, но это просто не решило проблему кастинга. Спасибо за помощь. – user1160866

-1

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

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

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

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