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

 
 
> процедура с указателем на строку в памяти программ, помогите разобраться
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, 09:00
Сообщение #2


Участник
*

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



Спасибо вы нашли опечатку.
Код
На счет тегов могли бы просто помочь с сылкой а не заявлением.


Сообщение отредактировал zltigo - Dec 25 2008, 09:50
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 25 2008, 09:48
Сообщение #3


Гуру
******

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



Цитата(rokhan @ Dec 25 2008, 12:00) *
У автора - используется двойное копирование + двойная проверка...

А я про Вас sad.gif - просто среагировал на рекламный сологан "быстрее и веселее" и не найдя на мой взгляд ни того ни другого (совершенно обычно все) написал ремарку. Добавлю еще, что по нынешним временам библиотечные функции отличаются оптимизированностью (и ASM там не редкое явление)и "сделать" их просто так "в лоб" не получится, если только не за счет наложения дополнительных
ограничений.
Цитата(chief_olimp @ Dec 25 2008, 12:15) *
Может что и можно сделать с помошью библиотечных функций но меня пока не убедили.

А зачем Вас кому-то убеждать smile.gif? Могу сказать одно (глядя на написанное Вами), что современные библиотечные функции написаны много-мнго более оптимально и Вам следует, как минимум, для начала воспользоваться ими.
Например, та memcmp(), которой я пользовался для ARM лет пять тому назад, до тех пор, пока IAR не "сделал" и ее выпустив очередную свою версию библиотеки.
CODE

//---------------------------------------------------------------------------
// memcmp()
// compare unsigned char s1[n], s2[n]
// int (memcmp)(const void *s1, const void *s2, size_t n)
//---------------------------------------------------------------------------
RSEG CODE:CODE:NOROOT(2)
ARM

memcmp:
mov r3,r0 // Copy 1st arg, p1
mov r0,#0 // Set return value = 0
teq r2,#0 // Is n == 0 ?
bxeq lr // Return if n == 0

stmdb sp!,{r4-r6,lr} // Save registers on stack

cmp r2,#12 // Is n > 12 */
ble ByteLoop // If n <= 12, jump

sub r0,r3,r1 // p1 - p2
ands r0,r0,#3 // (p1 - p2) & 3
beq WordCompare // Jump if byte offsets match

// The strings begin at different byte offsets WRT word boundaries.
// Loop below processes only a single pair of bytes per iteration.
ByteLoop:
ldrb r0,[r3],#1 // b1 = next byte from string 1
ldrb r4,[r1],#1 // b2 = next byte from string 2
subs r0,r0,r4 // b1 - b2
bne ByteBreak // if b1 != b2, break out of loop
subs r2,r2,#1 // --n (decrement loop counter)
bne ByteLoop // Loop again if n > 0

ByteBreak:
TheEnd:
ldmia sp!,{r4-r6,lr} // Return
bx lr


// The two strings have same starting byte alignment WRT word boundary.
// Set up inner loop that compares a pair of words per iteration.

WordCompare:
add r5,r3,r2 // e1 = p1 + n (point to trailing byte)
and lr,r3,#3 // align = p1 & 3 (initial byte offset)
bic r3,r3,#3 // p1 &= ~3 (point to word boundary)
bic r1,r1,#3 // p2 &= ~3
add r2,r5,#3 // e1 + 3
sub r2,r2,r3 // e1 + 3 - p1
mov r2,r2,lsr #2 // N Words = (e1 + 3 - p1) >> 2

mvn r6,#0 // Initialize mask to all 1s
mov r0,lr,lsl #3 // Convert byte offset to bit offset
mov r6,r6,lsl r0 // Poke holes in mask for invalid bytes
ldr r0,[r3],#4 // w1 = *p1++
and r0,r0,r6 // Isolate starting bytes in 1st string
ldr r4,[r1],#4 // w2 = *p2++
and r4,r4,r6 // Isolate starting bytes in 2nd string


// Inner loop:
// Compare the two strings one word at a time to look for a mismatch.
// If the two strings match, return 0.
WordLoop:
subs r0,r0,r4 // w1 - w2
bne WordBreak // if w1 != w2, break out of loop
ldr r0,[r3],#4 // w1 = *p1++
subs r2,r2,#1 // --nWords
ldr r4,[r1],#4 // w2 = *p2++
bne WordLoop // Loop again if more words in string
mov r0,#0 // Set return argument = 0
b TheEnd // All done. Return


// The strings may still match if the apparent mismatch happened in
// the final pair of words from the two strings (in trailing bytes).
WordBreak:
teq r2,#1 // N Words == 1? (mismatch at EOS?)
bne FindMismatch // Jump if nWords != 1

ands r5,r5,#3 // Is trailing byte word-aligned?
beq FindMismatch // Jump if word-aligned (real mismatch)

mvn r6,#0 // Initialize mask to all 1s
mov r5,r5,lsl #3 // Convert byte offset to bit offset
mvn r6,r6,lsl r5 // Poke holes in mask for invalid bytes
ands r0,r0,r6 // Mask off trailing bytes, string 1
beq TheEnd // If w1 == w2, return val = 0


// We detected a mismatch in the current pair of words from the strings.
// But in which byte position within the words did the mismatch occur?
FindMismatch:
add r3,r0,r4 // Restore value w1

NextByte:
and r0,r3,#0xff // b1 = w1 & 0xff (isolate byte)
and r2,r4,#0xff // b2 = w2 & 0xff
subs r0,r0,r2 // Return val = b1 - b2 ?

bne TheEnd // If val != 0 - Return

mov r3,r3,lsr #8 // w1 >>= 8 (position next byte)
mov r4,r4,lsr #8 // w2 >>= 8
b NextByte // If b1 != b2, loop again


--------------------
Feci, quod potui, faciant meliora potentes
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
- - rokhan   Я просто в шоке. думаю мои и быстрее и веселее Ц...   Dec 25 2008, 08:23
|- - zltigo   Цитата(rokhan @ Dec 25 2008, 11:23) думаю...   Dec 25 2008, 08:54
|- - chief_olimp   Кодvoid find(char* inb) { fndOK=-1; char i...   Dec 25 2008, 11:44
|- - Сергей Борщ   Цитата(chief_olimp @ Dec 25 2008, 13:44) ...   Dec 25 2008, 12:05
|- - chief_olimp   Документацию я как раз читаю. Только напоминаю я н...   Dec 25 2008, 12:18
||- - Сергей Борщ   Цитата(chief_olimp @ Dec 25 2008, 14:18) ...   Dec 25 2008, 13:44
||- - chief_olimp   Обращение есть. CODEvoid find (const void *findbuf...   Dec 25 2008, 14:22
|- - 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
- - chief_olimp   т.е. каждый раз при очередном сравнивании данные с...   Dec 25 2008, 09:15


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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 16:10
Рейтинг@Mail.ru


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