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

 
 
> Как уйти от постоянной проверки условия if?
nikolas_osu
сообщение May 13 2011, 04:17
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 6-12-07
Из: Оренбург
Пользователь №: 33 046



ARM-контроллер опрашивает по циклу некоторый набор блоков, перед началом цикла опроса контроллер получат команду с номерами блоков которые необходимо опрашивать в цикле. Первое что пришло в голову это опросом конкретного блока проверять по if нужно ли опрашивать данный блок. Не нравиться то что в итерациях цикла придется всегда проверять if несмотря на то что во всех итерациях условие будет одинаковым. Возможно ли обойтись без этих проверок для каждого блока в каждой итерации цикла? Язык программирования Си.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
smalcom
сообщение May 13 2011, 04:27
Сообщение #2


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



вектор функций опроса. тебе как раз приходят индексы функций в векторе.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 13 2011, 04:35
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Массив указателей на функции блоков, а лучше массив структур с полем-флагом активности блока.

Будет один цикл с одним условием в теле цикла.
Код
block[0].active = 0;
block[1].active = 1;
....
for (int i=0; i<BLOCKS_QTY; i++)
{
   if (block[i].active)
   {
      block[i].callback();
   }
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
nikolas_osu
сообщение May 13 2011, 04:57
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 6-12-07
Из: Оренбург
Пользователь №: 33 046



Цитата(smalcom @ May 13 2011, 10:27) *
вектор функций опроса. тебе как раз приходят индексы функций в векторе.

А можно поподробнее как это реализовать?

Цитата
Массив указателей на функции блоков, а лучше массив структур с полем-флагом активности блока.

Будет один цикл с одним условием в теле цикла.
Код
block[0].active = 0;
block[1].active = 1;
....
for (int i=0; i<BLOCKS_QTY; i++)
{
if (block[i].active)
{
block[i].callback();
}
}


Это совсем не то, проверка условия перед запуском опроса конкретного блока как была так и осталась, только добавились еще проверка условия цикла и вызов элемента массива.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 13 2011, 07:24
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(nikolas_osu @ May 13 2011, 07:57) *
А можно поподробнее как это реализовать?

Это совсем не то, проверка условия перед запуском опроса конкретного блока как была так и осталась, только добавились еще проверка условия цикла и вызов элемента массива.


RTOS ваяете?

Номера блоков надо привести к смещению от базы до функции блока. Это делается на промежуточных константных массивах.
Как-то так wink.gif))
Go to the top of the page
 
+Quote Post
nikolas_osu
сообщение May 13 2011, 07:51
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 6-12-07
Из: Оренбург
Пользователь №: 33 046



Цитата(AlexandrY @ May 13 2011, 13:24) *
RTOS ваяете?

Номера блоков надо привести к смещению от базы до функции блока. Это делается на промежуточных константных массивах.
Как-то так wink.gif))

Совсем нет, просто система сбора данных. Мне как-то не по душе алгоритм в котором постоянно проверяются условия, которые заведомо не меняются.

Думаю сделать через массив указателей на функции, но не знаю насколько это будет быстрее чем простой if.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 13 2011, 08:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(nikolas_osu @ May 13 2011, 10:51) *
не знаю насколько это будет быстрее чем простой if.

Не будет быстрее.
Если if оскорбляет художественный вкус, его можно куда-нить спрятать, в макрос какой-нибудь.



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 13 2011, 11:38
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



А почему только if()?
Код
do{
if(unbelievable_condition()) break;
// остальное пишем сюда
}while(0);
//тогда сразу выходим

Вы, пожалуйста, конкретизируйте вопрос детальным примером - тема-то самая "простая", опирается на построение алгоритмов sm.gif
Может, там вообще надо по другому все выводить? Например, конечным автоматом..

Сообщение отредактировал _Pasha - May 13 2011, 11:40
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 13 2011, 11:58
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(nikolas_osu @ May 13 2011, 11:51) *
Совсем нет, просто система сбора данных. Мне как-то не по душе алгоритм в котором постоянно проверяются условия, которые заведомо не меняются.

То есть как не меняются? Константные условия?
Ну так тогда компилятор их и без вас пошинкует.
А вот прыганье по указателям очень плохо сказывается на работе конвейера и кэша (если есть).


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
smalcom
сообщение May 13 2011, 14:25
Сообщение #10


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата
А можно поподробнее как это реализовать?


Код
//объявляем
#define    CPUInstructionNum                64
void (*CPUInstructionDecodeCall[CPUInstructionNum]) (void);


Код
//инициализируем
void CPUInstructionDecoderInit()
{
uint32 i;

    for(i = 0; i < CPUInstructionNum; i++) CPUInstructionDecodeCall[i] = &CPUInvalidInstruction;
    CPUInstructionDecodeCall[CIDO_J >> CIDO_Shift] = &CPUInstructionDecodeJ;
    CPUInstructionDecodeCall[CIDO_JAL >> CIDO_Shift] = &CPUInstructionDecodeJAL;
    ...
    CPUInstructionDecodeCall[CIDO_BEQ >> CIDO_Shift] = &CPUInstructionDecodeBEQ;
}


Код
//пользуемся
void CPUInstructionDecode()
{
    (*CPUInstructionDecodeCall[CPUInstructionCurrent >> 26])();
}

смещение на 26, то только в моём случае.
ну а индексы массива это коды/опкоды приходящие из вне. у меня это, к примеру, такое
Код
enum ECPUInstructionDecoderOpcode
{
    CIDO_J = 0x08000000,
    CIDO_JAL = 0x0C000000,
    ...
    CIDO_BEQ = 0x10000000,
};



Цитата
Думаю сделать через массив указателей на функции, но не знаю насколько это будет быстрее чем простой if.

это очень быстро))
Go to the top of the page
 
+Quote Post
nikolas_osu
сообщение May 13 2011, 18:05
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 6-12-07
Из: Оренбург
Пользователь №: 33 046



Цитата(MrYuran @ May 13 2011, 17:58) *
То есть как не меняются? Константные условия?
Ну так тогда компилятор их и без вас пошинкует.
А вот прыганье по указателям очень плохо сказывается на работе конвейера и кэша (если есть).

Не меняются во время цикла опроса - набор блоков для опроса задается один раз а потом тысячи итерций цикла опроса в которых опрашивается этот набор блоков, при этом приходится проверять каждый раз опрашивать конкретный блок или нет.

smalcom, спасибо! Это как раз то что нужно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:02
Рейтинг@Mail.ru


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