2017-02-08 18 views
0

Я пишу прошивку для устройства MSP430, которое использует светодиоды и фотодиоды для обнаружения конкретных типов чернил. Устройство сканирует около 155 единиц, а образцы под сканером - от скоростей от 0,1 м/с до 3,3 м/с. Целью устройства является проверка чернил и измерение чернил (прохода) для проверки (без прохода) и включение зеленого светодиода, когда соотношение между соответствующим значением и включение красного светодиода, когда это не так. Я использую статические целые массивы для хранения значений последовательных проходов и тестовых значений с одним и тем же номером индекса для каждого массива. После последнего индекса массива индекс возвращается к нулю и старые значения записываются.Circular Array Застрял в операторах

GREEN_LED_ON; и аналогичные определения являются определениями портов для моего MCU и подтверждены как правильные.

событие - результат теста. Если чернила обнаружено, событие = ОБНАРУЖЕНО и наоборот

тест будет средний набор на GUI, но сейчас это ничего, потому что я не имею эту часть моей функции рабочего

Обычно я не будет GREEN_LED_ON; и т. д. в циклах if (event), но я помещаю их туда, чтобы визуально, где мой код идет не так. Кажется, что код застрял, когда даже петля даже начинается. Например, если я начну с устройства без чернил, светодиод останется красным, а когда устройство закончит чернила, устройство останется зеленым, несмотря ни на что. Кто-нибудь знает, что я делаю неправильно и как это исправить?

Примечание:
* Я также попытался изменить время (событие), ей в случае заявления, и я получаю тот же результат

* Когда я комментирую массивы внутри если заявления, что код работает, как ожидалось

* Top версия текущая часть кода и внизу, что я начал с

void display(char event, char test) { 

static int size=6; 
static int array[6]={0}; //array with number of passes for each n 
static int n=0; 
static float sum=0;//total number of passes 
static float average=0;//average pass rate over n 
static int consecpass=0; //consecutive passes 
static int consecfail=0; //consecutive fails 
static int totalnumberoftests[6]={0}; //total number of tests conducted. Counts the number of passing or failing tests for the nth value 
static float counter=1; //used to count the total number of tests 
static int flag=0; 


    if(n==size) n=0; 

    if (event == DETECTED) 
    { 
     if (flag==0) 
     { 
      sum=sum-array[n]; 
      counter=counter-totalnumberoftests[n]; 
      array[n]=0; 
      totalnumberoftests[n]=consecfail; 
      sum=sum+array[n]; 
      counter=counter+totalnumberoftests[n]; 
      n++; 
     } 

     consecfail=0; 
     consecpass++; 
     //GREEN_LED_ON; 
     //RED_LED_OFF; 
     flag=1; 

    } if (event==NOT_DETECTED){ 

     if(flag==1) 
     { 
      sum=sum-array[n]; 
      counter=counter-totalnumberoftests[n]; 
      array[n]=consecpass; 
      totalnumberoftests[n]=consecpass; 
      sum=sum+array[n]; 
      counter=counter+totalnumberoftests[n]; 
      n++; 
     } 

     //array[n]=consecpass; 
     //totalnumberoftests[n]=consecpass; 
     consecpass=0; 
     consecfail++; 
     flag=0; 
     //GREEN_LED_OFF; 
     //RED_LED_ON; 
    } 

    if (consecpass>8000) 
    { 
     sum=sum-array[n]; 
     counter=counter-totalnumberoftests[n]; 
     array[n]=consecpass; 
     totalnumberoftests[n]=consecpass; 
     sum=sum+array[n]; 
     counter=counter+totalnumberoftests[n]; 
     n++; 
    } 

    if(consecfail>30000) 
    { 
     sum=sum-array[n]; 
     counter=counter-totalnumberoftests[n]; 
     array[n]=0; 
     totalnumberoftests[n]=consecfail; 
     sum=sum+array[n]; 
     counter=counter+totalnumberoftests[n]; 
     n++; 
    } 

    average=sum/counter; 

    if(average<1 && average >0) 
    { 
     GREEN_LED_ON; 
     RED_LED_OFF; 
    }else{ 
     GREEN_LED_OFF; 
     RED_LED_ON; 
    } 


} 

Это было то, что я первоначально начал с:

