2017-01-06 4 views
-2

Я имею длинную линию для настройки 14 GPIO булавки в Intel Quark D2000 микроконтроллера эта строка написана языком C код:Как уменьшить сдвигая линию на языке Си

cfg.direction = PM[0]<<(TPN[0])|PM[1]<<(TPN[1])|PM[2]<<(TPN[2])|PM[3]<<(TPN[3])|PM[4]<<(TPN[4])|PM[5]<<(TPN[5])|PM[6]<<(TPN[6])|PM[7]<<(TPN[7])|PM[8]<<(TPN[8])|PM[9]<<(TPN[9])|PM[10]<<(TPN[10])|PM[11]<<(TPN[11])|PM[12]<<(TPN[12])|PM[13]<<(TPN[13]); 

Можно ли переписать этот код используя «для петли»?

Примечание: «TPN» и «PM» - это массивы. «Направление» объявлен как uint8_t переменной в структуре CFG

ответ

1

Должно быть возможно как:

int j; 
cfg.direction = 0; 
for (j=0; j<14; ++j) 
{ 
    cfg.direction |= PM[j]<<TPN[j]); 
} 

Если вы не можете писать cfg.direction до тех пор, пока есть окончательное значение только использовать переменную TEMP:

int j; 
temp = 0; 
for (j=0; j<14; ++j) 
{ 
    temp |= PM[j]<<TPN[j]); 
} 
cfg.direction = temp; 
+0

Спасибо за ответ :) –

+0

Спасибо, ваш код работает отлично для этого случая, но если дело только за один или два GPIO не работает, этот код не работает. Я буду отмечать ваш ответ как правильно, но сначала удалите эту строку «cfg.direction = 0», потому что это означает, что все контакты GPIO, сконфигурированные как входные данные –

+0

. Установка «cfg.direction» в ноль сначала необходима, так что '| =' оператор будет работать правильно (он ORs текущее значение 'cfg.direction' с выражением справа и сохраняет новое значение в' cfg.direction'). ** IF ** установка 'cfg.direction' _immediately_ вызывает изменение в GPIO, тогда вам нужно будет заменить как' cfg.direction 'выше временной переменной, так и' cfg.direction = tempVar' после петля. – TripeHound

0
cfg.direction = 0;     
for (i=0; i<14; i++) 
    cfg.direction |= (PM[i] << TPN[i]); 
+0

Спасибо @Rishikesh Raje –

0

Вы можете использовать простой цикл, чтобы уменьшить сложность этого задания:

uint8_t i=0; 
cfg.direction=0; 
for(i=0;i<14;i++) 
{ 
    cfg.direction|=PM[i]<<TPN[i]; 
} 

поэтому каждый раз, когда выполняется код внутри цикла, значение cfg.direction будет «или бит-мудрено» с новой конфигурацией GPIO.

В конце цикла вы обнаружите, что получаете желаемую конфигурацию GPIO для 14 Pin GPIO.

+0

всегда есть решение: –

0

всегда есть решение, чтобы сделать наше решение более общий характер:

#define GPIO_PIN_NUMBER 2 // you can change anytime this number 
#define GPIO_DEFAULT_CONFIG ((unit32)0x55555555) // i think this will be output config however you can change it when ever you want 

unit8_t=0; 
cfg.direction=GPIO_DEFAULT_CONFIG; 
for(i=0;i<GPIO_PIN_NUMBER;i++) 
{ 
    cfg.direction|=(PM[i]<<TPN[i]); 
} 
Смежные вопросы