gpt4 book ai didi

c - 在 FreeRTOS 中实现线程间通信的最佳方式? - 检查 lwIP 电缆的状态

转载 作者:行者123 更新时间:2023-12-03 12:56:09 27 4
gpt4 key购买 nike

我想在打开/关闭 DHCP 和 TCP 连接的情况下打开/关闭防弹电缆。两种解决方案都可以,但我不知道哪个更明智和正确。 (我怕错误的上下文函数调用)

  • 第一个解决方案:

  • 我叫:
    tcpip_init(network_init, &net);

    然后在那之后:
    xTaskCreate(hc_task, ( signed portCHAR * ) "send hc",1536u, NULL, TCPIP_THREAD_PRIO, NULL);

    所以主要有 2 个线程 lwIP线程和 hc_task线程。 hc_task是:
    static void hc_task(void *parameters)
    {
    struct hc_message mes;
    mes.client_port_number = 4839;
    mes.host_addres = "192.168.1.183\0";
    mes.host_add[0] = 192;
    mes.host_add[1] = 168;
    mes.host_add[2] = 1;
    mes.host_add[3] = 183;
    mes.host_file = "test/data.php\0";
    mes.host_port_number = 80;
    mes.target = "http://192.168.1.183/test/data.php\0";

    transferEnd = 0;
    numberOfPacketsProc = 0;
    totalRecievedSize = 0;

    hc_send(&mes, 0);
    vTaskDelete(NULL);
    }
    hc_send与某个页面建立 TCP 连接以下载它。

    然后我有一个间隔为 2 秒的轮询计时器,用于检查 PHY 并读取电缆状态:
    if cable is on  -> ok
    if cable is off -> call netif_set_link_down(pxNetIfInUse);

    现在下一次当电缆接通时,我打电话:
    netif_set_link_up(pxNetIfInUse);

    我猜在定时器中断中调用这些函数是正确的。
  • 第二种解决方案:

  • 第二种方法是定时器中断发送消息到主 lwip线程:
    Link off -> res = sys_mbox_trypost(toOutput, &msg); 

    定时器中断向主 lwip 线程发送一条消息以调用:
    netif_set_link_up(pxNetIfInUse);

    或:
    netif_set_link_down(pxNetIfInUse); //(in lwip main thread)

    我有一个全局变量来存储电缆状态(从那个定时器中断中保存),我在主 lwip 中检查它线程调用正确的函数(向上或向下链接)。

    所以我在问哪种解决方案是更好/正确的方法:在定时器中断调用链接向下或向上(这些是 lwip 函数)或定时器中断向主 lwIP 线程发送消息?

    我的配置:
    微处理器LPC1768
    - LAN8720 物理层
    - FreeRTOS 7.4
    - lwip 1.4.1
    - 包括 DHCP
    - 包括 TCP/IP

    最佳答案

    感谢 lwip 用户的支持(感谢 Pomeroy Marty、Sylvain Rochet、Richard 和其他帮助我的人 - link to debate)论坛我来回答:

    在定时器调用中:

    //link off
    printf( "Interrupt LINK OFF\n" );
    iface_up = 0;
    resultCall = tcpip_callback_with_block(tcp_set_link_status, NULL, 0);

    //link on
    printf("Interrupt LINK ON\n" );
    resultCall = tcpip_callback_with_block(tcp_set_link_status, NULL, 0);

    所以下面的函数将在主 lwip TCP/IP 线程的线程上下文中执行,这是正确的:
    void tcp_set_link_status(void)
    {
    if(cableState == 0)
    {
    printf("TCP callback printf set link down \n");
    netif_set_link_down(pxNetIfInUse);
    }
    else
    {
    printf("TCP callback Printf set link up \n");
    netif_set_link_up(pxNetIfInUse);
    }
    }

    关于c - 在 FreeRTOS 中实现线程间通信的最佳方式? - 检查 lwIP 电缆的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16694446/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com