|
Не могу выполнить команду strcpy над массивами, Один массив во флешь. другой в оперативке |
|
|
|
Feb 21 2007, 06:52
|

Местный
  
Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517

|
Вот код. Думаю, что неправильно объявляю переменные char temp_inf[]=""; __flash char const knopka2[]={"knopka2"}; strcpy(temp_inf, knopka2); эту строчку не хочет компелить Где ошибка  ? Или подскажите плиз, как это правильно делается
|
|
|
|
|
Feb 21 2007, 08:52
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

|
Цитата(*SERG @ Feb 21 2007, 09:52)  Вот код. Думаю, что неправильно объявляю переменные char temp_inf[]=""; __flash char const knopka2[]={"knopka2"}; strcpy(temp_inf, knopka2); эту строчку не хочет компелить Где ошибка  ? Или подскажите плиз, как это правильно делается Я наверное сейчас глупость скажу  А вдруг в компиляторе реализована возможность копирования данных расположенных только на одном устройстве, т.е. temp_inf и knopka2 - должны быть расположены обе во flash или обе в ОЗУ. Или такого быть не может?
|
|
|
|
|
Feb 21 2007, 10:01
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(*SERG @ Feb 21 2007, 05:52)  strcpy(temp_inf, knopka2); эту строчку не хочет компелить Где ошибка  ? Ошибка в том, что вы используете функцию, которой необходимо, чтобы обе строки были в ОЗУ. Для доступа во флеш используются совсем другие команды ассемблера. Поищите подходящую функцию в pgmspace.h Цитата(*SERG @ Feb 21 2007, 08:57)  Так понял что можно ещё через указатель работать, как лучше то? Что значит "еще"? ваши temp_inf и knopka2 и есть самые настоящие указатели.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 21 2007, 12:56
|

Местный
  
Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517

|
Цитата(Сергей Борщ @ Feb 21 2007, 10:01)  Цитата(*SERG @ Feb 21 2007, 05:52)  strcpy(temp_inf, knopka2); эту строчку не хочет компелить Где ошибка  ? Ошибка в том, что вы используете функцию, которой необходимо, чтобы обе строки были в ОЗУ. Для доступа во флеш используются совсем другие команды ассемблера. Поищите подходящую функцию в pgmspace.h Цитата(*SERG @ Feb 21 2007, 08:57)  Так понял что можно ещё через указатель работать, как лучше то? Что значит "еще"? ваши temp_inf и knopka2 и есть самые настоящие указатели. Вот пример из пдф, что же тогда за переменная msg Examples A program defines a couple of strings that are stored in flash memory: __flash char str1[] = "Message 1"; __flash char str2[] = "Message 2"; The program creates a __flash pointer to point to one of these strings, and assigns it to str1: char __flash *msg; msg=str1;
|
|
|
|
|
Feb 21 2007, 14:47
|

Местный
  
Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517

|
Цитата(prottoss @ Feb 21 2007, 13:20)  Цитата(*SERG @ Feb 21 2007, 16:56)  Вот пример из пдф, что же тогда за переменная msg Examples A program defines a couple of strings that are stored in flash memory: __flash char str1[] = "Message 1"; __flash char str2[] = "Message 2"; The program creates a __flash pointer to point to one of these strings, and assigns it to str1: char __flash *msg; msg=str1; str1, str2 и msg - УКАЗАТЕЛИ НА ТИП __flash charТ.е. в перменной msg находиться адрес начала массива str1, так чтоли? И если так, то каким образом массив из флешь в озу можно переписать?
|
|
|
|
|
Feb 21 2007, 15:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(*SERG @ Feb 21 2007, 13:47)  Т.е. в перменной msg находиться адрес начала массива str1, так чтоли? Нет массива str1. Не существует в С понятия "массив". Существуют лишь указатели, и благодаря записи ptr[index] которая тождественна записи *(ptr + index) они могут казаться массивами. Поэтому str1 - это указатель, он хранит адрес того места, в котором размещена строка. Причем поскольку он у вас не константный, вы можете случайно написать str1=str2 и долго потом искать куда же делась первая строка  Цитата(*SERG @ Feb 21 2007, 13:47)  И если так, то каким образом массив из флешь в озу можно переписать? ищите в том же pgmspace.h аналог функции memcpy.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 21 2007, 19:15
|

Местный
  
Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517

