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.

[参考译文] CCS/MSP432P401R:调试过程中没有可用的源代码"0xffffff8"

Guru**** 1826070 points
Other Parts Discussed in Thread: CC3100BOOST, CC3100MODBOOST, MSP432WARE, CC3100, SEGGER, CC3200, ENERGIA
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/603554/ccs-msp432p401r-no-source-available-for-0xfffffff8-during-debug

部件号:MSP432P401R
主题中讨论的其他部件: CC3100BOOSTCC3100MODBOOSTMSP432WARECC3100SEGGERCC3200ENERGIA

工具/软件:Code Composer Studio

您好,

我正在继续努力将“CC3100BOOST_MQTT-TwitterLED_MSP432P401R”示例移植到GNU C++中,我已经成功地将其构建, 但是当我尝试运行调试会话以加载代码时,我得到 了一个“0xfffffff8”错误的“No source available”(无可用源),并且会话没有显示运行箭头,我在许多项目中尝试过此操作,但我没有超过此箭头。  有什么我应该看的?

在这次最新的尝试中,我刚刚导入了一个新版本的MQTT项目,并将其更改为GNU编译器。  我想我在这里错过了一些东西,需要帮助。

谢谢,

Jon

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    感谢您在论坛上发帖。
    您是否还可以添加有关您在MSP端使用的硬件的详细信息? 这是MSP-EXP432P401R Red LaunchPad吗?
    您还提到了"持续努力"。 您是否曾获得过其他帖子的帮助?

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

    该地址看起来像异常返回。  我在使用gcc工具链时看到了这种行为。 我的gdb版本也会像上面一样感到困惑。 发生异常时就会发生这种情况。

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

    Priya,

    我感谢大家的回应。  我创建了另一篇文章来解决我在编译  “CC3100BOOST_MQTT-TwitterLED_MSP432P401R”示例时遇到的问题,但在GCC和TI-RTOS中,我通过了该文章,因此我认为问题在很大程度上得到了解决。  

    但是,现在我看到了我在运行示例时发布的问题,但现在使用GNU v.4.9 .3 Linaro编译器,而不是TI-RTOS。  

    这是我上一篇文章标题的链接。  抱歉,我不确定如何轻松添加链接。

    “ 编译器/CC3100MODBOOST:CCS/CC3100MODBOOST :MQTT with TI-RTOS和MSP432”

    我应该继续在那里进行对话吗?

    我正在使用预生产的MSP432 Launchpad (黑色版)和CC3100MODBOOST,它与Twitter示例配合使用很好。 但是,我正在处理的项目是基于GNU C+11的,所以我试图将代码从Twitter示例移植到GNU C++项目。  

    注:我也看到红色版MSP432 Launchpad的行为相同。  

    我可以回顾到目前为止我所看到的所有编译器问题,但在启动调试会话加载代码时,如果不出现“No source available for "0xfffffff8"(没有可用的源代码)错误,我似乎无法运行此程序。 我知道硬件可以正常工作,因为我仍然可以加载我曾经处理过的Twitter示例,但是除了示例代码之外的每一次尝试都将无法运行。

    有什么想法吗?

    谢谢,

    Jon

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

    我可以回顾到目前为止我所看到的所有编译器问题, 但是,在启动调试会话以加载代码时,如果没有出现“No source available for "0xfffffff8"(没有可用的源代码)错误,我似乎无法运行此程序。[/QUOT]您是否可以发布CCS调试器的屏幕截图, 希望了解是否有任何其他堆栈回溯信息可以提供有关发生情况的线索。

    此外,由于您使用的是TI-RTOS,如果您使用RTOS对象视图(ROV)-> BIOS ->扫描错误,是否报告了任何错误?

    如果您附加了有问题的项目,我可以尝试调试崩溃的来源。

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

    我感谢大家的回应。 我以为昨天晚上发送了回复,但我看不到。 我没有看到包含屏幕截图或列出代码的选项,就像我最初发布此内容时那样,所以我只能包含我可以包含的内容。

    目前,我已将TI-RTOS的内容放在一边,只是使用MSP432Ware的“CC3100BOOST_MQTT-TwitterLED_MSP432P401R”示例,但将编译器更改为GNU 4.9 v.3 Linaro并为C++设置环境。 除了在编译项目时由于使用GNU gcc而指出的一些问题之外,代码与示例中的代码相同。 我确实有其他正在工作的GNU 4.9 v.3 Linaro C++项目,甚至使用TI-RTOS,所以我不知道为什么这不起作用。

    这是我在运行调试会话并单击XDS110调试探测器列表时看到的错误。 注意:此时我可以暂停调试会话,因为它似乎卡在Default_Handler循环中。

    德州仪器(TI) XDS110 USB调试探头/Cortex_M4_0 (挂起)
    default_Handler() at startup_msp432p401r_gcc.c:200 0x0000EA4
    0XFFFFFFF8 (没有为0xFFFFFFF8定义符号)

    如果单击Default_Handler行,则Disassembly窗口将显示在启动文件的Default_handler中列出的地址。
    这是在SystemInit()和SystemCoreClocksUpdate()之间

    这是启动调试会话时启用详细时在控制台中看到的内容:

    Cortex_M4_0:Gel输出:内存映射初始化完成
    Cortex_M4_0:Gel输出:停止看门狗计时器
    Cortex_M4_0:警告:在MSP432P401R上,当器件处于低功耗模式时,调试器无法检测到遇到断点。
    在调试过程中单击暂停按钮,检查设备是否处于断点处。
    Cortex_M4_0:闪存编程器:启用详细输出
    Cortex_M4_0:闪存编程器:2.2 版本。1.0
    Cortex_M4_0:闪存编程器:硬重置
    Cortex_M4_0:写入闪存@地址0x0万长度0x0.0007万ff0
    Cortex_M4_0:闪存编程器:正在将RAM加载器上载到设备
    Cortex_M4_0:闪存编程器:设备初始化完成
    Cortex_M4_0:闪存编程器:擦除主内存
    Cortex_M4_0:闪存编程器:批量擦除已完成
    Cortex_M4_0:闪存编程器:正在将3.2752万字节写入闪存0x0万
    Cortex_M4_0:闪存编程器:写入速度18.9 KB/秒
    Cortex_M4_0:闪存编程器:退出闪存编程
    Cortex_M4_0:写入闪存@地址0x0.0007万ff0长度0x0.0007万ff0
    Cortex_M4_0:闪存编程器:将3.2752万字节写入闪存0x0.0007万ff0
    Cortex_M4_0:闪存编程器:写入速度14.4 KB/秒
    Cortex_M4_0:闪存编程器:退出闪存编程
    Cortex_M4_0:写入闪存@地址0x0000ffe0长度0x0.0007万ff0
    Cortex_M4_0:闪存编程器:正在将3.2752万字节写入闪存0x0000ffe0
    Cortex_M4_0:闪存编程器:写入速度14.7 KB/秒
    Cortex_M4_0:闪存编程器:退出闪存编程
    Cortex_M4_0:写入闪存@地址0x0.0017万fd0长度0x0.0006万a10
    Cortex_M4_0:闪存编程器:将2.7152万字节写入闪存0x0.0017万fd0
    Cortex_M4_0:闪存编程器:写入速度13.8 KB/秒
    Cortex_M4_0:闪存编程器:退出闪存编程
    Cortex_M4_0:写入闪存@地址0x0001e9e0长度0x0.0978万
    Cortex_M4_0:闪存编程器:将2424字节写入闪存0x0001e9e0
    Cortex_M4_0:闪存编程器:写入速度11.7 KB/秒
    Cortex_M4_0:闪存编程器:退出闪存编程
    Cortex_M4_0:写入闪存@地址0x0001f358的长度0x0万e4
    Cortex_M4_0:闪存编程器:向闪存0x0001f358写入228字节
    Cortex_M4_0:闪存编程器:写入速度1.4 KB/秒
    Cortex_M4_0:闪存编程器:退出闪存编程
    Cortex_M4_0:闪存编程器:硬重置
    Cortex_M4_0:闪存编程器:释放看门狗计时器
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jon MORSS 说:
    我没有看到包含屏幕截图或列出代码的选项,就像我最初发布时那样,所以我只能包含我可以包含的内容。[/QUOT]回复时,如果单击"使用丰富格式"链接,您将可以选择插入图像, 文件或语法突出显示的代码。

    如果单击Default_Handler行,Disassembly (反汇编)窗口将显示在启动文件的Default_handler中列出的地址。
    这是在SystemInit()和SystemCoreClocksUpdate()[/quot]之间。如果 调用Default_handler,则表示发生了中断,没有注册用户处理程序。

    由于该项目与TI编译器配合使用,TI编译器的启动文件有可能在 g_pfnVectors数组中注册了一个中断处理程序, 但是 ,没有进行相应的更改,将中断处理程序添加到GCC编译器的启动文件中的g_pfnVectors数组。

    有关  如何找出导致 调用默认中断处理程序 的外设中断源的信息,请参见Diagnosing Software Faults in StellarisRegistered微处理器(在正常工作的TI编译器项目和非正常工作的GCC编译器项目之间比较g_pfnVectors数组的内容时,原因不明显)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    切斯特
    我很欣赏这份答复,但我所说的是MSP432,而不是TIVA系列MCU。 没有g_pfnVectors,而是“中断向量”。 感谢您提供信息。

    是的,我正在研究我的项目启动文件和原始项目启动文件之间的差异,它们之间有很多差异。 最初启动时仅定义了几个中断处理程序,因为新项目定义(或者重新定义)了其中的大部分,所以这可能会导致某种冲突。 此外,与TIVA版本的启动文件不同,这些MSP32/CC3100项目的启动不是C++友好的,并且没有"#ifdef __cplusplusplusplusplusplusplusplusplusplusplus"条目,因此这可能是另一个问题。
    我将处理此问题,并了解进行一些更改后可以获得哪些信息。

    谢谢!

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

    [引用user="Jon MORSS"]然而,我所处理的是MSP432,而不是TIVA系列MCU。 感谢您指出我的错误,我在查看另一个TIVA项目时发布了我的回复,但感到困惑。

    最初的启动仅定义了几个中断处理程序,正如新项目定义的那样(或者更确切地说是重新定义的) 其中大多数可能会导致某种冲突。

    查看来自MSP432ware 3.50 的TI编译器startup_msp432p401r_CCS.c。00.02 CC3100BOOST_MQTT-TwitterLED_MSP432P401R显示了正在安装的以下外设中断处理程序:

    Systick_Handler, /* Systick处理程序 */
    TA1_0_IRQHandler, /* TA1_0 ISR */
    EUSCIA0_IRQHandler, /* EUSCIA0 ISR */
    Port1_IRQHandler, /*端口1 ISR */
    Port2_IRQHandler, /*端口2 ISR */ 

     startup-msp432p401r_gcc.c与TI编译器startup-msp432p401r_ccs.c不同,因为GCC启动文件将中断处理程序定义为外部函数,但具有名为 Default_Handler的“弱”默认处理程序。 这意味着,如果GCC链接器在链接对象中遇到(非弱)中断处理程序,则链接对象中的中断处理程序在 中断引导程序[]数组中被引用,否则 Default_Handler将在 中断引导程序中被引用。

    这样,通过    确保中断处理程序函数的名称与startup_msp432p401r_gcc.c 文件预期的名称相匹配,就可以在startup中的interrupt Vectors []数组中注册中断处理程序,而不必更改startup命令msp432p401r_gcc.c文件。

     CC3100BOOST_MQTT-TwitterLED_MSP432P401R示例中外围设备中断处理程序的名称与 startup_msp432p401r_gcc.c文件中的名称相匹配。 当 CC3100BOOST_MQTT-TwitterLED_MSP432P401R示例被设置为使用GNU v 4.9 3编译器时,在可执行文件上运行NM显示外设中断处理程序已在 中断向量[]数组中引用,因为函数的地址与Default_Handler不同:

    $/cygdrive/c/ti/ccs720/ccsv7/tools/compiler/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-nm.exe CC3100BOOST_MQTT-TwitterLED_MSP432P401R.Out | eg"(default_Handler|Systick_Handler|TA1_0_IR0万_IR0001_IR0001_IR0_Q0001_IR0_Q0001_IRA0_IRA0_Q0001_IRA0_IRA0_Q0001_IRA0_IRA0_IRA0_Q0001_IRA0_Q0001_IRA0_IRA0_IRA0_IRA0_Q0001_IRA0_IRA0_Q0001_Q0001_IRA0_IRA0_IRA0_Q0001_Q000</s>0001 00010001000100010001000100010001000100010001
    
    
    
    
    
    

    此外,与TIVA版本的启动文件不同, 这些MSP32/CC3100 项目的启动不是C++友好的,并且没有"#ifdef __cplusplusplusplusplusplusplusplusplusplusplus"条目,因此这可能是另一个问题

    如果为中断处理程序提供C++链接,则名称将被更改,并且与 startup_msp432p401r_gcc.c.预期的名称不匹配 例如,包含EUSCIA0_IRQHandler中断处理程序 的CLI_UART.c示例文件被重新命名为cli_uart.cpp,将其编译为C++。 这将导致 EUSCIA0_IRQHandler被赋予一个名为的C++转换,而不是在 中断引导程序[]数组中引用,如弱符号 EUSCIA0_IRQHandler的地址所示,该地址与 Default_Handler函数具有相同的地址:

    $/cygdrive/c/ti/ccs720/ccsv7/tools/compiler/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-nm.exe CC3100BOOST_MQTT-TwitterLED_MSP432P401R.Out |_egerv "(Default_Handler|Systick_Handler|TA1_0_IR0万_IAQ0001_IR0_IA0001_IRA0_IRA0_IRA0_Q0008_IRA0_IAS0001_IRA0_IRA0_1_IRA0_1_IRA0_IRA0001_IRA0_IQ0001_IQ0001_IRA0_IRA0_IRA0_IRA0_IRA0_1_IAB0_IQ0001_1_IRA0_IRA0_IQ0001_IQ0001_IQ0001_IRA0_1</s>0001 0001000800010001000100010001000100010001
    
    
    
    
    
    
    

    在cli_uart.cpp文件中 ,为EUSCIA0_IRQHandler提供了C链接:

    extern "C" void EUSCIA0_IRQHandler (void)
    { 

    然后,EUSCIA0_IRQHandler被引用到 中断向量[]数组中:

    $/cygdrive/c/ti/ccs720/ccsv7/tools/compiler/gcc-arm-none-eabi-4_9-2015q3/bin/arm-none-eabi-nm.exe CC3100BOOST_MQTT-TwitterLED_MSP432P401R.Out | eg"(default_Handler|Systick_Handler|TA1_0_IR0.001万_IR0001_IR0001_IR0_IR0_Q0001_IRA0_Q0001_IRA0_IRA0_Q0001_IRA0_IRA0_IRA0_Q0001_IRA0_IRA0_Q0001_IRA0_IRA0_IRA0_Q0001_IRA0_IRA0_Q0001_IRA0_IRA0_IRA0_Q0001_IRA0_IRA0_Q0001_I</s>0001 0001000100010001000100010001000100010001
    
    
    
    
    
    

    例如 ,在项目的GCC版本中调用Default_Handler函数的问题可能是由于中断处理程序被赋予C++链接。

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

    切斯特

    我很感谢提供的信息。

    为了避免名称转换以及一些编译时间错误,我将startup_msp432p401r_gcc.c更改为:

    /************************************************************************
    *
    版权所有(C) 2012 - 2016 Texas Instruments Incorporated - http://www.ti.com/
    *
    **在
    
    满足以下条件的情况下,允许以源代码和二进制形式进行重新发布和使用,无论是否进行*修改:
    *
    *重新分发源代码必须保留上述版权
    *声明,此条件列表和以下免责声明。
    *
    *以二进制格式重新发布必须在
    
    *
    发布时提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
    *
    *未经
    
    事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或推广本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"提供,
    
    不提供任何明示或暗示的担保,包括但不限于对适销性和特定用途适用性*的暗示担保。 在任何情况下,版权
    *所有者或贡献者均不对任何直接,间接,附带,
    *特殊,模范, 或后果性损害(包括但不
    限于购买替代商品或服务;使用损失,
    *数据或利润; (包括
    
    疏忽或其他原因),但因使用
    本软件*而导致的任何*责任理论,无论是合同,严格责任还是侵权*(包括疏忽或其他),即使已告知可能发生此类损害。
    *
    * MSP432P401R中断向量表
    *
    ************************************************************************* /
    
    #include <stdint.h>
    
    /*应用程序的入口点。 */
    #ifdef __cpluplus
    extern "C" int _mainCRTStartup();
    #else
    extern int _mainCRTStartup();
    #endif
    
    /*系统初始化函数的外部声明 */
    #ifdef __cpluplus
    
    
    
    
    
    
    
    
    
    
    extern "C" void SystemInit(void);#else extern void SystemInit(void);#endif #ifdef __cpluplus extern "C"{#endif }nUede32_t __data_load__;#intn UINT32_t __data_expluplus "c_
    
    
    
    
    
    
    
    /*默认故障处理程序的转发声明。 */
    void Default_Handler(void);
    extern void Reset_Handler (void)__attribute__((weak));
    
    /* Cortex-M4处理器例外*/
    #ifdef __cpluplus
    extern "C"{
    #endif
    extern void NMI_Handler (void)__attribute___((weak,alias("Default_Handler"));
    extern void HardFault_Handler (void)__attribute___(weak,alias("Default_Default_Handler"));
    extern void MemManage_Handler (void)__attribute___svc (weak,weak Handler("Default_Handler"))))_
    
    
    (void)__attribute__(weak,alias ("Default_Handler")));
    extern void DebugMon_Handler (void)__attribute__(weak,alias ("Default_Handler")));
    extern void PendSV_Handler (void)__attribute___((weak,alias ("Default_Handler"));
    #ifdef __cplusplus
    }
    #endif /*__cplusplus */*
    
    设备特定中断处理程序*/*
    应用程序使用的中断处理程序的外部声明。 */
    #ifdef __cpluplus
    extern "C"{
    #endif
    extern void Systick_Handler(void);
    extern void Port1_IRQHandler(void);
    extern void TA1_0_IRQHandler(void);
    extern void port2_IRQHandler(void);
    extern void EUSCIA0_IRQHandler(void);
    #ifdef __cplusplus
    }
    #endif /*__cplusplus */*
    由用户*/*
    
    中断矢量表添加。 请注意,必须将正确的构造放置在*//*上
    ,确保它在physical address 0000.0000 中结束,或在的开头结束 */*
    程序(如果位于0以外的起始地址)。
    * */
    #ifdef __cpluplus
    extern "C"{
    void (* const interruptvectors[])(void)__attribute__(section(".intvecs"))={
    
    #else
    void (* const interruptvector[])(void)__attribute__(section(".intvecs"))=
    {
    #endif
    (pFunc)&__StackTop,
    /*初始堆栈指针*/
    Reset_Handler, /*重置处理程序 */
    NMI_Handler, /* NMI处理程序 */
    HardFault_Handler, /*硬故障处理程序*/
    	Default_Handler, /* MPU故障处理程序 */
    	Default_Handler, /*总线故障处理程序 */
    	Default_Handler, /*用法错误处理程序*/
    0, /*保留 */
    0, /*保留 */
    0, /*保留 */
    0, /*保留 */
    	Default_Handler, /* SVCall处理程序 */
    Default_Handler, /*调试监视器处理程序 */
    0, /*保留 */
    	Default_Handler, /* PendSV处理程序 */
    Systick_Handler, /* Systick处理程序 */
    	Default_Handler, /* PSS ISR */
    	Default_Handler, /* CS ISR */
    	Default_Handler, /* PCM ISR */
    	Default_Handler, /* WDT ISR */
    	Default_Handler, /* FPU ISR */
    	Default_Handler, /* FLCTL ISR */
    	Default_Handler, /* COMP0 ISR */
    	Default_Handler, /* COMP1 ISR */
    	Default_Handler, /* TA0_0 ISR */
    	Default_Handler, /* TA0_N ISR */
    TA1_0_IRQHandler, /* TA1_0 ISR */
    	Default_Handler, /* TA1_N ISR */
    	Default_Handler, /* TA2_0 ISR */
    	Default_Handler, /* TA2_N ISR */
    	Default_Handler, /* TA3_0 ISR */
    	Default_Handler, /* TA3_N ISR */
    EUSCIA0_IRQHandler, /* EUSCIA0 ISR */
    	Default_Handler, /* EUSCIA-1 ISR */
    	Default_Handler, /* EUSCIA2 ISR */
    	Default_Handler, /* EUSCIA3 ISR */
    	Default_Handler, /* EUSCIB0 ISR */
    	Default_Handler, /* EUSCIB1 ISR */
    	Default_Handler, /* EUSCIB2 ISR */
    	Default_Handler, /* EUSCIB3 ISR */
    	Default_Handler, /* ADC14 ISR */
    	Default_Handler, /* T32_INT1 ISR */
    	Default_Handler, /* T32_INT2 ISR */
    	Default_Handler, /* T32_INTC ISR */
    	Default_Handler, /* AES ISR */
    	Default_Handler, /* RTC ISR */
    	Default_Handler, /* DMA_ERR ISR */
    	Default_Handler, /* DMA_INT3 ISR */
    	Default_Handler, /* DMA_INT2 ISR */
    	Default_Handler, /* DMA_INT1 ISR */
    	Default_Handler, /* DMA_INT0 ISR */
    Port1_IRQHandler, /*端口1 ISR */
    Port2_IRQHandler, /*端口2 ISR */
    	Default_Handler, /* PORT3 ISR */
    	Default_Handler, /*端口4 ISR */
    	Default_Handler, /* PORT5 ISR */
    	Default_Handler /* PORT6 ISR */
    };/*
    
    默认故障处理程序的转发声明。 */*
    这是在重
    置事件后处理器首次开始执行*/*时调用的代码。 仅执行绝对必要的设置,*/*
    ,然后调用应用程序提供的entry()例程。 任何奇特的*/*
    操作(例如根据重置原因寄存器作出决定,以及*/*
    重置该寄存器中的位)都只能由*/*
    应用程序来执行。 */
    void Reset_Handler (void)
    {
    
    	/*调用系统初始化例程*/
    		SystemInit();
    
    	/*跳至主初始化例程。 */
    	_mainCRTStartup();
    }/*
    
    这是处理器收到意外*/*
    中断时调用的代码。 这只是进入无限循环,保留系统状态*/*
    供调试器检查。 */
    void Default_Handler(void)
    {/*
    	输入无限循环。 */
    	while (1)
    	{
    	}
    }
    

    main.cpp的外观如下所示:

    *
    ** main.c - MQTT Twitter控制的RGB LED示例应用
    *
    *版权所有(C) 2014 Texas Instruments Incorporated - http://www.ti.com/
    *
    
    *****允许以源代码和二进制形式重新发布和使用,无论
    是否进行*修改,前提是
    满足以下条件*:
    *
    *重新分发源代码必须保留上述版权
    *声明,此条件列表和以下免责声明。
    *
    *以二进制格式重新发布必须在
    
    *
    发布时提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
    *
    *未经
    
    事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或推广本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"提供,
    
    不提供任何明示或暗示的担保,包括但不限于对适销性和特定用途适用性*的暗示担保。 在任何情况下,版权
    *所有者或贡献者均不对任何直接,间接,附带,
    *特殊,模范, 或后果性损害(包括但不
    限于购买替代商品或服务;使用损失,
    *数据或利润; (包括
    
    疏忽或其他原因),但因使用
    本软件*而导致的任何*责任理论,无论是合同,严格责任还是侵权*(包括疏忽或其他),即使已告知可能发生此类损害。
    *
    **/
    
    *
    *应用程序名称 - MQTT Twitter受控RGB LED
    *应用概述-这是一个示例应用程序,演示如何
    * 连接到MQTT代理并发布/订阅
    * 到主题。 已创建一个Web服务器以进行搜索
    * 适用于包含井号*的所有公共推文
    #MSP432LaunchPad和RGB(#,#,#)控制命令。
    * Web服务器将RGB()命令发布给所有
    * 正在运行演示的LaunchPad。 该应用程序还
    * 按
    *时发布设备的MAC地址 按下LaunchPad上的按钮S1。 网站
    * 然后,服务器将收到的MAC地址推送给
    * MSP LaunchPad Twitter帐户。
    *
    ** 有关详细信息,请参阅readme.txt
    *//
    
    Standard includes
    
    explen "C"{
    #include <stdlib.h>#include
    
    
    "driverlib.h"
    #include "simplelink.h"
    #include "SL_common.h"
    #include "MQTTClient.h"
    }/*
    
    *以下宏的值应在接入点
    与接入点连接时按接入点修改*接入点的属性 应用程序执行
    *///#define
    SSID_name "<yyour AP的_SSID>" /*要连接的接入点名称。 */
    #define SSID_name "MYSSID" /*要连接的接入点名称。 */
    #define SEC_TYPE SL_SEC_TYPE_WPA_WPA2 /*访问密码的安全类型*//#define
    密钥 "<YYYYER_AP's _Password>"/*安全接入点情况下的密码*/
    #define密钥 "MYPASSWD"/*安全AP的密码*/
    #define passners_LEN PAL_strlen (密钥) /*安全AP的密码长度*//*
    
    
    MQTT服务器和应按应用程序修改的主题属性
    *///#define
    MQTT_Broker_Server "iot.eclipse.org
    //#define subscribe_topic "/MSP/cc3100/demo"
    //#define publish_topic "/MSP/cc3100/dema/fromlp
    
    #define topic #define MQTT_brok_server "myIP/subtrate"
    
    
    
    
    
    
    
    版本/define #subtopic/define " v 1.0 "
    #define application_author "author: jon msrss"
    
    // MQTT消息缓冲区大小
    #define buffer_size 32
    
    #define mCLK_frequency 4800万
    #define pwm_period 255
    
    #define SL_stop_timeout 0xFF
    
    #define small_BUF 32
    #define MAX_SEND_BUF_SIZE 512
    #define MAX_SEND_RCV_SIZE 1024
    
    /*应用程序特定状态/错误代码*/
    typedef enum {
    device_no_in_station_mode =-0x7D0, /*选择此数字以避免与主机驱动程序的错误代码*/重叠
    HTTP_SEND_ERROR = DEVICE_NOT_IN_STACE_MODE - 1,
    HTTP_RECV_ERROR = HTTP_SEND_ERROR - 1,
    HTTP_INVALID_Response = HTTP_RECV_ERROR -1,
    STATUS_CODE_MAX =-0xBB8
    }e_AppStatusCodes;
    
    #define min(X,Y)((X)<(Y)? (x):(Y)
    
    
    /*
    全局变量-- Start
    */*
    按钮反跳状态变量*/
    volatile unsigned int S1buttonDebounce =0;
    volatile unsigned int S2buttonDebounce =0;
    volatile int publishID =0;
    
    unsigned char Addressunsigned[SL_MAC_ADDR_LEN];
    charmacLEAddressLen =SL_MAC_N; macDR_DR_ADDR;
    
    //格式化MAC地址字符串
    uniqueID[9]; //从TLV RAND NUM和MAC地址
    
    
    网络n生成的唯一ID;
    客户端hMQTTClient; // MQTT客户端
    
    _u32 g_Status = 0;
    结构{
    _u8 Recvbuy[MAX_SEND_RCV_SIZE];
    _u8 SendBuff[MAX_SEND_BUF_SIZE];
    
    _u8主机名[small_BUF];
    _u8城市名称[small_BUF];
    
    _u32目标IP;
    _i16 SockID;
    }g_AppData;
    
    /*端口映射器配置寄存器*/
    const uint8_t port_mapping []=
    {
    //端口P2:
    PM_TA0CCR1A,PM_TA0CCR2A,PM_TA0CCR3A,PM_NONE,PM_TA1CCR1A, PM_NONE,PM_NONE,PM_NONE
    };/*
    
    TimerA Uptime配置参数*/
    const Timer_a_UpModeConfig ={
    
    Timer_A_CLOCKSOURCE_SMCLK, // SMCLK时钟源
    Timer_a_CLOCKSOURCE_diverer_8, // SMCLK/8 = 6MHz
    9万, // 15毫秒反跳周期
    Timer_a_TAIE_INTERRUST_DISABLE, //禁用计时器中断
    Timer_a_CCIE_CCR0_interrupT_enable,//启用CCR0中断
    Timer_a_DO清除 //清除值
    };/*
    
    
    全局变量-- END
    *//*
    
    
    
    静态函数定义-- Start
    */
    static _i32设置ConnectionWithAP();
    static _i32 configureSimpleLinkToDefaultState();
    static _i32 initializeAppVariables();
    static void displaybanner();
    static void messageArrived(void MessageData*);
    static void generateUniqueID();/*
    
    
    
    静态函数定义-- END
    */*
    
    
    
    异步事件处理程序-- Start
    */*!
    
    
    \brief此函数处理WLAN事件
    
    Param[IN] pWlanEvent是传递给处理程序的事件
    
    返回 无
    
    注
    
    \warning
    */
    void SimpleLinkWlanEventHandler (SlWlanEvent_t *pWlanEvent)
    {
    IF (pWlanEvent ==空)
    CLI_Write(((unsigned char *)"[WLAN event] NULL指针错误\n\r";
    
    Switch(pWlanEvent->Event)
    {
    案例SL_WLAN_CONNECT_EVENT:
    {
    set_status_bit (g_Status,status_bit_connection);
    
    /*
    *有关连接的AP (如名称,MAC等)的信息将为
    *可在'slWlanConnectResponse_t'-应用程序中使用
    如有需要,*可以使用
    *
    * slWlanConnect灯标 响应t *pEventData =空;
    * pEventData =&pWlanEvent->EventData.STAandP2PModeWlanConnected;
    *
    */
    }
    中断;
    
    案例SL_WLAN_disconnect_event:
    {
    slWlanConnect灯斯_t* pEventData =空;
    
    clr_status_bit (g_Status,status_bit_connection);
    clr_status_bit (g_Status,status_bit_ip_acquired);
    
    pEventData =&pWlanEvent->EventData.STAandP2PModeDisconnected;
    
    /*如果用户已启动'Disconnect (断开连接)'请求,'reason_code'为SL_USER_Initiated _DICOLONNACIATIY*/
    IF (SL_USER_INACITED_IN断 线== pEventData->REAUSE_CODE)
    {
    CLI_Write(((unsigned char *)"设备应应用程序的请求断开了与AP的连接\n\r";
    }
    否则
    {
    CLI_Write(((unsigned char *)"设备因错误而与AP断开连接!! \n\n");
    }
    }
    中断;
    
    默认:
    {
    CLI_Write(((unsigned char *)"[WLAN event] unexpected event \n\r");
    }
    中断;
    }
    }/*!
    
    
    \brief此函数处理通过DHCP获取IP地址的事件
    指示
    
    Param[IN] pNetAppEvent是传递给处理程序的事件
    
    返回 无
    
    注
    
    \warning
    */
    void SimpleLinkNetAppEventHandler (SlNetAppEvent_t *pNetAppEvent)
    {
    IF (pNetAppEvent ==空)
    CLI_Write(((unsigned char *)"[NetApp event] NULL指针错误\n\r";
    
    Switch(pNetAppEvent->Event)
    {
    案例SL_NetApp_IPv4_IPACQUIRED_EVENT:
    {
    set_status_bit (g_Status,status_bit_ip_acquired);
    
    /*
    *有关所连接接入点的IP,网关,DNS等的信息
    *将在'SlIpV4AcquiredAsync_t'-应用程序中提供
    如有需要,*可以使用
    *
    * SlIpV4AcquiredAsync_t *pEventData =空;
    * pEventData =&pNetAppEvent->EventData.ipAcquiredV4;
    *<gateway_IP>= pEventData->网关;
    *
    */
    }
    中断;
    
    默认:
    {
    CLI_Write(((unsigned char *)"[NetApp event] unexpected event \n\r");
    }
    中断;
    }
    }/*!
    
    
    \brief此函数处理HTTP服务器事件的回调
    
    Param[IN] pHttpEvent -包含相关的事件信息
    Param[IN] pHttpResponse -应由用户使用填充
    相关响应信息
    
    返回 无
    
    注
    
    \warning
    */
    void SimpleLinkHttpServerCallback(SlHttpServerEvent_t *pHttpEvent,
    SlHttpServerResponse_t *pHttpResponse)
    {
    /*
    *此应用程序不能与HTTP服务器配合使用-因此,这些应用程序不能与HTTP服务器配合使用
    *此处不处理事件
    */
    CLI_Write(((unsigned char *)"[HTTP event] unexpected event \n\r");
    }/*!
    
    
    \brief此函数处理常规错误事件指示
    
    Param[IN] pDevEvent是传递给处理程序的事件
    
    返回 无
    */
    void SimpleLinkGeneralEventHandler (SlDeviceEvent_t *pDevEvent)
    {
    /*
    *大多数一般错误都不是致命的,应予以处理
    *根据应用程序进行相应调整
    */
    CLI_Write(((unsigned char *)"[常规事件]\n\n");
    }/*!
    
    
    \brief此函数处理套接字事件指示
    
    Param[IN] pSock是传递给处理程序的事件
    
    返回 无
    */
    void SimpleLinkSockEventHandler (SlSockEvent_t *pSock)
    {
    IF (psock ==空)
    CLI_Write(((unsigned char *)"[sock event] NULL指针错误\n\r");
    
    Switch( psock->Event )
    {
    案例SL_SOCKE_TX_FAILED_EVENT:
    {
    /*
    * TX失败
    *
    *有关套接字描述符和状态的信息将为
    *在'SlSockEventData_t'中可用-应用程序可以使用它IF
    *必填
    *
    * SlSockEventData_t *pEventData =空;
    * pEventData =& pSock->EventData;
    */
    Switch( psock->EventData.status )
    {
    案例SL_ECLOSE:
    CLI_Write(((unsigned char *)"[sock event] Close socket operation failed to transmit all queued packets \n\r");
    中断;
    
    
    默认:
    CLI_Write(((unsigned char *)"[sock event] unexpected event \n\r\n");
    中断;
    }
    }
    中断;
    
    默认:
    CLI_Write(((unsigned char *)"[sock event] unexpected event \n\r\n");
    中断;
    }
    }/*
    
    异步事件处理程序-- END
    *//*
    
    
    
    应用程序的入口点
    */
    int main (int argc,char** argv)
    {
    _i32 RetVal =-1;
    
    RetVal = initializeAppVariables();
    Assert _on_error (RetVal);
    
    /*停止WDT并初始化MCU的系统时钟*/
    stopWDT();
    initClk();
    
    /*引脚2.0 的GPIO设置- 2.2 */
    MAP_PMAP_configurePorts((const uint8_t *)端口映射,PMAP_P2MAP,1,
    PMAP_禁用_重新配置);
    
    MAP_GPIO设置外围模块功能输出引脚(GPIO_PORT_P2,
    GPIO _PIN0 | GPIO _PIN1 | GPIO _PIN2,GPIO主要模块功能);
    
    /*将WFP 1.1 和1.4 设置为输入并启用中断*/
    GPIO _setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO _PIN1 | GPIO _PIN4);
    GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1 | GPIO PIN4);
    GPIO _启用中断(GPIO_PORT_P1, GPIO _PIN1 | GPIO _PIN4);
    GPIO中断边缘选择(GPIO_PORT_P1, GPIO PIN1| GPIO _PIN4,GPIO高电平转换为低电平转换);
    GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1 | GPIO PIN4);
    
    GPIO _setOutputLowOnPin (GPIO端口P1,GPIO _PIN0);
    GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN0);
    
    /*为RGB LED*/配置TimerA0
    TA0CCR0 = PWM_Period; // PWM周期
    TA0CCTL1 = OUTMOD_7; // CCR1重置/设置
    TA0CCR1 = PWM_Period *(0/255); // CCR1 PWM占空比
    TA0CCTL2 = OUTMOD_7; // CCR2重置/设置
    TA0CCR2 = PWM_Period *(0/255); // CCR2 PWM占空比
    TA0CCTL3 = OUTMOD_7; // CCR3重置/设置
    TA0CCR3 = PWM_Period *(0/255); // CCR3 PWM占空比
    TA0CTL = tassel__SMCLK | MC__UP | TCLR;// SMCLK,UP模式,清除TAR
    
    /*为UP模式配置TimerA1 */
    Timer_a_configureUptime (timer_a1_base,&upConfig);
    
    interrupT_enableInterrupt (INT_TA1_0);
    interrupT_enableInterrupt (INT_Port1);
    interrup_enableMaster();
    
    /*配置命令行界面*/
    CLI_Configure();
    
    displayBanner();
    
    /*
    *以下功能通过清洁将设备配置为默认状态
    *存储在NVMEM中的永久设置(即连接配置文件和)
    *策略,电源策略等)
    *
    *如果开发人员确定,应用程序可以选择跳过此步骤
    *设备在应用程序启动时处于默认状态
    *
    *请注意,在上完成的所有配置文件和永久设置
    *设备将丢失
    */
    RetVal = configureSimpleLinkToDefaultState();
    IF (RetVal < 0)
    {
    如果(DEVICE_NOT_IN_STAND_MODE == RetVal)
    CLI_Write(((unsigned char *)"未能在默认状态下配置设备\n\r";
    
    loop_forever ();
    }
    
    CLI_Write(((unsigned char *)"设备配置为默认状态\n\r");
    
    /*
    *假设设备已在工作站模式下配置
    *并且它处于默认状态
    */
    RetVal = SL_Start (0,0,0);
    如果(RetVal < 0)||
    (Role_STA!= RetVal))
    {
    CLI_Write(((unsigned char *)"无法启动设备\n\r";
    loop_forever ();
    }
    
    CLI_Write(((unsigned char *)"设备已作为工作站启动\n\r";
    
    /*正在连接到WLAN AP */
    RetVal =设置ConnectionWithAP();
    IF (RetVal < 0)
    {
    CLI_Write(((unsigned char *)"无法建立与AP的连接\n\r";
    loop_forever ();
    }
    
    CLI_Write(((unsigned char *)"获取了通过AP和IP建立的连接\n\r\n");
    
    //获取MAC地址
    SL_NetCfgGet (SL_MAC_ADDRESS_GET,NULL,&macAddressLen,(unsigned char *) macAddressVal);
    
    //打印要格式化的MAC地址字符串
    snprintf (macStr,sizeof (macStr),"%02x:%02x:%02x:%02x:%02x:%02x",
    macAddressVal[0],macAddressVal[1],macAddressVal[2],macAddressVal[3],macAddressVal[4], macAddressVal[5]);
    
    //从TLV随机编号和MAC地址生成32位唯一ID
    generateUniqueID();
    
    Int RC = 0;
    unsigned char buf[100];
    unsigned char readbuf[100];
    Int MQTT_port = 8883;
    
    新网络(&N);
    rc = ConnectNetwork(&n, MQTT_Broker_Server, MQTT_port);
    
    如果(RC !=0){
    CLI_Write(((unsigned char *)"未能连接到MQTT代理\n\n");
    loop_forever ();
    }
    CLI_Write(((unsigned char *)"已连接到MQTT代理\n\n");
    
    MQTTClient (&hMQTTClient,&n,1000,buf,100, readbuf,100);
    MQTTPacket_connectData CDATA = MQTTPacket_connectData_initializer;
    ![CDATAMQTTVersion =3;
    clientID.Cstring = uniqueID;
    rc = MQTTConnect(&hMQTTClient,&CDR);
    
    如果(RC !=0){
    CLI_Write(((unsigned char *)"无法启动MQTT客户端\n\n");
    loop_forever ();
    }
    CLI_Write(((unsigned char *)"已成功启动MQTT客户端\n\n");
    
    rc = MQTTSubscribe(&hMQTTClient, subscribe_topic, QOS0, messageArrived);
    
    如果(RC !=0){
    CLI_Write(((unsigned char *)"无法订阅/MSP/cc3100/demo主题\n\r");
    loop_forever ();
    }
    //CLI_Write(((unsigned char *)"订阅了/MSP/cc3100/demo主题\n\n");
    CLI_Write(((unsigned char *)"订阅了");
    CLI_Write((unsigned char *)subscor_topic);
    CLI_Write(((unsigned char *)"主题\n\r\n");
    
    rc = MQTTSubscribe(&hMQTTClient,uniqueID,QOS0,messageArrived);
    
    如果(RC !=0){
    CLI_Write(((unsigned char *)"无法订阅uniqueID主题\n\r";
    loop_forever ();
    }
    //CLI_Write(((unsigned char *)"订阅了uniqueID主题\n\n");
    CLI_Write(((unsigned char *)"订阅了");
    CLI_Write((unsigned char *)uniqueID);
    CLI_Write(((unsigned char *)"主题\n\r\n");
    
    而(1){
    rc = MQTTYield (&hMQTTClient,10);
    如果(RC !=0){
    CLI_Write(((unsigned char *)" MQTT未能生成\n\n");
    loop_forever ();
    }
    
    如果(publishID){
    Int RC = 0;
    MQTTMessage消息;
    MSG.DUP = 0;
    MSG.id = 0;
    MSG.PAYLOAD = uniqueID;
    MSG.payloadlen = 8;
    MSG.QoS = QOS0;
    MSG.Retained= 0;
    rc = MQTTPublish(&hMQTTClient, publish_topic,&msg);
    
    如果(RC !=0){
    CLI_Write(((unsigned char *)"无法将唯一ID发布到MQTT代理\n\r");
    loop_forever ();
    }
    CLI_Write(((unsigned char *)"已成功发布唯一ID \n\r");
    CLI_Write((unsigned char *)publish_topic);
    CLI_Write(((unsigned char *)"\n\n");
    
    publishID =0;
    }
    
    DELAY (10);
    }
    }
    
    静态void generateUniqueID(){
    CRC32_setSeed(TLV->random_NUM_1, CRC32_mode);
    CRC32_set32位数据(TLV->RANDOM NUM_2);
    CRC32_set32位数据(TLV->RANDOM NUM_3);
    CRC32_set32位数据(TLV->RANDOM NUM_4);
    int i;
    (i = 0;i < 6;I++)
    CRC32_set8BitData (macAddressVal[i],CRC32_mode);
    
    UINT32_t crcResult = CRC32_getResult(CRC32_MODE);
    Sprintf (uniqueID,"%06X",uint16_t (crcResult));
    }
    
    //**************************************************************************************
    ////
    ! \brief MQTT消息已接收回叫-当订阅主题
    //! 接收消息。
    //! Param[IN] 数据是传递给回叫
    //!的数据。
    //! 返回 无
    ////********************************************************************************
    
    静态空消息Arrived(MessageData*数据){
    char buf[buf_size];
    CLI_Write(((unsigned char *)"消息已排列\n\r");
    char *tok;
    长色;
    
    //检查缓冲区溢出
    如果(data->topicName->lenstring.len >= bufer_size){//
    UART_PRINT ("主题名称太长!\n\n");
    返回;
    }
    如果(data->message->payloadlen >= bufer_size){//
    UART_PRINT ("有效载荷太长!\n\n");
    返回;
    }
    
    strncpy(buf, data->topicName->lenstring.data,
    min(bufer_size, data->topicName->lenstring.len));
    buf[data->topicName->lenstring.len]=0;
    
    
    
    strncpy(buf,(const char *)data->message->payload,
    分钟(bufer_size,data->message->payloadlen));
    buf[data->message->payloadlen]= 0;
    
    Tok = strtok (buf,"");
    颜色= strtol (tok,NULL,10);
    TA0CCR1 = PWM_Period *(颜色/ 255.0); // CCR1 PWM占空比
    Tok = strtok (NULL,“”);
    颜色= strtol (tok,NULL,10);
    TA0CCR2 = PWM_Period *(颜色/ 255.0); // CCR2 PWM占空比
    Tok = strtok (NULL,“”);
    颜色= strtol (tok,NULL,10);
    TA0CCR3 = PWM_Period *(颜色/ 255.0); // CCR3 PWM占空比
    
    return;
    }/*
    
    
    端口1中断处理程序。
    只要按下连接到WFP 1.1 的开关*,就会调用该处理程序。
    */
    
    extern "C" void Port1_IRQHandler(void){
    
    UINT32_t状态= gPIO_getEnabledInterruptStatus (gPIO_PORT_P1);
    GPIO清除InterruptFlag (GPIO端口P1,状态);
    
    IF (状态和GPIO _PIN1)
    {
    IF (S1buttonDebounce == 0)
    {
    S1buttonDebounce = 1;
    
    GPIO _setOutputHighOnPin (GPIO端口P1,GPIO _PIN0);
    
    //发布唯一ID
    publishID = 1;
    CLI_Write(((unsigned char *)"** PublishID \n\r ");
    CLI_Write((unsigned char *)publishID);
    CLI_Write(((unsigned char *)"\n\n");
    
    MAP_Timer_a_startCounter(timer_A1_base, timer_a_UP_mode);
    }
    }
    IF (状态和GPIO _PIN4)
    {
    IF (S2buttonDebounce == 0)
    {
    S2buttonDebounce = 1;
    
    CLI_Write(((unsigned char *)" MAC地址:\n\r ");
    CLI_Write((unsigned char *)macStr);
    CLI_Write(((unsigned char *)"\n\n");
    
    MAP_Timer_a_startCounter(timer_A1_base, timer_a_UP_mode);
    }
    }
    }
    
    外部"C" void TA1_0_IRQHandler(void){
    
    GPIO _setOutputLowOnPin (GPIO端口P1,GPIO _PIN0);
    IF (P1IN和GPIO _PIN1)
    {
    S1buttonDebounce = 0;
    }
    IF (P1IN和GPIO _PIN4)
    {
    S2buttonDebounce = 0;
    }
    
    IF ((P1IN和GPIO _PIN1)&&(P1IN和GPIO _PIN4))
    {
    timer_a_stopTimer(Timer_A1_base);
    }
    MAP_Timer_a_clearCaptureCompareInterrupt (TIMER_A1_BASE,
    timer_a_CAPTURECOMPare_register_0);
    }/*!
    
    
    
    \brief此函数将SimpleLink设备配置为默认状态。 它:
    -将模式设置为药柜
    -将连接策略配置为“自动”和“自动智能配置”
    -删除所有存储的配置文件
    -启用DHCP
    -禁用扫描策略
    -将Tx功率设置为最大值
    -将电源策略设置为正常
    -取消注册mDNS服务
    -删除所有过滤器
    
    Param[IN] 无
    
    返回 成功时返回零。 出错时,返回负值
    */
    static _i32 configureSimpleLinkToDefaultState()
    {
    SlVersionFull版本={{0}};
    _WlanRxFilterOperationCommandBuff_t RxFilterIdMask ={{0}};
    
    _u8. Val = 1;
    _u8. configOpt = 0;
    _u8. configLen = 0;
    _u8. 功率= 0;
    
    _i32. RetVal =-1;
    _i32. 模式=-1;
    
    模式= SL_Start (0,0,0);
    asset_on_error(mode);
    
    /*如果设备未处于工作站模式,请尝试将其配置为工作站模式*/
    IF (Role_STA!=模式)
    {
    IF (Role_AP ==模式)
    {
    /*如果设备处于接入点模式,我们需要等待此事件,然后再执行任何操作*/
    while (!is_IP_Acquired (g_Status)){_SlNonOsMainLoopTask();}}
    
    
    /*切换到STA角色并重新启动*/
    RetVal = SL_WlanSetMode (Role_STA);
    Assert _on_error (RetVal);
    
    RetVal = SL_Stop (SL_STOP_TIMEOUT);
    Assert _on_error (RetVal);
    
    RetVal = SL_Start (0,0,0);
    Assert _on_error (RetVal);
    
    /*检查设备是否再次进入工作站*/
    IF (Role_STA!= RetVal)
    {
    /*如果设备未在工作站模式下启动,我们不想继续操作*/
    asset_on_error(device_no_in_station_mode);
    }
    }
    
    /*获取设备的版本信息*/
    configOpt = SL_DEVICE_general_version;
    configLen = sizeof(ver);
    RetVal = SL_DevGet (SL_DEVICE_general_configuration,&configOpt,&configLen,(_u8 *)(&ver));
    Assert _on_error (RetVal);
    
    /*将连接策略设置为Auto + SmartConfig (设备的默认连接策略)*/
    RetVal = SL_WlanPolicySet (SL_policy_connection,SL_connection_policy (1,0,0,0, 1),NULL,0);
    Assert _on_error (RetVal);
    
    /*删除所有配置文件*/
    RetVal = SL_WlanProfileDel(0xFF);
    Assert _on_error (RetVal);
    
    /*
    *设备处于工作站模式。 断开以前的连接(如果有)
    *如果已断开连接,则函数返回0,如果已断开连接,则返回负数
    *如果返回0,则等待'issconnection'事件,忽略其它返回代码
    */
    RetVal = SL_WlanDisconnect();
    IF (0 == RetVal)
    {
    /*等待*/
    while (is_connected(g_Status)){_SlNonOsMainLoopTask();}}
    
    
    /*启用DHCP客户机*/
    RetVal = SL_NetCfgSet (SL_IPv4_STA_P2P_CL_DHCP_ENABLE,1,1,&V);
    Assert _on_error (RetVal);
    
    /*禁用扫描*/
    configOpt = SL_SCAN_POLICILE(0);
    RetVal = SL_WlanPolicySet(SL_policy_scan,configOpt,NULL,0);
    Assert _on_error (RetVal);
    
    /*设置工作站模式的Tx功率级别
    介于0-15之间的数字,作为最大功率的dB偏移- 0将设置最大功率*
    功率= 0;
    RetVal = SL_WlanSet (SL_WLAN_CFG_General _Param_ID,WLAN_General _Param_opt_STA_TX_power,1,(_u8 *)&power);
    Assert _on_error (RetVal);
    
    /*将PM策略设置为正常*/
    RetVal = SL_WlanPolicySet (SL_policy_PM,SL_normal_policy,NULL,0);
    Assert _on_error (RetVal);
    
    /*取消注册mDNS服务*/
    RetVal = SL_NetAppMDNSUnRegisterService(0,0);
    Assert _on_error (RetVal);
    
    /*删除所有64个过滤器(8*8)*/
    PAL_Memset(RxFilterIdMask.FilterIdMask, 0xFF, 8);
    RetVal = SL_WlanRxFilterSet (SL_remove_RX_filter,(_u8 *)&RxFilterIdMask,
    sizeof(_WlanRxFilterOperationCommandBuff_t));
    Assert _on_error (RetVal);
    
    RetVal = SL_Stop (SL_STOP_TIMEOUT);
    Assert _on_error (RetVal);
    
    RetVal = initializeAppVariables();
    Assert _on_error (RetVal);
    
    返回RetVal;/*成功*/
    }/*!
    
    
    \brief正在连接到WLAN接入点
    
    此功能连接到所需的AP (SSID_name)。
    一旦我们连接并获取了IP地址,该功能将返回
    
    \param[IN]无
    
    返回 成功时为0,错误时为负错误代码
    
    注
    
    警告如果WLAN连接失败或我们未获取IP地址,
    我们将永远坚持这一职能。
    */
    static _i32设定ConnectionWithap()
    {
    SlSecParams_t secParams ={0};
    _i32 RetVal = 0;
    
    secParams.Key =(_i8*)密钥;
    secParams.KeyLen =密钥_LEN;
    secParams.Type =(_u8) sec_type;
    
    RetVal = SL_WlanConnect(((_i8*)SSID_name, PAL_strlen(((_i8*)SSID_name), 0,&secParams, 0);
    Assert _on_error (RetVal);
    
    /*等待*/
    while ((!is_connected(g_Status))||(!is_IP_Acquired (g_Status))){_SlNonOsMainLoopTask();}
    
    返回成功;
    }/*!
    
    
    \brief此函数将初始化应用程序变量
    
    \param[IN]无
    
    返回 成功时为0,错误
    */
    static _i32 initializeAppVariables()
    {
    G_Status = 0;
    PAL_Memset (&g_AppData,0,sizeof (g_AppData));
    
    返回成功;
    }/*!
    
    
    \brief此函数显示应用程序的标题
    
    "参数 无
    
    返回 无
    */
    静态displayvoid Banner()
    {
    CLI_Write((unsigned char *)"\n\n\r\n\r\n\r\n");
    CLI_Write(((unsigned char *)"\n\n\r\n*************************************************************************************** \n\r\n");
    CLI_Write(((unsigned char *)" MQTT测试\n\r";
    CLI_Write(((unsigned char *)application_version);
    CLI_Write ((unsigned char *)"\n\n");
    CLI_Write(((unsigned char *)application_author);
    CLI_Write(((unsigned char *)"\n\n\r\n*************************************************************************************** \n\r\n");
    CLI_Write(((unsigned char *)"\n\n\r\n\r");
    }
    

    还要注意,在simplelink.h中,有一个缺失的'extern "C",所以我在第391行添加了这个。

    #include "wlan_rx_filters.h"
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    /* Async functions description*/
    
    /*! 

    我仍然遇到与"Default_Handler"滞留相同的问题

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

    您遇到的具体问题是什么?

    当msp432出现异常时,它将放置一个保存各种寄存器的异常堆栈(请参见“infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/Babefdjc.html"”)。  然后将EXC_RETURN值存入LR。

    这就是您看到的内容,调试器正在尝试 获取。  当然,那里没有任何来源。  问题是调试器混淆。

    您可以放心地忽略此问题。  它对您有何影响?

    顺便说一下,您是在例外。  这正是促成这一切的原因。  您是否了解了处理器不满意的方面?

    您需要查看各种h/w寄存器,它们将告诉您采取了什么例外。

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

    Eric,

    "您遇到的问题到底是什么?"

    嗯,我觉得这是相当明显的。

    当我从MSP432Ware运行示例时,我能够编译并运行调试会话以加载代码,然后我通常会看到“绿色箭头”运行按钮,此时我单击它并运行代码。  在这种特殊情况下,当切换到GNU gcc编译器时,我终于能够编译代码,然后运行调试会话,但我看不到突出显示的“绿色箭头”运行按钮来运行代码,而是以Default_Handler结尾。 代码未运行。  为什么我要重新解释这个????

    "您可以放心地忽略这一点。  它对您有何影响?"

    我不知道,因此我在这里发布。

    "顺便说一下,您正在接受例外。  这正是促成这一切的原因。  您是否了解了处理器不满意的方面?

    您需要查看各种h/w寄存器,这些寄存器将告诉您采取了什么例外。"

    N. S.!  我知道这也是为什么我在这里发表。  如果我知道答案,我将发布解决方案。  

    令人沮丧!  

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

    我使用工具链附带的gdb。 我不使用Code Composer,因为它会妨碍您。

    当我遇到0xfffffff8无法显示源代码问题时。 我可以使用gdb "si"或"ni"命令简化单步操作。

    正如我所说,调试器令人困惑,这就是为什么没有绿色的运行按钮。 这里没有源代码,所以我看不出如何使调试器正常运行。 它似乎不知道EXC_RETURN (它应该)。

    查看您是否可以执行单步或单步说明。

    如果这不起作用,您可以尝试安装包含GDB的ARM工具链,然后尝试安装。 您已经在使用这种链(GNU gcc)了。 将项目符号用字节来字节,切换到完整命令行,然后离开Code Composer。

    现在,您好像在绕圈。 如果这不是您想要听到的内容,很抱歉。

    FFFFFFF8是EXC_RETURN,非常独特。 这意味着您例外。 这就是我要开始的地方。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eric,

    谢谢,但这不是我想要的答案,也不是我所期待的答案。 我想我要查找的是为什么调试器会感到困惑? 在TI CCS论坛上发布一个问题时,我会得到一些更符合“您不应该这样做”或“已在版本中得到解决”的内容。 而不是"按项目符号,切换到完整的命令行并离开Code Composer。" 这是本论坛的一个奇怪的答案,并不是很有希望。

    我会看看我是否可以自行找到解决方案,或者是否必须尽快做出真正的设计决策。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [quote user="Jon MORSS">Eric,

    谢谢,但这不是我想要的答案,也不是我所期待的答案。 我想我要查找的是为什么调试器会感到困惑? 在TI CCS论坛上发布一个问题时,我会得到一些更符合“您不应该这样做”或“已在版本中得到解决”的内容。 而不是"按项目符号,切换到完整的命令行并离开Code Composer。" 这是本论坛的一个奇怪的答案,并不是很有希望。

    我会看看我是否可以自行找到解决方案,或者是否必须尽快做出真正的设计决策。

    [/引述]

    很抱歉 ,我没有提供您喜欢的答案。  我想让大家感受一下我在这方面的熟悉情况。

    如果您从CCS获得了很好的答案,那就太好了。  我的经验是,这是一种低概率的感觉,对不起,但这是我的经验。  我在多个场合向TI咨询了各种问题,但没有太大的满足感。  现在,公平地说,TI已经为我提供了几个例子,但大多数情况下不是这样。  别误会我,我喜欢TI硬件。

    鉴于代码合成器的复杂性,我想给您至少一种解决问题的方法。  我不是说“字节”和“交易”。  我想说的是,这是一种可能的解决方法(希望有更多),以便您可以继续取得进展。

    很抱歉,如果它的出现与我预期的不同

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

    听起来,您已经经历过自己对这一问题的沮丧。  

    好的,尽管我已经通过IDE中的资源管理器安装了GNU GCC ARM软件包,但我从TI网站上拉下了'C和平 源:'位,并分别安装了它们。  我比较了项目中的启动脚本和闪烁LED示例,注意到闪烁LED示例中添加了启动脚本中缺失的内容。  

    该评论指出:

    //将数据段初始化程序从闪存复制到SRAM。

    在我的项目中将其添加到启动脚本后,我能够通过"调试期间没有可用的0xfffffff8"源",并且至少在程序开始运行时。  在初始化CC3100时,它仍处于挂起状态,但这肯定比我之前的位置要远一些。

    这就是Reset_Handler现在的样子:

    void Reset_Handler(void){
    	UINT32_t *pui32Src,*pui32Dest;
    
    	////
    	将数据段初始化程序从闪存复制到SRAM。
    	//
    	pui32Src =&__data_load_;
    	for (pui32Dest =&__data_start_; pui32Dest <&__data_end_;){*pui32Dest++
    		=*pui32Src+;}/*
    	
    
    	调用系统初
    	
    
    	始化例程*/ SystemInit();/*跳转到主例程。 */
    	_mainCRTStartup();
    
    }
    

    至少现在我可以设置断点并浏览代码,但没有找到导致CC3100无法完全初始化的原因。  当代码运行时,CC3100上的绿色LED指示灯将会亮起,但这是最远的。

    如果我能通过这个,那么我就觉得我是黄金。

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

    [报价用户="Jon MORSS"]

    听起来,您已经经历过自己对这一问题的沮丧。  

    [/引述]

    是的。  在硬件之上的某个级别上,我不再使用TI材料。  基本上我使用硬件和调试工具。  对于主要调试,我使用Segger Jlink (它们会按方向晃动)。  我还使用过TI板载XDS110-ET和独立的XDS110,但大多数人发现使用TI软件会带来比其价值更多的麻烦。  (对不起,TI,我尝试帮助更改此项,但这也太痛苦了)。

    [报价用户="Jon MORSS"]

    好的,尽管我已经通过IDE中的资源管理器安装了GNU GCC ARM软件包,但我从TI网站上拉下了'C和平 源:'位,并分别安装了它们。  我比较了项目中的启动脚本和闪烁LED示例,注意到闪烁LED示例中添加了启动脚本中缺失的内容。  

    [/引述]

    我使用的是这个://launchpad.net/gcc-arm-embedded,特别是4.9 系列(5系列中有一些东西在我的主要软件的组合方式中存在漏洞,我是TinyOS和gcc 5以及TinyOS的主要开发人员,运行不是很好,非常奇怪)。

    [报价用户="Jon MORSS"]

    该评论指出:

    //将数据段初始化程序从闪存复制到SRAM。

    在我的项目中将其添加到启动脚本后,我能够通过"调试期间没有可用的0xfffffff8"源",并且至少在程序开始运行时。  在初始化 CC3100时,它仍处于挂起状态,但这肯定比我之前的位置要远一些。

    这就是Reset_Handler现在的样子:

    void Reset_Handler(void){
    	UINT32_t *pui32Src,*pui32Dest;
    
    	////
    	将数据段初始化程序从闪存复制到SRAM。
    	//
    	pui32Src =&__data_load_;
    	for (pui32Dest =&__data_start_; pui32Dest <&__data_end_;){*pui32Dest++
    		=*pui32Src+;}/*
    	
    
    	调用系统初
    	
    
    	始化例程*/ SystemInit();/*跳转到主例程。 */
    	_mainCRTStartup();
    
    }
    

    至少现在我可以设置断点并浏览代码,但没有找到导致 CC3100 无法完全初始化的原因。   代码运行时,CC3100上的绿色LED指示灯将会亮起,但这是最远的。

    如果我能通过这个,那么我就觉得我是黄金。

    [/引述]

    进展良好。  很高兴帮助了我们。  请记住,如果代码出错,您将再次看到相同的行为。  我处理您开始发现和提到的所有内容。

    下面是一个指向如何启动的指针:

    github.com/MamMark/mm/blob/master/tos/platforms/dev6a/startup.c

    dev6a平台是TI EXP-MSP432P401R红色(v2)实验板。

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

    谢谢。 是的,我刚刚越过了第一个障碍,遇到了同样的"无源可用于"0xfffffff8"的问题,因此我仍有一些工作要做。 我尝试转到CC3200 SDK MQTT_client示例,但使用TI-RTOS,遇到了一系列全新的问题。 我需要重新思考我的项目,因为我只剩下几周时间来完成它,但我真的希望有一个MQTT解决方案。

    我想我总是可以尝试使用Energia。

    谢谢,

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

    [quote user="Jon MORSS">Eric,

    谢谢。 是的,我刚刚越过了第一个障碍,遇到了同样的"无源可用于"0xfffffff8"的问题,因此我仍有一些工作要做。 我尝试转到 CC3200 SDK MQTT_client示例,但使用 TI-RTOS ,遇到了一系列全新的问题。 我需要重新思考我的项目,因为我只剩下几周时间来完成它,但我真的希望有一个MQTT解决方案。

    想我总是可以尝试使用Energia。

    谢谢,

    Jon

    [/引述]

    首先,每当遇到异常时,您都会遇到"无源,fffffff8"。 您真的需要一个能够处理此问题的工具链。

    接下来,我与Engergia的体验很好。  值得一试。