Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как прочитать данные из памяти процессора
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
alt3857
Привет! Что-то я торможу, как проще сделать? Придумал через цикл, но кажется что можно с указателями проще - не могу сообразить как.
Methane
Цитата(alt3857 @ Nov 18 2010, 15:00) *
Привет! Что-то я торможу, как проще сделать? Придумал через цикл, но кажется что можно с указателями проще - не могу сообразить как.

А где массив находится?
demiurg_spb
memcpy
memcpy_P
alt3857
массив просто определен в программе глобально, нужно в него кусок памяти сбросить
memcpy - можно, но нужно доп. библиотеки задействовать
demiurg_spb
Цитата(alt3857 @ Nov 18 2010, 16:50) *
memcpy - можно, но нужно доп. библиотеки задействовать

Ничего не нужно - это стандартная библиотека и компилятор всё сделает за Вас.
подключите <string.h>
и <avr/pgmspace.h> для avr-gcc

Проще не бывает.
alt3857
Она стандартная, но наверное код увеличится?
Сергей Борщ
QUOTE (alt3857 @ Nov 18 2010, 16:05) *
Она стандартная, но наверное код увеличится?
А если вы будете врукопашную байты перетаскивать - код не увеличится?
demiurg_spb
Тут не о чем думать. Пробуйте!!!
sigmaN
реализация memcpy должна быть весьма неплохо оптимизирована в стандартной поставке.
Организовать что-то более оптимально может быть и можно(если этого уже не сделали), но только на асме.
alt3857
Спасибо, буду пробовать memcpy
mdmitry
Были случаи, когда простой цикл присваивания по элементам работал быстрее, чем memcpy. Все зависит от конкретной ситуации, объема копируемых данных и их расположения в памяти.
sigmaN
Цитата
Были случаи, когда простой цикл присваивания по элементам работал быстрее, чем memcpy
Очень интересно однако...
ReAl
Да запросто, на короткой структуре загрузка адресов, вызов/возврат, универасльный цикл с 16-битным счётчиком на все случаи жизни...
Но только компиляторы тоже давно грамотные.
Код
#include <stdint.h>
#include <string.h>

uint8_t a1[32], a2[32];

void foo() { memcpy(a1, a2, 4); }

void moo() { memcpy(a1, a2, 32); }

Код
    .text
foo:
    lds r24,a2
    lds r25,(a2)+1
    lds r26,(a2)+2
    lds r27,(a2)+3
    sts a1,r24
    sts (a1)+1,r25
    sts (a1)+2,r26
    sts (a1)+3,r27
    ret

moo:
    ldi r26,lo8(a1)
    ldi r27,hi8(a1)
    ldi r30,lo8(a2)
    ldi r31,hi8(a2)
    ldi r24,lo8(32)
.L2:
    ld r0,Z+
    st X+,r0
    subi r24,lo8(-(-1))
    brne .L2
    ret
mdmitry
Цитата(sigmaN @ Nov 21 2010, 07:11) *
Очень интересно однако...

Уважаемый ReAl показал пример. Многое зависит от режима оптимизации компилятора. Как-то получилось быстрее сделать 8 присваиваний, чем цикл или memcpy.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.