C++ 我的中断例程无法正确访问数组
对此进行更新-似乎math.h(使用MPIDE编译器)中的trig函数存在一些问题-难怪我在使用自己的math.h的调试器中看不到这一点,因此给出了预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,并转而实现了一种“快速正弦/余弦”算法(见devmaster.com)。我的ISR和色轮阵列现在工作正常 我必须说,作为一个C/C++的新手,我花了很多时间来检查和重新检查我自己的代码是否有错误。我脑海中最后一件可能的事情是,毫无疑问,几十年前编写的一些非常基本的函数可能会产生这样的问题 如果我能够访问实际阵列的屏幕转储,我想我自己早就看到了这个问题,但是,由于我的芯片连接到我的led立方体,我无法直接访问芯片中的数据 嘿,呵呵当我有机会的时候,我会发布一个u形管视频的链接,显示我现在能够编程的波函数,在我的LED立方体上看起来非常好 拉塞尔 ps 非常感谢大家在这里的帮助-通过给我一些追查的途径,它阻止了我完全放弃-在这之前,我当然不太了解Endianness,所以了解了Endianness和一些系统化的方法来进行健壮的调试方法 在中断例程中尝试访问数组时出现问题 下面是ISroutine内部的一段代码C++ 我的中断例程无法正确访问数组,c++,static,interrupt,volatile,C++,Static,Interrupt,Volatile,对此进行更新-似乎math.h(使用MPIDE编译器)中的trig函数存在一些问题-难怪我在使用自己的math.h的调试器中看不到这一点,因此给出了预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,并转而实现了一种“快速正弦/余弦”算法(见devmaster.com)。我的ISR和色轮阵列现在工作正常 我必须说,作为一个C/C++的新手,我花了很多时间来检查和重新检查我自己的代码是否有错误。我脑海中最后一件可能的事情是,毫无疑问,几十年前编写的一些非常基本的函数可能会产生这样的问题 如果
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;
}