我的中断例程无法正确访问数组

时间:2013-08-22 19:30:17

标签: c++ static interrupt volatile

更新到这里 - 看起来math.h中的trig函数存在一些问题(使用MPIDE编译器) - 难怪我用我自己的math.h调试器无法看到这个问题因此给出了我预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,而是采用了“快速正弦/余弦”算法(参见devmaster dot com)。我的ISR和ColourWheel阵列现在可以完美运行。

我必须说,作为一个相当新的C / C ++,我花了很多时间审查并重新审核自己的错误代码。在我脑海中最后一个可能的事情是,几十年前无疑写过的一些非常基本的功能可能会产生这样的问题。

我想如果我能够访问实际阵列的屏幕转储,我会更早地看到问题但是,因为我的芯片连接到我的led立方体,我无法访问芯片中的数据直接

嘿,嘿!! - 当我有机会的时候,我会发布一个链接到一个u管视频,显示我现在能够编程的波形功能,并且在我的LED立方体上看起来相当不错。

罗素

PS 非常感谢你们在这里给予的帮助 - 它让我完全放弃了,给了我一些追逐的途径 - 在此之前对于endianess当然没有太多了解,因此我们已经了解了这一点以及一些系统的方法来进行强大的调试方法

尝试在中断例程中访问数组时遇到问题。

以下是ISroutine内部的一段代码。

if (CubeStatusArray[x][y][Layer]){
    for(int8_t bitpos=7; bitpos >= 0; bitpos--){
        if((ColourWheel[Colour]>>16)&(1<<bitpos)) { // This line seems to cause trouble
            setHigh(SINRED_PORT,SINRED_PIN);
        }
        else {
            setLow(SINRED_PORT,SINRED_PIN);
        }
    }
}
..........

ColourWheel [Color]在我的程序开始时声明如下(在任何函数之外)

static volatile uint32_t ColourWheel[255]; //this is the array from which
                                           //the colours can be obtained -
                                           //all set as 3 eight bit numbers
                                           //using up 24 bits of a 32bit
                                           //unsigned int.

这段代码正在做的是获取代码的8位段的每一位,并将端口/引脚设置为高或低,先用MSB(然后我有一些其他代码更新TLC5940 IC LED驱动芯片对于引脚上的每个高/低,代码继续以类似的方式采用绿色和蓝色8位。)

这不起作用,我输出到LED的颜色表现不正确。

但是,如果我按如下方式更改代码,则例程可以正常工作

if (CubeStatusArray[x][y][Layer]){
    for(int8_t bitpos=7; bitpos >= 0; bitpos--){
        if(0b00000000111111111110101010111110>>16)&(1<<bitpos)) { // This line seems to cause trouble
            setHigh(SINRED_PORT,SINRED_PIN);}
        else {
            setLow(SINRED_PORT,SINRED_PIN);
        }
    }
}
..........

(该行中的实际二进制数无关紧要(前8位始终为零,后8位代表红色,下一位代表蓝色等)

那么,为什么ISR使用固定数字,但如果我尝试使用数组中的数字,则不行。“

以下是显示完整RGB更新的实际代码:

                if (CubeStatusArray[x][y][Layer]){
                      for(int8_t bitpos=7; bitpos >= 0; bitpos--){
                        {if((ColourWheel[Colour]>>16)&(1<<bitpos))
                        {setHigh(SINRED_PORT,SINRED_PIN);}
                        else
                        {setLow(SINRED_PORT,SINRED_PIN);}}
                        {if((ColourWheel[Colour]>>8)&(1<<bitpos))
                        {setHigh(SINGREEN_PORT,SINGREEN_PIN);}
                        else
                        {setLow(SINGREEN_PORT,SINGREEN_PIN);}}
                        {if((ColourWheel[Colour])&(1<<bitpos))
                        {setHigh(SINBLUE_PORT,SINBLUE_PIN);}
                        else
                        {setLow(SINBLUE_PORT,SINBLUE_PIN);}}
                        pulse(SCLK_PORT, SCLK_PIN);
                        pulse(GSCLK_PORT, GSCLK_PIN);
                        Data_Counter++;
                        GSCLK_Counter++;                          } 

2 个答案:

答案 0 :(得分:0)

我认为(之后丢失的if是一个错字。

在缺少调试器的情况下,指示的研究技术是:

  1. 再次确认测试if( ( 0b00000000111111111110101010111110 >> 16 ) & ( 1 << bitpos ) )有效。收集(打印)每个bitpos

  2. 的结果
  3. 0b00000000111111111110101010111110存储在数组的元素0中。重复if( ( ColourWheel[0] >> 16 ) & ( 1 << bitpos ) )。收集结果并与基本情况进行比较。

  4. 0b00000000111111111110101010111110存储在数组的所有元素中。对if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )重复几种不同的颜色值(但手动分配)。收集结果并与基本情况进行比较。

  5. 0b00000000111111111110101010111110存储在数组的所有元素中。使用if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )重复正常分配的颜色值。收集结果并与基本情况进行比较。

  6. 恢复原始程序并重新测试。收集结果并与基本情况进行比较。

答案 1 :(得分:0)

确信ColourWheel[Colour]中的值不符合预期或不稳定。验证索引范围并访问一次。包括代码速度增强。


[编辑]如果接收端不喜欢用ColourWheel[Colour]>>16替换常量引起的较慢的信号变化,那么更有效的代码可以解决这个问题。


 if (CubeStatusArray[x][y][Layer]){
   uint32_t value = 0;
   uint32_t maskR = 0x800000UL;
   uint32_t maskG = 0x8000UL;
   uint32_t maskB = 0x80UL;
   if ((Colour >= 0) && (Colour < 255)) {
     value = ColourWheel[Colour];
   }
   // All you need to do is shift 'value'
   for(int8_t bitpos=7; bitpos >= 0; bitpos--){
     { if( (value & maskR) // set red
     }
     { if( (value & maskG) // set green
     }
     { if( (value & maskB) // set blue
     }
     value <<= 1;
   }