|
Цитата(Сергей Борщ @ Feb 21 2007, 15:19)  Цитата(*SERG @ Feb 21 2007, 13:47)  Т.е. в перменной msg находиться адрес начала массива str1, так чтоли?
Нет массива str1. Не существует в С понятия "массив". Существуют лишь указатели, и благодаря записи ptr[index] которая тождественна записи *(ptr + index) они могут казаться массивами. Поэтому str1 - это указатель, он хранит адрес того места, в котором размещена строка. Причем поскольку он у вас не константный, вы можете случайно написать str1=str2 и долго потом искать куда же делась первая строка  Цитата(*SERG @ Feb 21 2007, 13:47)  И если так, то каким образом массив из флешь в озу можно переписать? ищите в том же pgmspace.h аналог функции memcpy. Понятно, запишу как const char  Спасибо! Цитата(prottoss @ Feb 21 2007, 16:00)  Цитата(*SERG @ Feb 21 2007, 18:47)  каким образом массив из флешь в озу можно переписать? Очч просто, и не надо ничего искать Код void ctrcpy_F(void __flash *fptr, void *sptr){ char byte; char *sp = (char*)sptr; char *fp = (char*)fptr;
while(0 != (byte = *fp++))/* массив fptr обязательно должен заканчиваться нулем, а массив sptr иметь размер равный или больший размеру fptr */ *sptr++ = byte; } Чёт мне до таких наворотов ещё рановато, надож ещё и понимать что пишешь, что в слепую о перекатывать Пока пишу так __flash char END[]={0X0D,0X0A}; char temp_inf_usapp[razmer_mas]=""; strcpy_P(temp_inf_flash,END) а потом работаю с temp_inf_flash Или это не правельно? Копилятор вроде не ругается  И Вам спасибо!)
|
|
|
|
|
Feb 21 2007, 19:31
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(*SERG @ Feb 21 2007, 23:15)  Цитата(Сергей Борщ @ Feb 21 2007, 15:19)  Цитата(*SERG @ Feb 21 2007, 13:47)  Т.е. в перменной msg находиться адрес начала массива str1, так чтоли?
Нет массива str1. Не существует в С понятия "массив". Существуют лишь указатели, и благодаря записи ptr[index] которая тождественна записи *(ptr + index) они могут казаться массивами. Поэтому str1 - это указатель, он хранит адрес того места, в котором размещена строка. Причем поскольку он у вас не константный, вы можете случайно написать str1=str2 и долго потом искать куда же делась первая строка Цитата(*SERG @ Feb 21 2007, 13:47)  И если так, то каким образом массив из флешь в озу можно переписать? ищите в том же pgmspace.h аналог функции memcpy. Понятно, запишу как const char  Спасибо! Цитата(prottoss @ Feb 21 2007, 16:00)  Цитата(*SERG @ Feb 21 2007, 18:47)  каким образом массив из флешь в озу можно переписать? Очч просто, и не надо ничего искать Код void ctrcpy_F(void __flash *fptr, void *sptr){ char byte; char *sp = (char*)sptr; char *fp = (char*)fptr;
while(0 != (byte = *fp++))/* массив fptr обязательно должен заканчиваться нулем, а массив sptr иметь размер равный или больший размеру fptr */ *sptr++ = byte; } Чёт мне до таких наворотов ещё рановато, надож ещё и понимать что пишешь, что в слепую о перекатывать Пока пишу так __flash char END[]={0X0D,0X0A}; char temp_inf_usapp[razmer_mas]=""; strcpy_P(temp_inf_flash,END) а потом работаю с temp_inf_flash Или это не правельно? Копилятор вроде не ругается  И Вам спасибо!) Блин!!! счас только заметил, что не правильный код написал Вам. Сорри  Переписываю с подробными комментариями Код void strcpy_F(void __flash *fptr, void *sptr){ char byte;
/* Так как входные указатели имеют "пустой" тип (а это, между прочим, очень удобно, допустим при передаче указателей типов, отличных от char) преобразуем их к типу char */ char *sp = (char*)sptr; /* преобразовываем указатель к типу char */ char __flash *fp = (char*)fptr; /* преобразовываем указатель к типу __flash char */
/* Массив fptr обязательно должен заканчиваться нулем, а массив sptr иметь размер равный или больший размеру fptr. Нижележащая строчка копирует данные в byte по указателю fp, инкрементирует этот указатель, и проверяет byte на равенство нулю. Если byte НЕ равен нулю, выполняется тело цикла, иначе выход */ while(0 != (byte = *fp++))
*sp++ = byte; /* записываем байт по указателю sp и инкрементируем указатель для следующего байта */ }
--------------------
|
|
|
|
|
Feb 21 2007, 19:50
|

