我正在为MSP430设备编写固件,该设备使用LED和光电二极管来检测墨水上的特定类型。该设备扫描大约155us,扫描仪下的样品范围从0.1m / s到3.3m / s。该设备的目标是测试墨水并测量墨水(通过)以测试(未通过)比率,当比率在相应值之间时打开绿色LED,而当不是时,打开红色LED。我使用静态整数数组将连续传递和测试值的值存储到每个数组的相同索引号。在数组的最后一个索引之后,索引被设置回零并且旧值被写入。
GREEN_LED_ON;和类似的定义是我的MCU的端口定义,并验证是正确的。
事件是测试结果。如果检测到墨水,则事件=已检测到,反之亦然
测试将是GUI设置的平均值,但是现在它没什么,因为我没有让我的功能部分工作
通常情况下,我不会有GREEN_LED_ON; if(事件)循环中的等等,但我将它们放在那里我的代码出错了。代码似乎陷入了甚至开始的循环。例如,如果我从没有墨水的设备开始,LED保持红色,当设备墨水过多时,设备保持绿色,无论如何。有谁知道我做错了什么以及如何解决它?
注意:
*我也尝试将while(事件)更改为if语句,并得到相同的结果
*当我在if语句中注释数组时,代码按预期工作
*顶级版本是代码的当前部分,底部是我开始的
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;
}
答案 0 :(得分:1)
*当我在if语句中注释数组时,代码按预期工作
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)
当n = 6时,你传递数组边界 - 那些最大索引为5而不是6(最小索引= 0)。
array[n]=0;
totalnumberoftests[n]=consecfail;
这是UB,这可能会产生无效行为。
改变条件in while到n&lt;大小
无论如何,这段代码看起来很奇怪&#34;对我来说。
答案 1 :(得分:0)
要详细说明我的评论,如果你在一个事件驱动的系统中,我希望有一些代码(通常称为&#34;事件循环&#34;)某处看起来像这样:
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
循环。