首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在FreeRTOS中实现线程间通信的最佳方法?-检查lwIP电缆的状态

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

Stack Overflow用户
提问于 2013-05-22 14:28:11
回答 1查看 1.6K关注 0票数 2

我想做一个lwip电缆与DHCP和TCP连接上/关闭防弹。这两种解决方案都很有效,但我不知道哪一种更明智、更正确。(我害怕错误的上下文函数调用)

  • 第一种解决办法:

我呼吁:

代码语言:javascript
运行
复制
tcpip_init(network_init, &net);

在那之后:

代码语言:javascript
运行
复制
xTaskCreate(hc_task, ( signed portCHAR * ) "send hc",1536u, NULL, TCPIP_THREAD_PRIO, NULL);

所以有两个线程,主lwIP线程和hc_task线程。hc_task是:

代码语言:javascript
运行
复制
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并读取电缆状态:

代码语言:javascript
运行
复制
if cable is on  -> ok
if cable is off -> call netif_set_link_down(pxNetIfInUse);

下一次,当有线电视开播时,我打电话:

代码语言:javascript
运行
复制
netif_set_link_up(pxNetIfInUse);

我猜在计时器中断中调用这些函数是正确的。

  • 第二种解决办法:

第二种方法是,定时器中断向主lwip线程发送消息:

代码语言:javascript
运行
复制
Link off -> res = sys_mbox_trypost(toOutput, &msg); 

定时器中断向主lwip线程发送一条要调用的消息:

代码语言:javascript
运行
复制
netif_set_link_up(pxNetIfInUse);

或者:

代码语言:javascript
运行
复制
netif_set_link_down(pxNetIfInUse); //(in lwip main thread)

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

因此,我想知道哪种解决方案更好/更正确:在计时器中断调用链接下或向上(这些是lwip函数),还是计时器中断向主lwIP线程发送消息?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-01 19:12:12

在感谢lwip用户支持(感谢Pomeroy、Sylvain、Richard和其他帮助我-链接到辩论的人)几天后,我回复道:

在计时器呼叫中:

代码语言:javascript
运行
复制
//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线程的线程上下文中执行,这是正确的:

代码语言:javascript
运行
复制
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);
        }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16694446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档