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.

[参考译文] CC3220:可以#39;t 从计时器回调函数发送消息

Guru**** 2553450 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/765806/cc3220-can-t-send-the-message-from-timer-callback-function

器件型号:CC3220

您好!

我正在尝试在发生计时器回调时向任务发送消息。 但未收到消息、请查看我的代码。

////////////////////////////////////////////////////////////////////////////////////////////////
//计时器初始化//
Timer_Params_init (&Timer_params);
Timer_params.periodUnits = Timer_Period_US;
Timer_params.period = 30000000;
Timer_params.timerMode = Timer_Continuous_callback;
Timer_params.timerCallback = Callaback;


Timer_handle = Timer_open (Board_TIMER0、&Timer_params);
if (Timer_handle == NULL){
UART_PRINT ("打开计时器时出错");
}


状态= Timer_start (Timer_handle);
如果(状态= Timer_STATUS_ERROR){
UART_PRINT ("启动计时器时出错"\n);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////

//回叫有趣//
空回叫(Timer_handle){

MSG = DnsclientMessageType_PostLightSts;
ts.tV_sec = 0;
ts.tV_nsec = 0;
RetVal = MQ_timedsend (dnsclientMQueue、(char *)&msg、0、0、&ts);
if (RetVal < 0)
{
while (1);

}
UART_PRINT ("Callaback end \r\n");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

我每隔30秒就会打印一次"Callaback End"、但 c 无法校准到  

DnsclientMessageType_PostLightSts 事件的定义如下: 
DnsclientMessageType queueMsg;
int32_t RetVal;
mq_attr 属性;
struct timespec ts;
uint8_t msg;

/*初始化传感器消息的邮箱*/
ATTR.MQ_maxmsg = 10; //队列大小
attr.mq_msgsize = sizeof (DnsclientMessageType); //邮件大小
dnsclientMQueue = mq_open ("sensors msg q"、O_creat、0、&attr);
if (dnsclientMQueue =空)
{
UART_PRINT ("[dnsclient task]无法创建 msg 队列\n");
while (1)//implement Errolog、重试
{
;
}
}



while (1)
{
queueMsg = DnsclientMessageType_SensorsMessagesMax;

Clock_gettime (clock_realtime、&ts);
ts.tV_sec += 2;

RetVal =
mq_timedreceive (dnsclientMQueue、(char *) queueMsg、
sizeof (DnsclientMessageType)、
null、
(&T);

switch (queueMsg)
{
案例 DnsclientMessageType_SensorsMessagesMax:
中断;

案例 DnsclientMessageType_PostLightSts:
PostData (latestLightSts);

中断;

默认值:
中断;
}
} 

谢谢你

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

    乍一看、您似乎没有在 MQ_timedsend 呼叫中指定消息长度。

    Jesu
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Jesu、
    抱歉、在发布时出现问题。 我还在发送长度
    mq_timedsend (sensorsMQueue、(char *)&msg、1、0、&ts);

    但同样的问题、没有收到消息。 但发送成功。

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

    您是否提到了 switch 语句中的 POST 数据函数? 如果不是,发送的文件描述符必须与预期的 MQ_Receive 相同。 只是指出这一点、原因我不确定您是否 错误地将其更改为 sensorsMQueue。

    Jesu

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

    您好、Jesu、

    您是否提到了 switch 语句中的 POST 数据函数?

    是的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    sensorsMQueue 是否与 dnsclientMQueue 位于同一任务中? 我问的原因是、如果他们这样做、当接收上的一个块被阻塞时、我认为整个任务将被阻塞、这意味着另一个队列也被阻塞。 此外、如果 sensorsMQueue 存在问题、如果您在实际创建和使用它的位置包含代码、则会更容易为您提供帮助。

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

    您好、Jesu、

    sensorsMQueue 是否与 dnsclientMQueue 位于同一任务中?

    否、两个队列都属于 2个不同的任务。

    在调试模式下运行时、2-3次我觉得收到了 Msg 、这也是100次。  

    谢谢你

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

    您好!

    我不确定问题是什么。 您似乎正在正确使用 API、并且声称您在单独的任务中使用这些队列。  

    Jesu