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/CC3200-LAUNCHXL:无法在 MQTT_CLIENT 示例中添加事件

Guru**** 2553450 points
Other Parts Discussed in Thread: CC3200-LAUNCHXL

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/707812/rtos-cc3200-launchxl-unable-to-add-event-in-mqtt_client-example

器件型号:CC3200-LAUNCHXL

工具/软件:TI-RTOS

您好!

我正在使用 CC3200-LaunchXL 和导入的 MQTT_CLIENT 示例作为参考。

我想从 UART 读取数据、并在有 UART 中断时在 MQTT 上发送相同的数据

此外、只要有一个按钮中断、我就会向 MQTT 发送一条消息、并且由于这个部件已经被执行、工作正常。

我对 UART 中断的代码进行了相应的更改、

但是、当存在 UART 中断时、I 会对 Msg 进行排队、以便创建事件、并且 OS 会执行 MQTT 消息发送、如 for (;;)循环中所述、

但是、每当我接收到 UART 中断时、代码都会进入加载程序退出、我尝试增大"OSI.h"文件中的栈大小、并增加"OSI_tirtos.c"文件中的队列大小、但我仍然面临相同的问题

下面、我添加了代码段或所做的更改、以添加消息、当存在 UART 中断时将排队、以便操作系统可以执行 MQTT 发送功能

//******** 声明********

typedef struct connection_config{
SlMqttClientCtxCfg_t broker _config;
void * clt_ctx;
unsigned char * client_id;
unsigned char * usr_name;
unsigned char * usr_pwd;
bool 是_clean;
unsigned int keep_alive_time;
slMqttClientCbs_t 回调;
int num_topics;
char *主题[topic_count];
unsigned char QoS[topic_count];
SlMqttWhill_t wo_params;
bool 是已连接的;
}connect_config;

