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

 
 
> IAR AVR функция strstr, не могу разобраться
SZ0
сообщение Jul 22 2010, 18:02
Сообщение #1


Местный
***

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



Код
u8 str_buff[100];
c8 __flash *OKin = "OK";

if(strstr((const c8 *)str_buff,(const c8 *)OKin)return 0;


strstr всегда выдаёт указатель на начало буфера, даже если ОК там нет. Т.е. в начале буфера могут быть любые символы, а потом ОК. Как я понимаю, не правильно преобразовываю. Но не могу понять, как правильно преобразовать типы. Сам массив в озу, а строки в нём ищутся из flash.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SZ0
сообщение Jul 23 2010, 06:02
Сообщение #2


Местный
***

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



Строки пришлось определить так:
Код
const c8 OKin[] = "OK";

Строки находятся теперь и в flash и в озу, куда копируются при инициализации. Т.к. проц толстый и кол-во искомых строк немного, то не напрягает. Но вот если у проца озу маленькое, как тогда быть? К выбору другого проца пока не прибегаем smile.gif
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 23 2010, 11:10
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(SZ0 @ Jul 23 2010, 09:02) *
Строки пришлось определить так:
Код
const c8 OKin[] = "OK";

Строки находятся теперь и в flash и в озу, куда копируются при инициализации. Т.к. проц толстый и кол-во искомых строк немного, то не напрягает. Но вот если у проца озу маленькое, как тогда быть? К выбору другого проца пока не прибегаем.

Знаю два варианта решения вашей проблемы:

1) Завести себе в ОЗУ "мусорную" строку, которая будет использоваться сразу под множество целей. Тогда не "OK" там постоянно будет лежать, а разные вещи, по мере надобности. Или скажем sprintf() на эту строку будет работать. Или чтобы какие-то сообщения там формировать. Короче говоря, создаете себе буфер на вывод, а используете его не всегда по назначению, но и для ОЗУвления ПЗУшных констант smile.gif.

2) Более элегантный метод, в котором необходимое для дела место в ОЗУ временно занимается у стека. Для этого создайте блок и заводите в нем место для временной строки:

Код
c8 __flash *OKin = "OK";
.............
main()
{
.............
  {  // открываем блок
     char ozu[3];  // создаем локальный массив на стеке, принадлежащий ОЗУ
     strcpy_P( ozu, OKin); // копируем строковую константу из ПЗУ в ОЗУ
     result = strstr( str_buff, ozu);  // выполняем функцию strstr() полностью на ОЗУшных аргументах
  }  // закрываем блок, в результате чего локальный массив ozu[] исчезнет, вернув свою память стеку
............
}
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jul 23 2010, 12:55
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Код
Знаю два варианта решения вашей проблемы:

1) Завести себе в ОЗУ "мусорную" строку, которая будет использоваться сразу под множество целей...

2) Более элегантный метод, в котором необходимое для дела место в ОЗУ [b]временно занимается[/b] у стека...


Каждый из этих вариантов предполагает предварительное копирование искомой подстроки в ОЗУ и тольком потом вызов ф-ции strstr для поиска в строке скопированной подстроки.
Для поиска "ОК" сойдёт. А если возможных подстрок будет 100-200 (например реализация поддержки АТ-интерфейса или своего интерфейса управления с кучей команд).
Разумно будет написать свою ф-ию которая будет сравнивать буффер со строкой во flash. Сложностей никаких. В качестве бонуса сократится время на поиск подстроки и уменьшится размер кода программы и использованной оперативки.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SZ0   IAR AVR функция strstr   Jul 22 2010, 18:02
- - Xenia   Цитата(SZ0 @ Jul 22 2010, 21:02) Как я по...   Jul 22 2010, 18:36
|- - zltigo   QUOTE (Xenia @ Jul 22 2010, 21:36) Таковы...   Jul 22 2010, 19:10
||- - Xenia   Цитата(zltigo @ Jul 22 2010, 22:10) ....в...   Jul 22 2010, 20:52
||- - _Bill   Цитата(Xenia @ Jul 23 2010, 00:52) Ну вот...   Jul 23 2010, 03:36
||- - zltigo   QUOTE (Xenia @ Jul 22 2010, 23:52) Ну вот...   Jul 23 2010, 05:27
|- - SZ0   Спасибо за разъяснение. Придётся искомые строки в ...   Jul 23 2010, 02:32
|- - zltigo   QUOTE (SZ0 @ Jul 23 2010, 09:02) Но вот е...   Jul 23 2010, 06:18
||- - mempfis_   Цитата(zltigo @ Jul 23 2010, 09:18) Писат...   Jul 23 2010, 06:46
|||- - _Bill   Цитата(mempfis_ @ Jul 23 2010, 10:46) +1 ...   Jul 23 2010, 16:28
|||- - _Bill   Я думаю, вашу функцию можно чуть-чуть эффективней ...   Jul 23 2010, 19:29
||- - IgorKossak   QUOTE (zltigo @ Jul 23 2010, 09:18) Писат...   Jul 23 2010, 06:50
- - Xenia   _Bill, похоже на то, что ваш алгоритм даст неправи...   Jul 23 2010, 20:14
|- - _Bill   Цитата(Xenia @ Jul 24 2010, 00:14) _Bill,...   Jul 24 2010, 05:04
- - zltigo   Классический, писанный на 'C', strstr() CO...   Jul 24 2010, 06:16
- - desh   Я использую функцию которая работает одновременно ...   Aug 3 2010, 12:48


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

 


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


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