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.

[参考译文] http_client 项目中的计时器 ISR

Guru**** 2558250 points
Other Parts Discussed in Thread: CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/565444/timer-isr-in-http_client-project

Thread 中讨论的其他器件:CC3200

你好!

我在 cc3200 simplelink 评估板上运行 http_client 示例代码的修改版本。 我目前正在使用基于 https 的 SSL 访问自己的服务器。 这似乎工作正常。 现在我已经建立了连接并完成了初始通信、我希望定期传输信息。 由于我没有使用操作系统(NON_OS 选项)、我尝试设置一个计时器以固定的间隔触发。 这似乎工作正常。 但是、我收到以下错误消息"[sock event]- Unexpected Event [20x]([sock event]-意外事件[20x])、在一段时间后、程序无法开机自检、并返回以下错误消息"Failed to send HTTP POST request header"(无法发送 HTTP POST 请求标头)。 我在没有超时(计时器)的情况下也做了大量的帖子、因此没有警告、代码也按预期执行。 此外、如果计时器 ISR 调用一个简单的任务、则似乎没有问题。

您对此行为是否有任何解释? 也许我需要操作系统才能正确处理来自计时器的中断?

此致、

Jan Gustav Heber

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

    您好!

    SimpleLink API 调用不能从 ISR 上下文中调用。 从中断上下文调用 SL_ API 可能会导致意外行为。

    我建议使用您的超级循环中的 SL_ API、并通过您的计时器解除对该循环的阻断。

    1月

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

    感谢您的快速回复。 我不确定我是否理解您的建议。 我使用超级循环中的 SL_API、但"此循环通过您的计时器解除阻止"是什么意思? 您可以举个例子吗?

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

    如果您不使用操作系统、则您具有包含固件功能的"一个循环"。 您的定时器中断处理程序可以设置一些"全局变量"。 当该变量集为1时、您可以执行 http 客户端请求。
    与操作系统类似。 您的 httpl 客户端将处于任务中,计时器将通过操作系统同步对象解除对该任务的阻止。

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

    再次感谢您的快速回复。 嗯、我的第一次尝试是以这种方式实现它。 让 ISR 递增变量 g_tick。 然后、在超级循环中、我看起来是这样的

    L_tick = g_tick + 1
    while (1){
    如果(local_tick=g_tick)
    执行一些 SL_API 操作
    L_tick = g_tick + 1
    如果结束则结束


    但是、我遇到了一些不稳定情况、因此我尝试将其作为 ISR 的一部分来实现。 正如我之前所说的、完全不将定时器与 ISR 一起使用看起来非常稳定。 是否可以将 sl_API 集成器中的调用与 ISR 进行回调、尽管它们在代码中是分开的? 正如我先前所问的、我是否应该考虑使用某种操作系统?

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

    很抱歉,我不理解你的问题。

    使用操作系统有许多优点。 主要优势是您的应用可以在未来轻松增长(与超循环概念相比、您可以轻松添加功能)。 但在您的情况下、我认为使用操作系统不是强制性的。 由你决定。

    有关 TI-RTOS 的详细介绍、请访问 processors.wiki.ti.com/.../Introduction_to_the_TI-RTOS_Kernel_Workshop

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

    很抱歉、我有点不清楚。 A 我说过、我已经尝试过前面所述的解锁方法。 此外、我使用与类似的 WAIT 语句分开的 SL_API 对函数进行了相应调用、而不是 while 循环

    PostNewSamples();
    map_UtilsDelay (8000000);
    PostNewSamples();
    map_UtilsDelay (8000000);
    PostNewSamples();
    .

    我得到的是与初始消息中所述的相同的行为和错误消息。 使用 map_UtilsDelay (8000000)删除行;只调用 postNewSamples(),不会导致任何错误消息和稳定执行。 我想知道其他操作是否会对 SL_API 函数产生影响。 否则、如何解释这种行为?

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

    您好!

    很难说没有有关代码的更深入的信息、但这种延迟方式不是一种好方法。 更好的延迟应如下所示:

    对于(i = 0;i < 8000;i++){
    _SlNonOsMainLoopTask();
    map_UtilsDelay (1000);
    } 

    1月

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

    我不明白这段代码段和我的代码段之间有什么区别。 两者都调用访问 sl_API 的方法、后跟延迟。 您建议的值1000将导致极短的延迟。 但我想这里的值不是问题。 我的问题是、当我在代码中引入延迟时、为什么我会收到这些错误消息和不稳定性? 您是否有任何其他关于如何在非操作系统环境中使用 SL_API 在 http 帖子之间引入延迟的想法、而不是讨论的想法?

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

    您好!

    我在前一条消息中发布的延迟的主要思想是调用 _SlNonOsMainLoopTask()函数来处理异步事件。 实际延迟将略大于延迟(8000 * 1000)+8000 Calling _SlNonOsMainLoopTask();

    请查看以下"伪代码":

    int gl;
    
    //计时器 ISR
    timerisr (){
    //时间设置 gl 全局变量或从睡眠
    gl 唤醒= 1;
    }
    
    // while
    (1){
    if (gl = 1){
    // http 客户端连接
    https:Send ();
    gl = 0;
    }
    
    //您在 main 中的正常模式,可能是睡眠等
    
    //服务异步事件
    _SlNonOsMainLoopTask();
    
    } 

    1月

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

    你好!


    好的、我终于明白了。 为了处理主循环中的异步事件,必须存在_SlNonOsMainLoopTask()。 我认为这将是对我遇到的问题的一个很好的解释。 但是、插入此调用对行为没有任何影响。 按照您的建议方式实施代码时、问题仍然存在。 奇怪的是、只有当代码出现在 while (1)循环中时、才会发生这种情况。 当我将它们作为序列调用展开时、我不会收到错误消息。 在连接到服务器时,是否有方法可以获得有关导致错误消息[sock event]- Unexpected Event [20x]的更多信息?


    此致、

    扬·古斯塔夫

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

    您好!

    我想您有 sl_socket_ASYNC_EVENT (pSock->Event)。 可以通过 pSock->socketOPAL.Sock.SockData.type 读取事件的原因:

    /*接收 sl_socket_ASYNC_EVENT_时 可能的类型*/

    0 - SSL_ACCEPT =由于 SSL 问题(TCP 通过)而失败

    1 - RX_RACING_TO_BIG =无连接模式、Rx 数据包碎片> 16K、数据包正在被释放

    2 - OTHER 端_关闭_ SSL_DATA_NOT _加密=从安全到不安全的远程端


    在您的类型中,最好知道您具有哪个类型的事件/您需要在处理程序 SimpleLinkSockEventHandler()/中 printf 您的 pSock->socketAppoint.Sock.DisplayData.type。

    1月

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

    你是对的。 它是 sl_socket_ASYNC_EVENT、类型的值为2。 这意味着它报告服务器从安全状态变为不安全状态。 我想知道这与引入延迟有何关系?

    忽略此消息、我现在使它以计时器延迟稳定运行。 诀窍是在等待之前关闭连接。

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

    是您可以忽略此消息。 另外,在延迟之前关闭连接也是合理的(因为在长时间延迟之前未关闭连接,服务器决定从自己的一侧关闭连接)。

    如果您的问题已得到解答、请将此主题标记为已回答。 有关新问题、请打开新问题。

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

    感谢您的大力支持!

    此致、
    扬·古斯塔夫