typedef 枚举
{
PUSH_button_SW2_pressed、
PUSH_button_SW3_pressed、
Brocher_DISCONNECT、
UART_RX_MQTT_SEND 
{events;typedef

struct
{
void * hndl;
events event;}event_msg;



//******* UART 的初始化*********


void Initialize_UART()
{
//配置 UART
InitTerm();
//寄存器用于接收数据的 UART 中断处理程序
MAP_UARTIntRegister (器件、UARTIntHandler);
//启用 UART 接收中断
MAP_UARTIntEnable (器件、UART_INT_RX);
//禁用 UART FIFO
UARTFIFODisable (device);
}



//****** UART 中断处理程序*********


空 UARTIntHandler()
{

EVENT_msg msg;
unsigned long ulStatus;
ulStatus = MAP_UARTIntStatus (器件、1);

MSG.EVENT = UART_RX_MQTT_SEND;
MSG.hndl =空;


UARTIntClear (器件、ulStatus);

while (UARTCharsAvail (设备))
{
//
//从终端获取输入。
//
cCharacter = UARTCharGet (器件);

if (cCharacter='#')
{
boolStart=true;

}
IF (boolStart)
{
Cstring[iStringLength ]= cCharacter;
iStringLength ++;
}

if (cCharacter='&')
{
boolStart=false;
boolSendMqt=true;


}
}

//编写指示发布消息的消息
OSI_MsgQWrite (&g_PBQueue、&msg、OSI_NO_WAIT);
UARTIntClear (器件、ulStatus);
}

//******** 主函数********

void main()
{
long lRetVal =-1;
//
//初始化电路板配置
//
BoardInit();

//
//用于 UART 的 Pinmux
//
PinMuxConfig();

//
//配置 UART
//
InitTerm();

Initialize_UART();

//
//启动 SimpleLink 主机
////

********* MQTT_CLIENT 任务主体********

for (;;)
{
OSI_MsgQRead (&g_PBQueue、&RecvQue、OSI_WAIT_FOREVE);

if (push_button_SW2_pressed = RecvQue.event)
{
button_if_EnableInterrupt (SW2);
//
//发送发布消息
//
sl_ExtLib_MqttClientSend ((void*) local_con_conf[iCount].clt_ctx、
pub_topic_sw3、data_sw2、strlen ((char*) data_sw2)、qOS2、retain);
}
否则、如果(push_button_SW3_pressed = RecvQue.event)
{
boolButtonPressed =!boolButtonPressed;

if (boolButtonPressed)
ButtonTimerConfigNStart();
其他
ButtonTimerDeinitStop();

button_if_EnableInterrupt (SW3);

if (boolSmartConfig)
{
转至 FORCE_SMART CONFIG;
}
// //
// //发送发布消息
// //
// sl_ExtLib_MqttClientSend ((void*) local_con_conf[iCount].clt_ctx、
// pub_topic_sw3、data_sw3、strlen ((char*) data_sw3)、qOS2、retain);
}
否则、if (broker_sDISCONNINNINNING_= RecvQue.event)
{

GPIO_IF_LedOn (MCU_RED_LED_GPIO);

if (!is_ip_acquired (g_ulStatus))
{
local_con_conf->is 已连接= true;
sl_ExtLib_MqttClientDisconnect (((void*) local_con_conf[iCount].clt_ctx);
//assert_ON_ERROR (lRetVal);
sl_WlanDisconnect ();
}
lRetVal=CheckInternetConnection();
while (lRetVal < 0)//while ((lRetVal < 0)&&(g_ucRetryConnectionTimeout > retry_connection_timeout_CNT))
{
G_ucConnectTimeout1 = 0;
GPIO_IF_LedOn (MCU_RED_LED_GPIO);
OSI_SLEEP (58000);
GPIO_IF_LedOff (MCU_RED_LED_GPIO);
OSI_SLEEP (2000);
if (!is_connected (g_ulStatus))(如果!is_connected (g_ulStatus)
{
正在重新连接_AP();
}
lRetVal = CheckInternetConnection();
G_ucRetryConnectionTimeout++;
}
}
否则、如果(UART_RX_MQTT_SEND = RecvQue.event)
{
//
//发送发布消息
//
sl_ExtLib_MqttClientSend ((void*) local_con_conf[iCount].clt_ctx、
pub_topic_sw3、data_sw3、strlen ((char*) data_sw3)、qOS2、retain);
}
}
//*********
请尽快帮助我解决此问题 

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

    UTKARSH、您好!

    尝试使用 OSI_InterruptRegister()而不是 MAP_UARTIntRegister()函数。 这些中断由 RTOS 管理、因此您不能将其中的中断直接插入 driverlib 调用。 该错误可能来自 RTOS 调度程序与非 RTOS 管理的中断之间的冲突。

    BR、

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

    您是否能够解决此问题?

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

    很抱歉延迟回复、

    我尝试使用以下语句来注册 UART 中断、但它们不起作用我的代码会在加载程序进入处理程序时进入加载程序退出

    秘书长的报告 UART 初始化********
    秘书长的报告
    MAP_UARTFlowControlSet (UARTA1_BASE、UART_FlowControl_NONE);
    MAP_UARTFIFODisable (UARTA1_BASE);
    #ifdef sl_platform_multi_threaded
    OSI_InterruptRegister (UARTA1_base、(P_OSI_INTR_Entry) UARTIntHandler、INT_PRIORY_LVL_4);
    其他
    MAP_UARTIntRegister (UARTA1_BASE、UARTIntHandler);
    #endif
    //MAP_UARTIntEnable (UARTA0_BASE、UART_INT_RX);
    MAP_UARTIntEnable (UARTA1_BASE、UART_INT_RX|UART_INT_RT);

    (二

    在这种情况下、您能帮助我吗

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

    您好、Utkarash、

    UART 中断处理程序中的哪一行会导致您的代码进入加载程序退出?  是由 OSI_MsgQWrite()调用引起该问题,代码是否在您调用该函数之前崩溃,还是在您退出中断处理程序后代码崩溃?

    如果代码在 OSI_MsgQWrite()之前崩溃,则可能是 UART 外设设置中的某个问题导致了该问题。 如何设置 UART 外设?  

    如果代码在 OSI_MsgQWrite()上崩溃,则可能是消息队列本身的问题。 如果在退出 UART 中断处理程序后发生、则可能是消息队列的存储器管理问题。

    准确地了解哪个函数调用会导致程序崩溃、这将有助于缩小问题的原因。 请找到它并指出它、以便我更好地了解可能的根本原因。

    此致、
    Michael

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

    您好!

    感谢您的回复、

    根据您的建议、我监控代码的确切位置、以使加载程序退出。

    我发现代码在 OSI_MsgQWrite()上崩溃,并且进行了一些更改,现在问题得到了解决。

    我所做的更改是创建了一个 UART 的.c 和.h 文件。

    在这些文件中、我将 UART 处理程序定义为"P_INT_handler g_UARTA1InterruptHdl";该处理程序将调用一个位于主文件中的单独处理程序、该处理程序包含一条将创建事件的消息。

    为了创建 UART 的.c 和.h 文件、我参考了 button_if.c 和 .h 文件

    还有一个查询、就是可以修改 MQTT_CLIENT 示例代码、除非这不会影响代码的正常功能、就像我在本例中所做的那样。

    因为代码运行正常、但有时它不执行任何操作、并且不接受任何中断、如果检查、它会在空闲循环中找到

    谢谢、此致

    Utkarash

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

    SDK 中提供的示例旨在为您的用例提供简单的演示和样片。 您肯定应该对示例和 MQTT 库进行所需的更改。

    如果您需要更多帮助或有任何其他问题、请告诉我。

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

    感谢您的回复以及您为我提供的所有帮助  

    此致

    Utkarash