void display(char event, char test) { 

static int size=6; 
static int array[6]={0}; //array with number of passes for each n 
static int n=0; 
static int sum=0;//total number of passes 
static double average=0;//average pass rate over n 
static int consecpass=0; //consecutive passes 
static int consecfail=0; //consecutive fails 
static int totalnumberoftests[6]={0}; //total number of tests conducted. Counts the number of passing or failing tests for the nth value 
static float counter=0; //used to count the total number of tests 



while(n<=size) 
    { 
     sum=sum-array[n]; //subtacts the nth value from the total sum of passing tests 
     counter=counter-totalnumberoftests[n]; //subtracts the nth value of the total number of tests run 

     if(event == DETECTED) 
     { 
      array[n]=0; 
      totalnumberoftests[n]=consecfail; 
      consecfail=0; 
      consecpass++; 
      GREEN_LED_ON; 
      RED_LED_OFF; 

     } if(event==NOT_DETECTED){ 

      array[n]=consecpass; 
      totalnumberoftests[n]=consecpass; 
      consecpass=0; 
      consecfail++; 
      GREEN_LED_OFF; 
      RED_LED_ON; 
     } 
     sum=sum+array[n]; 
     counter=counter+totalnumberoftests[n]; 

     average=sum/counter; 

     /*if(average<1) 
     { 
      GREEN_LED_ON; 
      RED_LED_OFF; 
     }else{ 
      GREEN_LED_OFF; 
      RED_LED_ON; 
     }*/ 
     n++; 
    } 
    if(n>size) n=0; 


    } 
+1

Оба раздела будут «застревать», потому что событие не изменяет значение внутри. Наверное, вы имели в виду «если», а не «пока». – Anty

+0

@Anty Я на самом деле попытался заменить whiles на ifs и получил тот же точный результат. –

+0

Вы по-прежнему пропустите пункт - «событие» не изменит значение во время выполнения дисплея. Как вызывается отображение и как считывается событие? – Anty

ответ

1

* Когда я комментирую массивы внутри если заявления, что код работает, как ожидалось

static int size=6; 
static int array[6]={0}; //array with number of passes for each n 
static int totalnumberoftests[6]={0}; 

и этот

while(n<=size) 

При п = 6 вы передаете массив граница - максимальный индекс 5 не 6 для тех (min index = 0).

array[n]=0; 
    totalnumberoftests[n]=consecfail; 

Это UB, и это может привести к неправильному поведению.

Измените условие во время до n < размер.

В любом случае этот код кажется мне «странным».

+0

Может ли цикл while нужен? Другой комментатор описал, что вызов вызова в основном работает как цикл while, а другой может вызвать проблемы с тем, что я хочу произойти –

0

Выработать на мой комментарий, если вы находитесь в системе, управляемой событиями, я надеюсь, есть некоторый код (обычно называемый «цикл событий») где-то, что выглядит следующим образом:

event_loop() 
{ 
    while (TRUE) 
    { 
     event = get_event_from_someplace(...); 

     display(...); 
    } 
} 

Это может что вместо того, чтобы напрямую звонить display, был какой-то процесс, в котором вы зарегистрировалиобработчик события. Но результат заключается в том, что в некотором библиотечном коде существует бесконечный цикл, который вызывает вашу функцию снова и снова. Таким образом, вам не нужен код while().

Ваш код должен быть конечным автоматом, который отслеживает внутреннее состояние (используя переменные static, как и вы), а затем выполняет любые обновления, необходимые для каждого вызова.

Что-то вроде этого:

void display(char event, ...) 
{ 
    static int consecutive_passes = 0; 
    static int consecutive_fails = 0; 


    if (event == DETECTED) { 
     ++consecutive_passes; 
    } 
    else if (event == NOT_DETECTED) { 
     ++consecutive_fails; 
    } 
    else { 
     // What else is there? 
    } 
} 

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

+0

Я вижу. Спасибо за пояснение! Точка цикла while предназначена для того, чтобы массивы переписывали данные после n> size (массивов), и я использовал цикл while для установки индекса массива. Может ли это быть сделано с операторами if и flags? Я сделал редактирование, показывающее, что я сделал с кодом, но он все еще не работает точно, как я этого хочу. –

+0

Да! Ваше обновление с 'if (n == size) n = 0;' идеально. Это управляет «круговой» частью массива. Однако я должен признать, что остальная часть вашего кода меня озадачивает. Можете ли вы добавить обновление, объясняющее, что вы тестируете, и какую статистику вы пытаетесь собрать? –