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.

[参考译文] RTOS/MSP-EXP432P401R:I2C从属示例和线程有问题

Guru**** 2542950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/585038/rtos-msp-exp432p401r-problem-with-i2c-slave-example-and-threads

部件号:MSP-EXP432P401R

工具/软件:TI-RTOS

我正在使用最新的1.30 .00.40 SDK。 我将I2C主从示例加载到两个LaunchPad上,没有任何修改,一切都正常工作。 但只要我在从属端添加另一个线程,i2c通信就会中断。

我不知道我是否只是没有正确初始化新线程,但我基本上复制了主线程中的所有内容。 为了使其简单化,第二个线程所做的所有操作都是使LED闪烁。

另外,为什么不使用leep()或sleep()? 每当我叫这两个,似乎一切都停止了。

两个线程本身都能正常工作,只是不能一起工作。 我希望这只是我所忽视的一些愚蠢的事情,因为最终我需要两个i2c从属线程,一个i2c主线程(单独的总线),以及一些其他线程同时运行,如果我不能做这个简单的事情,我会有问题。 我已经在另一个项目中将i2c主线程正常运行,最终需要将所有内容集成到一起。 一次走一小步...

以下是从从属示例修改的main_tirtos.c,所有其他文件都保持不变:

/*
========= main_tirtos.c =========
*/
#include <stdint.h>
#include <unistd.h>

#include <ti/drivers/GPIC.h>/*

POSIX头文件*/
#include <pthread.h>/*

RTOS头文件*/
#include <ti/exterix BIOS/BIOS.h>/*

explet文件*/
#include "Board.h" sysn

void ximarg0*


线程中


的<void <ti/states#stack <ti/states#stack <void *0

#Define Delay 100万
int i;

/*调用驱动程序初始化函数*/
GPIO初始化();

而(1){
GPIO切换(Board_GPIO LED0);
//usleep (100万);//不起作用,为什么?? LED指示灯保持稳定
//睡眠(1);//也不工作,为什么?? LED指示灯保持稳定
对于(i=0; i<delay; i++){}//dusleydelay
}
}/*


==== 主====
*/
int main (void)
{
pthread_t 线程,虚拟线程;
pthread_attr_t. pAttrs,dummy_pAttrs;
结构sched_param priParam, dummy_priParam;
内部 Retc;
内部 分遣国;

/*调用驱动程序初始化函数*/
Board_initGeneral ();

/*设置优先级和堆栈大小属性*/
pthread_attr_init(&pAttrs);
pthread_attr_init(&dummy_pAttrs);
priParam.sched_priority = 1;
虚拟优先级Param.sched_priority = 1;

detachState = pthread_create_detach;
retc = pthread_attr_setdetachstate(&pAttrs, detachstate);
如果(retc !=0){
/* pthread_attr_setdetachstate()失败*/
同时(1);}

retc = pthread_attr_setdetachstate(&dummy_pAttrs, detachState);
如果(retc !=0){
/* pthread_attr_setdetachstate()失败*/
同时(1);}


pthread_attr_setschedparam(&pAttrs,&priParam);
pthread_attr_setschedparam(&Dummy_pAttrs,&dummy_priParam);

retc |= pthread_attr_setstacksize(&pAttrs, THREADSTACKSIZ);
如果(retc !=0){
/* pthread_attr_setstacksize()失败*/
同时(1);}

retc |= pthread_attr_setstacksize(&dummy_pAttrs, THREADSTACKSIZ);
如果(retc !=0){
/* pthread_attr_setstacksize()失败*/
同时(1);}


retc = pthread_create(&thread,&pAttrs, mainThread, NULL);
如果(retc !=0){
/* pthread_create()失败*/
同时(1);}

retc = pthread_create(&Dummy_Thread,&dummy_pAttrs,dummyThread,NULL);
如果(retc !=0){
/* pthread_create()失败*/
同时(1);}


BIOS_START();

返回(0);
}

谢谢。

