реклама на сайте
подробности

 
 
> процедура с указателем на строку в памяти программ, помогите разобраться
chief_olimp
сообщение Dec 24 2008, 14:39
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Здраствуйте. Ткните где не так кто знает пожалуйста
Код
unsigned char blabla[] = "blablabla";
/// текст и все такое
void find (unsigned char *findbuff)
{
    unsigned int i;
    while (*findbuff != '\0')
   {
    USART0_OutBuf[i++] = *findbuff;
    findbuff++;
   }
}
int main (void)
{
find (blabla);
}

т.е. программа какие то данные из ОЗУ грузит в процедуру и что то так с ними делает
Скажите пожалуйста как такое же провернуть со строкой типа
Код
unsigned char PROGMEM blabla[] = "blablabla";

Спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rokhan
сообщение Dec 25 2008, 08:23
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-04-06
Пользователь №: 16 129



Я просто в шоке.

думаю мои и быстрее и веселее

Цитата
#define bool int //в зависимости от системы char|word|int|long|int64
/* если нет strlen и memcmp
inline int strlen(char* ins)
{
int i=0;
while(ins[i++]);
return i;
}

inline int memcmp(char* in1,char* in2,int cc)
{
int i=0;
while(cc--)
{
if(in1[cc]!=in2[cc])
return -1;
};

return 0;
}
*/

bool find(char* inb)
{
bool retval=-1;
char inc=*inb;
int i=0;
int slen=strlen(inb);
int pp=USART0_InBufSize-slen;

while(i<pp)
{
if(USART0_InBuf[i]==inc)
if(memcmp(&USART0_InBuf[i],inb,slen)==0)
{
retval=i;
break;
}
i++;
}
return retval;
}


в вашем случае - при использовании глобальных переменных - меняется

Цитата
void find(char* inb)
{
fndOK=-1;
char inc=*inb;
int i=0;
int slen=strlen(inb);
int pp=USART0_InBufSize-slen;

while(i<pp)
{
if(USART0_InBuf[i]==inc)
if(memcmp(&USART0_InBuf[i],inb,slen)==0)
{
fndOK=i;
break;
}
i++;
}
}



блин как тут пробелов наставить?

Сообщение отредактировал rokhan - Dec 25 2008, 08:26
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 25 2008, 11:44
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Код
void find(char* inb)
{
fndOK=-1;
char inc=*inb;
int i=0;
int slen=strlen(inb);
int pp=USART0_InBufSize-slen;

while(i<pp)
{
if(USART0_InBuf[i]==inc)
if(memcmp(&USART0_InBuf[i],inb,slen)==0)
{
fndOK=i;
break;
}
i++;
}
}


ну не работает у меня этот код с строкой в программе типа
Код
find (text_clcc);
где
Код
PROGMEM char text_clcc[] = "clcc";

И еще не смотря на компактность написания мой код на две строчки длинее всего.
Может автор сможет лучше с моим кодом сравнить по объему и быстродействию. Буду очень признателен. Сам я с асма только перелез и это моя первая программа на си. Поэтому и функциями библиотечными мало пользуюсть так как мало о них знаю.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2008, 12:05
Сообщение #4


Гуру
******

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



