при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
int32_t sum = 0;
uint32_t *p1 = &buf_U[0], *p2 = buf_I[SDVIG];
int i = 400 / 2;
do sum = __SMLAD(*p1++, *p2++, sum);
while (--i);только вы забываете, что у автора обработка в цикле ПОСЛЕ memcpy, т.е. все такты копирования пойдут плюсом к обработке. а управление индексом добавить по 2-3 такта на итерацию ПОЛЕЗНОГО цикла. так что это еще большой вопрос, что окажется быстрее по совокупностиjcxz писал(а):такое управление индексом добавит кучу лишних тактов в цикл. Много больше чем memcpy() на больших выровненных массивах.
только вы забываете, что у автора обработка в цикле ПОСЛЕ memcpy, т.е. все такты копирования пойдут плюсом к обработке. а управление индексом добавить по 2-3 такта на итерацию ПОЛЕЗНОГО цикла. так что это еще большой вопрос, что окажется быстрее по совокупности[/uquote]jcxz писал(а):такое управление индексом добавит кучу лишних тактов в цикл. Много больше чем memcpy() на больших выровненных массивах.
нет, конечно.jcxz писал(а):А вы компилировать пробовали, то что предложили?
собственно, с этого я и начал, так что не надо мне об этом рассказывать.jcxz писал(а):Кроме того данные у автора 16-битные, а memcpy() внутри оптимизирована и на больших массивах, выровненных на границу 32бит, будет копировать по 8 шт. 32-битных слов за итерацию, т.е. - будет тратить всего ~ 2 такта на копирование каждой пары значений.
Код: Выделить всё
u32 *p1 = &d.sh.bp[0], sum = 0;
enum {SDVIG = 100};
int i = 400 / 2;
do {
sum = __SMLAD(p1[0], p1[SDVIG], sum);
p1++;
} while (--i);
Код: Выделить всё
MOVS R0,#+200
??DtePwm_0:
LDR R3,[R2, #+400]
LDR R6,[R2], #+4
SUBS R0,R0,#+1
SMLAD R1,R6,R3,R1
BNE.N ??DtePwm_0Код: Выделить всё
volatile uint16_t v16;Код: Выделить всё
#define ACCESS_VOLATILE_U16(x) (*((volatile uint16_t*) &x))
uint16_t v16;
void irq_handler1( void ) // прерывания
{
v16 = 1;
}
void irq_handler2( void )
{
v16 = 2;
}
main()
{
ACCESS_VOLATILE_U16( v16 ) = 0;
while(1)
{
abc = ACCESS_VOLATILE_U16( v16 );
};
}
Код: Выделить всё
typedef struct{
volatile
uint8_t state_machine; // машина состояний
int16_t angle_cnt; // текущая угловая позиция
volatile
uint8_t event; // события
uint32_t rev_period_cnt; // счётчик периода оборота диска энкодера
volatile
uint32_t rev_period_latch; // период последнего полного оборота
uint32_t rev_period_pred; // предсказание периода следующего оборота
// и ещё десяток параметров
}ENGINE_PARAMS;
ENGINE_PARAMS engine_data;Код: Выделить всё
void proc_engine_state( void )
{
uint8_t sm = engine_data.state_machine;
// делать что-то с переменной sm
engine_data.state_machine = sm;
}Код: Выделить всё
typedef struct{
uint8_t state_machine; // машина состояний
int16_t angle_cnt; // текущая угловая позиция
uint8_t event; // события
uint32_t rev_period_cnt; // счётчик периода оборота диска энкодера
uint32_t rev_period_latch; // период последнего полного оборота
uint32_t rev_period_pred; // предсказание периода следующего оборота
// и ещё десяток параметров
}ENGINE_PARAMS; Код: Выделить всё
volatile ENGINE_PARAMS *p_engine_data;Код: Выделить всё
ENGINE_PARAMS engine_data; // вот это используется только прерываниями
volatile ENGINE_PARAMS *p_engine_data;// а это для главного цикла
main()
{
p_engine_data->state_machine = STOP; // иниц значений
p_engine_data->angle_cnt = 0;
p_engine_data->rev_period_cnt = 0;
while(1)
{
if( p_engine_data->state_machine == WORK )
{
putsf("ENGINE WORK");
}else
{
putsf("ENGINE STOP");
}
if( p_engine_data->event == ERROR )
{
reinit_engine();
putsf("ERROR");
}
}
}или нет. Компилятор в общем случае не обязан этого делать:Oxford писал(а):если хочешь ускорить работу с некоторой переменной обьяви ее с директивой register компилятор закрепит ее в регистре общего назначения
A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible. The extent to which such suggestions are effective is implementation-defined. The implementation may treat any register declaration simply as an auto declaration.
почему вдруг?Reflector писал(а):потому такое же поведение можно ожидать и от С
ну я хотел донести следующую мысль: если тип должен быстрее всего обрабатываться, то переменная этого типа должна попасть в такую область хранения, которая эту самую быстроту способна обеспечить. например, такая переменная может иметь приоритет перед остальными для хранения в регистре...arkhnchul писал(а):строго говоря, не способ доступа, а быстрее всего обрабатываемый тип
Код: Выделить всё
uint8_t aa = 0;
uint_fast8_t bb = 0;
aa = ~aa; // 0xFF
bb = ~bb; // 0xFFFF'FFFF