另外,在另一篇文章中,我看到了SimpleLink学院中关于1.30 SDK的POSIX研讨会,但没有找到它。

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

    您好,

    很棒的问题!  研讨会位于TI资源浏览器中, 此处是一个链接

    乍一看,我会建议将dummyThread设置为比mainThread更高的优先级,并调用sleep或usleep (但如果是usleep,则值小于100万)。  这将使dummyThread切换LED指示灯,然后阻止睡眠呼叫。  阻塞意味着线程(任务)将向其他线程放弃执行,直到它准备好再次执行。  由于它现在的优先级高于mainThread,因此一旦超时结束,它将从低优先级线程中移走控制权,以便它可以再次切换LED并调用Sleep。

    我尝试了这个解决方案。  它看起来大部分都是工作的,但是直到明天我才能够测试I2C线路。  我确实遇到过这样的情况:代码会卡在一个意外的位置。  我不知道为什么代码有时会卡在这里而不是其他代码,但我肯定会很快更仔细地研究这一点。

    现在,我建议研究SimpleLink学院,并尝试按照我上面所述的方式执行,如果您在这一过程中遇到任何问题,请告诉我。  希望这对一些人有帮助。

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

    更高的优先级意味着更高的数量? 无论哪种情况,当我使用sleep()或usleep()时,LED都保持稳定。

    主线程优先级1,dummyThread优先级1:
    I2C不工作,但LED与'illy loop'一起工作
    I2C工作正常,但LED在SLEEP (1)或USSLEEP (50万)时保持稳定

    主线程优先级2,dummyThread优先级1:
    I2C和LED与'illy loop'配合使用
    I2C工作正常,但LED在SLEEP (1)或USSLEEP (50万)时保持稳定

    主线程优先级1,dummyThread优先级2:
    I2C不工作,但LED与'illy loop'一起工作
    I2C工作正常,但LED在SLEEP (1)或USSLEEP (50万)时保持稳定

    i2c不起作用,我的意思是只有来自主程序的第一个指令通过。 主控制器永远不会到达终点并打印'I2C closed!'。

    sleep()和usleep()对我不起作用。

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

    FERDSTER 说:
    John,您好,

    更高的优先级意味着更高的数量? 正确。  无论哪种情况,当我使用sleep()或usleep()时,LED都保持稳定。   如果sleep()和usleep()不起作用,我会很惊讶, 你有什么芯片版本?
     
    主线程优先级1,dummyThread优先级1:这对我很有意义...
    I2C不工作,但LED与'illy loop'一起工作 愚蠢的环路是无阻塞的,因此另一个优先级永远没有机会运行。
    I2C工作,但LED保持稳定,睡眠(1)或usleep(50万)睡眠是一种阻止功能,因此dummyThread 为mainThread和mainThread运行提供执行。 如果mainThread从不阻塞, 则dummyThread将不会再次运行。
     
    主线程优先级2,dummyThread优先级1:
    I2C和LED与'illy loop'配合使用
    I2C工作正常,但LED在SLEEP (1)或USSLEEP (50万)时保持稳定

    主线程优先级1,dummyThread优先级2:
    I2C不工作,但LED与'illy loop'一起工作
    I2C工作正常,但LED在SLEEP (1)或USSLEEP (50万)中保持稳定,这可能是代码示例存在问题的地方。   我需要多看看代码以进行验证,但我认为我们可能会遇到一些优先级反转。  当dummyThread的sleep()过期时,由于它具有较高的优先级,因此它应该抢占mainThread。  我注意到了一些不是这样的地方,我需要更深入地了解 代码,了解为什么不这样做。
     
    i2c不起作用,我的意思是只有来自主程序的第一个指令通过。 主控制器永远不会到达终点并打印'I2C closed!'。
     好的,这是公平的。  我检查了I2C是否发送了一些信号,但没有检查它是否确实完成或验证 是否发送了正确的数据。  我今天还会再来检查一下。
    sleep()和usleep()对我不起作用。  这非常奇怪,您能否尝试评论以下内容并告诉我您是否看到闪烁的LED。  (使用sleep()和/或usleep()函数。)

    // retc = pthread_create(&thread,&pAttrs, mainThread, NULL);//
    if (retc !=0){//
    /* pthread_create()失败*///
    同时(1);//
    } 



    谢谢。

    [/引述]

    您是否还可以验证硬件设置是否适用于I2C总线?  使用 该示例代码及其对应的“i2cslaveexample1”,每台设备上的SDA针脚应相互连接(WFP主控,1.6 副控),SCL针脚应连接到其他设备(WFP主控,6.5 副控,WFP 6.4 1.7)。  还应该有两个10K电阻器,这些线路上各一个,作为Vcc的上拉电阻器。  您可以在您的主板上为我验证这一点吗?

     

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

    您好,John:

    我重新安装了CCSv7并从头开始。 现在sleep()和usleep()工作了-我认为问题可能出在tirtos_builds项目上(我以前修改过它以使用RTC)。

    我正在使用两个红色的LaunchPad,我假设它使用最新的硅片,因为我两周前刚购买了它们。 我将其中一个编程为主机(i2cmasterexample1),另一个编程为我修改的从属代码(两个线程的优先级均为1)。 我修改了主中继器以永久循环并每秒运行一次i2c事务。 所有工作都完美/持续,持续时间超过1万 周期。

    然后,我使用USI_B3 (WFP 6.6 ,WFP 6.7)在从属启动板上添加了第二个从属线程(Priority=1)。 现在,从属启动板总共运行3个线程(USI_B0和USI_B3上的i2c从属,以及dummyThread)。 我将第三个启动板编程为另一个主启动板,这样我现在有两个主启动板连接到我的从属启动板,并不断地与它对话。 最初一切看起来都正常工作,但最终两个从属线程中的一个将锁定,导致其中一个主线程卡住。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,我用不同的组合来解决这个问题,不管我尝试什么,我只能有一个I2C线程可靠地运行。

    最终目标是让一个Launchpad运行多个线程,包括:
    1) USI_B1上的I2C主控
    2) USI_B0上的I2C从控制器
    3) USI_B3上的I2C从控制器
    4) GPIO /按钮中断

    运行单个I2C主线程工作正常,运行单个I2C从线程工作正常,但是一旦我尝试组合它们,其中一个线程最终将被卡住。 尝试运行两个I2C从属线程时也是如此。

    我正在使用MSP432 Launchpad模拟一切,SDA/SCL生产线上有10公里的拉力。 我总共有四个MSP432 LaunchPad。

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

    您能否附加这些文件以便我可以查看您的代码并在我自己的设备上运行?  也许我能够帮助您跟踪这一情况。

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

    您好,John:

    我附上了这两个项目。

    主中继器-仅运行一个线程,查询USI_B1上的i2c从属设备(SDA/SCL WFP 6.4 ,WFP 6.5)。 它基本上是MSP432 1.30 SDK. 00.40 的常用示例,经过修改,可永久添加计数器和循环。

    从属设备-在连接的配置中,它运行两个线程: 一个i2c主设备位于USI_B1 (WFP 6.4)上6.5 , 另一个i2c从设备位于USCI-B0 (WFP 1.6 -WFP 1.7)上。 主线程与上述线程基本相同,从线程来自示例。 在此项目中,您还可以启用第三个线程,以便在USI_B3 (WFP 6.6)上运行第二个i2c从属设备,6.7 但该'pthread_create_'当前已被注释掉。

    我的测试环境包括四个MSP432 LaunchPad (修订版 C)。 两个通过从属项目编程,一个或两个通过主项目编程。

    LP1:从属项目。 与LP2 (WFP,1.6 ,1.7 ,6.5 ,6.5)和LP3 (WFP,6.4 ,1.6 ,WFP,,6.4 1.7)相连。 要测试第二个i2c从属设备,请连接到LP4 (6.6 ,WFP,6.4 ,WFP,6.7 ,6.5)

    LP2:主项目。

    lp3:从属项目(由于没有连接i2c从属线程,因此此LP上的i2c主线程将阻塞,或者您可以禁用i2c主线程)。

    LP4:主项目。

    所有I2C线路都具有10K上拉电压,可达到3.3V。

    我希望所有这些都有意义,您可以让一切正常运行,并找出问题所在。 在连接的配置中,LP2最终将停止打印,因为LP1上的从属设备停止响应。

    感谢您的帮助!

    e2e.ti.com/.../ferdster_5F00_1.zip

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

    您说LP1上的从属设备停止响应。  

    是否意味着LP3 (连接到LP1的从属线程) 停止响应LP1 (主线程)?

    是否意味着LP1 (从属线程) 停止响应LP2?  {或LP1 (从属线程)停止响应LP4?}

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

    因此,在我的大多数试验中,LP1 (主)到LP3 (从属)运行非常可靠。 即 LP1一直在打印,我已经有了10万的打印量。 但我看到LP3 (从属)也在一段时间后停止响应。 请记住,LP1和LP3运行相同的代码,不同的是在LP3上,主线程被阻止,因为它没有连接从属线程,但这本身似乎使从属线程更可靠地运行。

    大多数情况下,LP1 (从属)停止响应LP2 (主)。 即 LP2主控制器的打印输出将达到~200 (有时低至20或高至1000)。 在大多数情况下,LP1将SCL保持在低水平,如果我通过物理地将跳线移动到3.3V并向后移动来手动切换,它将继续(无需在任何主板上重置)。 但有时,这不起作用,而且在范围上,SCL和SDA高时钟连续,然后我必须重置LP1和LP2。

    谢谢。

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

    是否有任何更新? 您是否能够运行项目并复制我看到的内容?

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

    Ferdster,

    我还没有资源来设置此功能。  我正在努力收集必要的信息来帮助您解决此问题,但同时我也有一些其他职责,因此我无法向您保证能够与您一起跟踪此问题的明确时间范围。

    由于您已经进行了此设置,您是否能够在调试中运行设备并隔离代码中的哪个设备挂起以及在什么位置挂起?  我认为一个很好的方法是单独测试每个线程,看看它是失败还是成功,然后慢慢地引入新线程,这样您所做的任何更改都是可回归的。  也就是说,首先测试各个线程,然后以不会破坏以前线程功能的方式引入新线程。

    此外,CCS中还有一个ROV工具,它允许您查看哪些线程(任务)正在运行,被阻止,被抢占等,以及哪些HWI已启用/处于活动状态。  它有时很有帮助。

    我会尽力帮助您,但目前我没有时间和资源来复制您的设置。