Цитата(chief_olimp @ Dec 25 2008, 13:44) *
Сам я с асма только перелез и это моя первая программа на си. Поэтому и функциями библиотечными мало пользуюсть так как мало о них знаю.
Ну так и надо начать программирование с изучения документации. С чтения WinAVR/doc/avr-libc/FAQ.htm и остальной документации в этой папке. Хотя бы тех разделов, в которых поиск находит слово PROGMEM.
Если вы писали на асме, то должны четко представлять, что для обращения к данным в озу используются команды LD, LDD, LDS, а для чтения из программной памяти - LPM. И должны понимать, что компилятор не может только по значению обычного указателя понимать, какую команду использовать. Иными словами, функции strlen(), memcmp() не могут работать и со строками в ОЗУ и со строками во флеше. Чтобы обойти эту нестыковку стандарта языка С и процессоров с несколькими адресными пространствами придуманы аналоги этих функций для работы с флеш. Еще в ответе №4 Tiro вам подсказал, где вы можете найти ответ. Вы не читаете ответов или не хотите следовать данным в них советам? Вы не хотите прочитать документацию? Тогда неудивительно, что код не работает и "так мало о них знаю".
Код
void find(prog_char const * inb)
{
    prog_char const * found = strstr_P(USART0_InBuf, inb);
    if (!found)
        fndOK=-1;
    else
        fndOK = found - USART0_InBuf;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 25 2008, 12:18
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Документацию я как раз читаю. Только напоминаю я на си пишу месяц с лишним. Скажите у Вас у самого код что сверху работает со словами из FLASH? Мой код у меня работает и меня лично вполне устаивает. Здесь же вместо того что бы подсказать посылают по ссылкам которые я уже читал и эти знания успешно применяю в других кусках программы. Код что выше у меня не работает, и выдает ошибку что не понимает аттрибута функции.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 25 2008, 13:44
Сообщение #6


Гуру
******

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



Цитата(chief_olimp @ Dec 25 2008, 14:18) *
Скажите у Вас у самого код что сверху работает со словами из FLASH?
Конкретно этот не проверял, но если в pgmspace.h описан прототип extern char *strstr_P(const char *, PGM_P); то у меня нет основания сомневаться в том, что первый агрумент - указатель на строку в ОЗУ, а второй - на строку в flash. Описание стандартной функции strstr гласит:
Цитата
Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.
А это именно то, что требуется, судя по вашему исходнику.
Цитата(chief_olimp @ Dec 25 2008, 14:18) *
Мой код у меня работает и меня лично вполне устаивает.
Весьма сомнительно - в вашем коде нет обращения к flash.
Цитата(chief_olimp @ Dec 25 2008, 14:18) *
Код что выше у меня не работает, и выдает ошибку что не понимает аттрибута функции.
Тренировки в телепатии, безусловно, полезны. Но пока мы не достигли совершенства в этой области неплохо было бы приводить конкретную строку, на которую выдается ошибка и конкретный текст ошибки. Мой код прекрасно компилируется:
CODE
main.cpp:
#include <avr\pgmspace.h>
char USART0_InBuf[10];
int fndOK;
void find(prog_char const * inb)
{
prog_char const * found = strstr_P(USART0_InBuf, inb);
if (!found)
fndOK=-1;
else
fndOK = found - USART0_InBuf;
}

main.lst:
531 .section .text._Z4findPKc,"ax",@progbits
532 .global _Z4findPKc
534 _Z4findPKc:
535 .LFB37:
536 .LSM79:
537 /* prologue: frame size=0 */
538 /* prologue end (size=0) */
539 .LVL13:
540 .LBB23:
541 .LSM80:
542 0000 BC01 movw r22,r24 ; inb, inb
543 0002 80E0 ldi r24,lo8(USART0_InBuf) ; ,
544 0004 90E0 ldi r25,hi8(USART0_InBuf) ; ,
545 .LVL14:
546 0006 00D0 rcall strstr_P ;
547 .LVL15:
548 .LSM81:
549 0008 0097 sbiw r24,0 ; found
550 .LVL16:
551 000a 01F4 brne .L64 ; ,
552 .LSM82:
553 000c 8FEF ldi r24,lo8(-1) ; tmp45,
554 000e 9FEF ldi r25,hi8(-1) ; tmp45,
555 .LVL17:
556 0010 00C0 rjmp .L68 ;
557 .LVL18:
558 .L64:
559 .LSM83:
560 0012 8050 subi r24,lo8(USART0_InBuf) ; found,
561 0014 9040 sbci r25,hi8(USART0_InBuf) ; found,
562 .L68:
563 0016 9093 0000 sts (fndOK)+1,r25 ; fndOK, found
564 001a 8093 0000 sts fndOK,r24 ; fndOK, found
565 001e 0895 ret
566 .LBE23:
567 /* epilogue: frame size=0 */
568 /* epilogue: noreturn */
569 /* epilogue end (size=0) */
570 /* function void find(const prog_char*) size 16 (16) */


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение Dec 25 2008, 14:22
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



Обращение есть.
CODE
void find (const void *findbuff)
{
findOK = false;
unsigned int i=0;
unsigned char temp,j=0;
pointer = 0;
while(1)
{
temp = pgm_read_byte(findbuff++);
if(temp==0) break;
FIND[i++] = temp;
}
i=0;
while (i != USART0_InBufSize)
{
if (USART0_InBuf[i] == FIND[j])
{
i++;j++;findOK = true;
if (FIND[j] == 0x00)
{
pointer = i;
break;
}
}
else
{
i++;
if (findOK == true)
{
i = i-j; j=0;
findOK = false;
}
}
}
}

Но перед вами снимаю шляпу. Три страницы нужно было исписать что бы прийти к трем строчкам текста
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- chief_olimp   процедура с указателем на строку в памяти программ   Dec 24 2008, 14:39
- - rokhan   И что ты хочешь найти? Если ты хочешь найти стро...   Dec 24 2008, 15:03
- - rezident   Цитата(chief_olimp @ Dec 24 2008, 19:39) ...   Dec 24 2008, 16:27
|- - demiurg_spb   Цитата(rezident @ Dec 24 2008, 19:27) Во-...   Dec 24 2008, 18:21
|- - rezident   Цитата(demiurg_spb @ Dec 24 2008, 23:21) ...   Dec 24 2008, 19:49
|- - demiurg_spb   Цитата(rezident @ Dec 24 2008, 22:49) Тео...   Dec 25 2008, 10:24
||- - HARMHARM   Цитата(demiurg_spb @ Dec 25 2008, 12:24) ...   Dec 25 2008, 11:14
|||- - zltigo   Цитата(HARMHARM @ Dec 25 2008, 14:14) Бол...   Dec 25 2008, 11:37
|||- - demiurg_spb   Цитата(HARMHARM @ Dec 25 2008, 14:14) Бол...   Dec 25 2008, 12:11
|||- - HARMHARM   Цитата(demiurg_spb @ Dec 25 2008, 14:11) ...   Dec 25 2008, 12:49
||- - rezident   Цитата(demiurg_spb @ Dec 25 2008, 15:24) ...   Dec 25 2008, 12:35
||- - demiurg_spb   Цитата(rezident @ Dec 25 2008, 15:35) Я с...   Dec 25 2008, 13:37
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 16:37) ...   Dec 25 2008, 14:31
|||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 17:31) И за ...   Dec 25 2008, 16:50
||- - rezident   Цитата(demiurg_spb @ Dec 25 2008, 18:37) ...   Dec 25 2008, 15:00
||- - demiurg_spb   Цитата(rezident @ Dec 25 2008, 18:00) Буд...   Dec 25 2008, 16:38
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 19:38) ...   Dec 25 2008, 16:49
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 19:38) ...   Dec 25 2008, 16:54
||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 19:54) Само ...   Dec 25 2008, 17:27
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 20:27) ...   Dec 25 2008, 17:34
||- - demiurg_spb   Цитата(zltigo @ Dec 25 2008, 20:34) Естес...   Dec 25 2008, 17:43
||- - zltigo   Цитата(demiurg_spb @ Dec 25 2008, 20:43) ...   Dec 26 2008, 13:54
||- - demiurg_spb   Цитата(zltigo @ Dec 26 2008, 16:54) Не по...   Dec 27 2008, 10:03
||- - Сергей Борщ   Цитата(demiurg_spb @ Dec 27 2008, 12:03) ...   Dec 27 2008, 11:15
|||- - demiurg_spb   Цитата(Сергей Борщ @ Dec 27 2008, 14:15) ...   Dec 28 2008, 22:04
||- - rezident   Цитата(demiurg_spb @ Dec 27 2008, 15:03) ...   Dec 27 2008, 22:00
|- - alx2   Цитата(rezident @ Dec 25 2008, 00:49) Тео...   Dec 25 2008, 11:15
- - Tiro   Чип AVR с компилятором WinAVR? Тогда прочтите здес...   Dec 24 2008, 16:42
- - chief_olimp   дело в том что я хочу каждый раз используя одну и ...   Dec 24 2008, 16:49
|- - defunct   Цитата(chief_olimp @ Dec 24 2008, 18:49) ...   Dec 24 2008, 17:02
- - WHALE   Я решал вашу задачу так: Кодflash char *flash STRI...   Dec 24 2008, 17:34
- - chief_olimp   в вашем случае насколько я понял сравниваются стро...   Dec 24 2008, 17:43
|- - WHALE   Цитата(chief_olimp @ Dec 24 2008, 20:43) ...   Dec 24 2008, 20:03
- - _Pasha   Код#define Str const unsigned char PROGMEM Str bla...   Dec 24 2008, 18:24
|- - demiurg_spb   Цитата(_Pasha @ Dec 24 2008, 21:24) Код#d...   Dec 24 2008, 18:31
- - rokhan   2chief_olimp : простите. но то что вы написали - э...   Dec 24 2008, 18:28
|- - chief_olimp   Цитата(rokhan @ Dec 24 2008, 22:28) 2chie...   Dec 24 2008, 20:15
- - _Pasha   Цитата(demiurg_spb @ Dec 24 2008, 22:31) ...   Dec 24 2008, 18:49
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 11:23) думаю...   Dec 25 2008, 08:54
|- - alx2   Цитата(Сергей Борщ @ Dec 25 2008, 17:05) ...   Dec 26 2008, 10:36
|- - Сергей Борщ   Цитата(alx2 @ Dec 26 2008, 12:36) Во врем...   Dec 26 2008, 15:32
|- - Сергей Борщ   Цитата(Сергей Борщ @ Dec 26 2008, 17:32) ...   Dec 26 2008, 17:48
- - rokhan   Спасибо вы нашли опечатку. КодНа счет тегов могли ...   Dec 25 2008, 09:00
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 12:00) У авт...   Dec 25 2008, 09:48
- - chief_olimp   т.е. каждый раз при очередном сравнивании данные с...   Dec 25 2008, 09:15


Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016