|
IAR AVR функция strstr, не могу разобраться |
|
|
|
Jul 22 2010, 18:02
|
Местный
  
Группа: Участник
Сообщений: 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.
|
|
|
|
|
 |
Ответов
|
Jul 22 2010, 18:36
|

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

|
Цитата(SZ0 @ Jul 22 2010, 21:02)  Как я понимаю, не правильно преобразовываю. Но не могу понять, как правильно преобразовать типы. Сам массив в озу, а строки в нём ищутся из flash. Функция strstr() работает только на нормальной памяти (RAM), но не на flash. А уж тем более не может работать, когда один аргумент во flash, а другой в RAM. Таковы уж издержки гарвардской архитектуры. Поэтому обман этой функции с помощью переименования типов указателей у вас не пройдет. Функция не заработает, поскольку на такую ситуацию она не рассчитана. Поэтому скопируйте лучше flash в RAM, например, с помощью функции strcpy_P(), а потом уже запускайте strstr() на полностью RAM-строках. Хотя слово "ОК" настолько коротко, что проще его завести сразу в RAM, потери будут минимальными.
|
|
|
|
|
Jul 22 2010, 20:52
|

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

|
Цитата(zltigo @ Jul 22 2010, 22:10)  ....в самых простейших ее реализациях, например, AVR от Atmel. Ну вот опять Atmel у вас оказался виноват  Цитата(zltigo @ Jul 22 2010, 22:10)  По нынешним временам так ломово контроллеры, даже если их и называют гаввардскими, уже не делают. Это проблема не столь аппаратная, сколько логическая. Указанная проблема будет возникать во всех случая, когда числовой адрес памяти не уникален. Т.е. тогда, когда существует более одного адресных пространств, в которых имеется своя собственная нумерация. При этом числового значения указателя оказывается недостаточно для того, чтобы однозначно определить, к какого рода памяти он относится. Очевидно, совершенно та же самая проблема возникнет, если вместо указателя на flash-память использовать указатель на eeprom-память. В этом случае функция strstr() тоже откажется работать правильно. Точнее говоря, она-то отработает правильно, только символы возьмет не из той памяти, которую хотелось бы. А гарвардская архитетура тут только при том, что во многих своих реализациях допускает наличие двух адресных пространств (памяти программ и памяти данных), которые допускают перекрытие по номерам ячеек. Но если оба вида памяти разместить в одном адресном пространстве без перекрытия, то указанная проблема исчезнет. Как, например, не возникает такая проблема у компьютеров IBM PC, у которых в младших адресах расположено ПЗУ, а выше его ОЗУ. Однако в тех случаях, когда команды обращения к ОЗУ и ПЗУ разные, указанная проблема встает в полный рост. И тут разделением адресов горю не поможешь. Хочешь, не хочешь, а код функций, работающих с разными видами памяти, окажется тоже разным. Поэтому сишным переопределением типа указателей проблема не решается. А гарвардская архитектура становится виноватой  в тот самый момент, как только у процессора появляются РАЗНЫЕ команды обращения к ОЗУ и к ПЗУ. В тех же случаях, когда между этими обращениями нет разницы, подобная проблема не возникает.
|
|
|
|
|
Jul 23 2010, 05:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Xenia @ Jul 22 2010, 23:52)  Ну вот опять Atmel у вас оказался виноват  Я этого не говорил. Большинство простых контрроллеров 80x-90x прошлого века такие. Если хочется искать виноватых, то виновато время которое течет. Люди и фирмы, которые "вчера" делали свою работу хорошо ничуть не виноваты. QUOTE А гарвардская архитетура тут только при том, что во многих своих реализациях допускает наличие двух адресных пространств (памяти программ и памяти данных), Не во многих, а во всех и не адресных пространств, а шин. Все остальное вторично. В том числе "команды обращения к ОЗУ и ПЗУ разные" и это уже не гарвард "виноват", а то, что так было явно проще делать контроллер. QUOTE Как, например, не возникает такая проблема у компьютеров IBM PC, у которых в младших адресах расположено ПЗУ, а выше его ОЗУ. 1. x86 неймановсий и ему глубоко все равно где и что расположено физически, кроме: 2. x86 один из процессоров стартующих не с нулевого адреса. Посему ПЗУ в конце первого мегабайта, а не на "младших адресах".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
SZ0 IAR AVR функция strstr Jul 22 2010, 18:02   _Bill Цитата(Xenia @ Jul 23 2010, 00:52) Ну вот... Jul 23 2010, 03:36 SZ0 Спасибо за разъяснение. Придётся искомые строки в ... Jul 23 2010, 02:32 SZ0 Строки пришлось определить так:
Кодconst c8 OKin... Jul 23 2010, 06:02 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 Цитата(SZ0 @ Jul 23 2010, 09:02) Строки п... Jul 23 2010, 11:10  mempfis_ КодЗнаю два варианта решения вашей проблемы:
... Jul 23 2010, 12:55 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|