Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的中断例程无法正确访问数组_C++_Static_Interrupt_Volatile - Fatal编程技术网

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

C++ 我的中断例程无法正确访问数组,c++,static,interrupt,volatile,C++,Static,Interrupt,Volatile,对此进行更新-似乎math.h(使用MPIDE编译器)中的trig函数存在一些问题-难怪我在使用自己的math.h的调试器中看不到这一点,因此给出了预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,并转而实现了一种“快速正弦/余弦”算法(见devmaster.com)。我的ISR和色轮阵列现在工作正常 我必须说,作为一个C/C++的新手,我花了很多时间来检查和重新检查我自己的代码是否有错误。我脑海中最后一件可能的事情是,毫无疑问,几十年前编写的一些非常基本的函数可能会产生这样的问题 如果

对此进行更新-似乎math.h(使用MPIDE编译器)中的trig函数存在一些问题-难怪我在使用自己的math.h的调试器中看不到这一点,因此给出了预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,并转而实现了一种“快速正弦/余弦”算法(见devmaster.com)。我的ISR和色轮阵列现在工作正常

我必须说,作为一个C/C++的新手,我花了很多时间来检查和重新检查我自己的代码是否有错误。我脑海中最后一件可能的事情是,毫无疑问,几十年前编写的一些非常基本的函数可能会产生这样的问题

如果我能够访问实际阵列的屏幕转储,我想我自己早就看到了这个问题,但是,由于我的芯片连接到我的led立方体,我无法直接访问芯片中的数据

嘿,呵呵当我有机会的时候,我会发布一个u形管视频的链接,显示我现在能够编程的波函数,在我的LED立方体上看起来非常好

拉塞尔

ps 非常感谢大家在这里的帮助-通过给我一些追查的途径,它阻止了我完全放弃-在这之前,我当然不太了解Endianness,所以了解了Endianness和一些系统化的方法来进行健壮的调试方法

在中断例程中尝试访问数组时出现问题

下面是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);
        }
    }
}
..........
这段代码所做的是,先用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);
        }
    }
}
..........
if(立方体阵列[x][y][Layer]){
对于(int8\u t位pos=7;位pos>=0;位pos--){

如果(0B000000001111111110101010111110>>16)和(1>16)和(18)和(1我假设
之后的
如果
是一个打字错误

在没有调试器的情况下,指定的研究方法是:


  • 如果((0B000000001111111110101010111110>>16)和(1>16)和(1>16)和(1>16)和(1确信
    colorwheel[color]
    中的值不是预期的或不稳定的,则再次确认测试
    。验证索引范围和访问一次。包括代码速度增强


    [编辑]如果接收端不喜欢用
    colorWheel[color]>>16
    替换常数所导致的较慢信号变化,则更有效的代码可以解决此问题


    if(立方体阵列[x][y][Layer]){
    uint32_t值=0;
    uint32_t maskR=0x800000UL;
    uint32_t maskG=0x8000UL;
    uint32_t maskB=0x80UL;
    如果((颜色>=0)和&(颜色<255)){
    值=色轮[颜色];
    }
    //你所需要做的就是改变“价值”
    对于(int8\u t位pos=7;位pos>=0;位pos--){
    {if((value&maskR)//设置为红色
    }
    {if((value&maskG)//设置为绿色
    }
    {if((value&maskB)//设置为蓝色
    }
    
    值计算机和设备的Endianness是什么?你说它与数组不兼容。有什么不正确的吗?还有,你是否尝试过运行这两段代码并比较结果?谢谢你的快速回复。我需要对数组中发生的事情进行一点详细解释。数组包含255种不同的“颜色”。我已经定义了将每种颜色定义为红色/绿色、红色/蓝色或绿色/蓝色的组合。因此,32位数字(代表蓝色)中的第二个8位开始为FF并下降到0,同时32位数字(代表蓝色)中的第三个8位开始为0并上升到FF。例如,0b00000000 11110000 000011100000000(为了便于查看,我将数字分隔开)将意味着设置红色的前四位和绿色的最低四位(即主要是蓝色加一点绿色)。要完成这一点,我看到的只是原色(亮度不同)当我使用数组中的颜色时,但当我使用二进制数时,我会看到正确的“混合”颜色。我希望能够循环使用我在主程序中创建的颜色数组。是的,这是我的原稿中的一个拼写错误,有几件事情需要在这里完成。我将完成并重新发布。我不认为我有一个简单的方法来打印结果-我一直在通过MPLAB X(我正在编程一个芯片套件uno32)运行我的代码,以调试和检查每一步的变量变化。通过这项工作,我最终找到了一个解决方案,但实际上是一个解决办法。当我实际直接放入数字时(例如存储0x00F000(红色F0,绿色F0)我得到了预期的黄色,同样0000F0F0(绿色F0,蓝色F0)得到了青色,0x00F0F0得到了白色。因此我尝试了不同的方法,通过设置数组的每个元素直接填充数组,而不是通过公式填充…所以前几行是空填充颜色轮(空){colorwheel[0]=0B0000000011111100000000000000;色轮[1]=0B00000000111111000000000000100;色轮[2]=0B00000000111111000000000001001;等直至色轮[254]=0B0000000011111100000000000000;}这告诉我,原始的Colorwheel数组在从我的主函数传递到ISR时被覆盖或更改。我知道原始的Colorwheel函数正在生成正确的颜色,因为我在调试器中使用它来生成我剪切并粘贴到备用Colorwheel更新中的所有值。我总是它偏向于这样的东西:for(uint8_t mask=0x80;mask;mask>>=1)@mocj是的,尽管我
    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);
            }
        }
    }
    ..........
    
                    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++;                          } 
    
     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;
       }