Местный
  
Группа: Свой
Сообщений: 274
Регистрация: 10-08-05
Из: Екатеринбург
Пользователь №: 7 517

|
Цитата(prottoss @ Feb 21 2007, 19:31)  Цитата(*SERG @ Feb 21 2007, 23:15)  Цитата(Сергей Борщ @ Feb 21 2007, 15:19)  Цитата(*SERG @ Feb 21 2007, 13:47)  Т.е. в перменной msg находиться адрес начала массива str1, так чтоли?
Нет массива str1. Не существует в С понятия "массив". Существуют лишь указатели, и благодаря записи ptr[index] которая тождественна записи *(ptr + index) они могут казаться массивами. Поэтому str1 - это указатель, он хранит адрес того места, в котором размещена строка. Причем поскольку он у вас не константный, вы можете случайно написать str1=str2 и долго потом искать куда же делась первая строка Цитата(*SERG @ Feb 21 2007, 13:47)  И если так, то каким образом массив из флешь в озу можно переписать? ищите в том же pgmspace.h аналог функции memcpy. Понятно, запишу как const char  Спасибо! Цитата(prottoss @ Feb 21 2007, 16:00)  Цитата(*SERG @ Feb 21 2007, 18:47)  каким образом массив из флешь в озу можно переписать? Очч просто, и не надо ничего искать Код void ctrcpy_F(void __flash *fptr, void *sptr){ char byte; char *sp = (char*)sptr; char *fp = (char*)fptr;
while(0 != (byte = *fp++))/* массив fptr обязательно должен заканчиваться нулем, а массив sptr иметь размер равный или больший размеру fptr */ *sptr++ = byte; } Чёт мне до таких наворотов ещё рановато, надож ещё и понимать что пишешь, что в слепую о перекатывать Пока пишу так __flash char END[]={0X0D,0X0A}; char temp_inf_usapp[razmer_mas]=""; strcpy_P(temp_inf_flash,END) а потом работаю с temp_inf_flash Или это не правельно? Копилятор вроде не ругается  И Вам спасибо!) Блин!!! счас только заметил, что не правильный код написал Вам. Сорри  Переписываю с подробными комментариями Код void strcpy_F(void __flash *fptr, void *sptr){ char byte;
/* Так как входные указатели имеют "пустой" тип (а это, между прочим, очень удобно, допустим при передаче указателей типов, отличных от char) преобразуем их к типу char */ char *sp = (char*)sptr; /* преобразовываем указатель к типу char */ char __flash *fp = (char*)fptr; /* преобразовываем указатель к типу __flash char */
/* Массив fptr обязательно должен заканчиваться нулем, а массив sptr иметь размер равный или больший размеру fptr. Нижележащая строчка копирует данные в byte по указателю fp, инкрементирует этот указатель, и проверяет byte на равенство нулю. Если byte НЕ равен нулю, выполняется тело цикла, иначе выход */ while(0 != (byte = *fp++))
*sp++ = byte; /* записываем байт по указателю sp и инкрементируем указатель для следующего байта */ } Понял местами (ну есть за что зацепится, книжку почитаю), спасибо! Ну как я пишу вроде как более читабельней
|
|
|
|
|
Feb 21 2007, 19:57
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(*SERG @ Feb 21 2007, 18:15)  Пока пишу так __flash char END[]={0X0D,0X0A}; char temp_inf_usapp[razmer_mas]=""; strcpy_P(temp_inf_flash,END) а потом работаю с temp_inf_flash Или это не правельно? Копилятор вроде не ругается  И Вам спасибо!) Почти. Поскольку вы выбрали функцию strcpy_P, ваши "массивы" являются строками. В идеологии С строка - это последовательность байт, оканчивающаяся нулем. Именно по этому нулю строковые функции определяют длину строки (вы ведь не передаете в strcpy_P размер). А ваш массив END содержит всего два байта и нулем не оканчивается. Резюме - это будет работать, если по случайному стечению обстоятельств следующий за END байт во флеш окажется нулевым. Лечить просто: либо __flash char END[]={0X0D,0X0A,0x00}; либо __flash char END[]="\r\n"; либо __flash char END[]="\x0D\x0A"; Вот теперь должно работать. А функцию имени protossa разберите, будет очень полезно - именно так и работает strcpy_P.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|