This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:代码问题??

Guru**** 2535750 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/971387/msp430fr2355-code-issue

器件型号:MSP430FR2355

供参考:

if (!process.sysIDlockoutFlag)(!process.sysIDlockoutFlag)
{
/*
*返回之前的最后四个击键
*所有切换并检查以查看所有内容
*有效(!= 0)
*
P_SEQ = systemIdentification (systemID);
对于(int = 0;sl < 4;sL++)
{
如果(*(p_seq + sl)=0)
{
process.sysIDlockoutFlag = F;
按钮= NUL;
中断;
}
process.sysIDlockoutFlag = T;
按钮= define SYS;
}
}

案例 define _SYS:
if (process.sysIDlockoutFlag)
{
交换机(sysMssg)
{
案例 msg1:
mssg[4]=(0xC0);
mssg[5]=* p_seq;
sysMssg++;
中断;
案例 msg2:
mssg[4]=(0xA0);
mssg[5]=*(p_seq + 1);
sysMssg++;
中断;
案例 msg3:
mssg[4]=(0x90);
mssg[5]=*(p_seq + 2);
sysMssg++;
中断;
案例 msg4:
mssg[4]=(0x88);
mssg[5]=*(p_seq + 3);
sysMssg++;
中断;
默认值:/*
sysMssg = msg1;
currentSwState = 0;
swInfo.multipleSw = F;
swInfo.err = F;
swInfo.twoSec = 0;
memset (swInfo.hits、0、sizeof (swInfo.hits));
process.msgPopulatedFlag = F;
按钮= NUL;
WakeRadio(F);*/
}
}

if ((button == pair)||(button =define SYS))
{
CRC_RESULT = CRC ((char *) PTX);
mssg[6]=(char)((crc_result >> 8)& 0xFF);
mssg[7]=(char)(crc_result & 0xFF);
process.msgPopulatedFlag = T;
}

基础知识...上面的代码将消息放在一起,并为另一个代码块(即一个发送器)做好准备。  如果我在大小写 msg1中放置一个断点,我可以看到 p_seq,所有看起来都很好...如果我然后将断点移动到大小写 msg2,* p_seq 看起来很好,*(p_seq + x)全部被清理。  它被写入的代码中的唯一位置是上面的 if 语句内。  我已经验证了在传输完所有 msg1 - msg4之前、我不会在这里中断。  上面的一些代码周围有一些条件包装程序(未看到)、但是所有标志都指示它们在所有代码被传输出去之前不会改变。  是否有人可以让我了解为什么在最后三个条目上将 p_Seq 值从"良好"更新为"0"?

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它看起来像 systemIdentify()返回指针。 如果 systemIdentify()返回指向栈上某个变量的指针,则栈上的其他变量可能会覆盖 p_seq 指向的内容。

    是否可以显示 systemIdentify()的内容?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是该函数返回 char *、p_seq 是 main 中获取该值的局部变量。  我再也不会调用该函数。  我想我不明白它怎么会被覆盖,因为我认为从函数返回并将值放入 main 中的块函数变量可以防止它被挤压..... 当然、在整个发送4个数据包消息的过程中返回后、将调用其他 ISR。

    unsigned char* systemIdentification (volatile char *p){
    unsigned char j、k、t、r、allSwPosition、 TRAP = 0;
    无符号字符重新对齐[6]={0};
    无符号字符结果[4]={0};
    
    对于(j = 0;j < 6;j++){
    /*
    *这将捕获所有模式的所有模式
    *位设置...应该只有一个位
    所有位都已设置的条目中的*。
    *
    if (*(p+j)& sw_all){
    allSwPosition = j;
    TRAC++;
    }
    }
    /*
    *仅在所有交换机都具有时执行
    *已在其中一个捕获上设置
    *从这里、我们向后计数到
    *找到抛出的交换机
    *对于系统 ID...XOR 循环检查自
    *输入条目以标识什么
    *被抛出...前2个循环
    *重新对齐条目,放置全部
    *在0位置输入
    *
    如果(TRAP = 1){
    对于(k=allSwPosition;k < 6;k++)
    重新对齐[k-allSwPosition ]=*(p+k);
    
    对于(t = 0;t < allSwPosition;t++)
    重新对齐[t +(6-allSwPosition)]=*(p+t);
    
    对于(r = 0;r < 4;r++)
    Result [r]=重新对齐[r+1]^重新对齐[r+2];
    }
    返回结果;
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Steve Wenner"]我想我不理解它如何被覆盖,因为我认为从函数返回并将值放入 main 中的块函数变量可以防止它被压碎。systemIdentify()将 结果[]数组分配为栈上的局部变量, 并返回指向堆栈上 Result []数组的指针。

     一旦 systemIdentify()返回 ,结果[]的栈地址就可以重新用于其他变量。 有关  一些背景信息、请参阅返回栈变量地址。

    s暗示 systemIdentify()被更改,以便 结果数组作为参数传递,调用函数提供该参数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很困惑,因为我从应用程序的修订版1复制了这个函数,它运行正常....我当然可以将一个空数组传递到函数中,以便用结果填充,但这不会破坏使用指针来回移动东西的全部目的?  在主级别是否有办法让指针指向空数组、而该数组在移动到可重复使用结果的下一行代码之前获取结果?

    抱歉...我是一个硬件人员、在过去一年半的时间里、我自己就在空中教授了学习编码

    我想它在版本1中可能是根据 ISR 等相对于版本2的调用方式来工作的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Steve Wenner">我很困惑、因为我从应用程序的版本1复制了此函数、但它运行正常。 变量的范围与寿命 是否有助于解释代码为什么具有 未定义行为

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,我有点理解范围问题,我当然可以看到问题的位置。。

    让 我问你… 我在函数内的变量结果前面放置了静态变量,这似乎解决了我的问题……你能不能以这种方式看到任何错误吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [quote user="Steve Wenner">您能不能以这种方式看到任何错误吗?通过使结果变量为静态变量、唯一的潜在问题是函数不 可重入。 即:

    a:从中断例程和主线程调用 systemIdentify()函数是不安全的。

    b.对 systemIdentify()的第二次调用将覆盖上一次调用的结果。 即 ,需要先处理 systemIdentify()的结果,然后才能再次调用该函数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这两种情况我都在满足.....

    谢谢你