搜索
查看: 1530|回复: 1

[求助] STM32F107+CubeMX+FreeRTOS+LWIP 连接成功后,信号量无法使用

[复制链接]

该用户从未签到

2

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2019-5-18
发表于 2019-5-12 11:24:19 | 显示全部楼层 |阅读模式
本帖最后由 darrensun687df3 于 2019-5-12 14:41 编辑

各位大哥,遇到一个在FreeRTOS+LWIP使用信号量的问题。
项目工程是通过CubeMX生成的,使用FreeRTOS + LWIP。
简化代码,FreeRTOS初始化两个任务,一个默认任务、一个等待信号量任务。在默认任务中和PC上面的TCP server建立连接。在另外一个等待信号量。

信号量任务
extern osSemaphoreId EthBinSemHandle;
void task_usart_function()
{
    osSemaphoreWait(EthBinSemHandle, 0); //消耗第一次初始化之后的信号量
    UsrLog("Usart Task Start");
    for (;;)
    {
        if (osSemaphoreWait(EthBinSemHandle, osWaitForever) == osOK)
        {UsrLog("Processing");}
        else
        {UsrLog("Wait Failed");}
    }
}


默认任务
static volatile uint8_t sec_tic = 1;
extern osSemaphoreId EthBinSemHandle;
void task_default_function(void)
{
    // Application init code
    connect_server(get_connect_state(CLIENT_SERVER));
    for (;;)
    {
        HAL_IWDG_Refresh(&hiwdg);
        if ((sec_tic + 15) % 15 == 0)
        {
            //每隔15秒释放一次信号量
            osSemaphoreRelease(EthBinSemHandle);
        }
        sec_tic++;
        osDelay(1000);
    }
}

void connect_server(conn_state_t* conn_state)
{
    if (get_link_state() == TRUE && conn_state->connected == FALSE)
    {
        connect_init(conn_state, get_config_local_port(CLIENT_SERVER));
/* 在connect_init()里面主要操作了netconn_new以及netconn_bind.
    local_server->conn = netconn_new(NETCONN_TCP);
    if ((ret = netconn_bind(local_server->conn, NULL, port)) == ERR_OK)

*/
        connect_connect(conn_state, &(get_server_data(CLIENT_SERVER)->ip_addr), get_server_data(CLIENT_SERVER)->port);
/*在connect_connect()里面主要是
        ret = netconn_connect(conn_state->conn, ip_addr, port);
        一旦执行了netconn_connect()之后,信号量的使用就没办法用了。
*/
    }
}



TCP通信没有问题,也可以PING通。如果注释掉//connect_connect()函数,每隔15秒,可以在串口看到一个打印,说明信号量释放成功。
如果使用connect_connect函数,在PC上TCP客户端可以发现,链接已经链接成功。
此时,如果执行osSemaphoreRelease(EthBinSemHandle);整个系统会死机。如果不执行osSemaphoreRelease(EthBinSemHandle);,可以进行正常的TCP通信。

问题出在TCP建立连接之后,osSemaphoreRelease(EthBinSemHandle);函数会hang住,尝试暂停debug了一下,发现是在queue.c中,
configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );导致整体系统处于for循环的情况。
检查了一下pxQueue->uxItemSize的数值为0x10000000.

不知道应该怎么搞了。不知道还有朋友遇到这样的问题吗??

整个工程代码:
链接:https://pan.baidu.com/s/1aqnbbdeGwony7RVt-V_d7w
提取码:y7gg



回复

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2019-6-6 12:09:52 | 显示全部楼层
这里有几个官方的例程,应用场景差不多,也是用FREERTOS。不过是F4芯片的。参考一下,希望能帮到你
stm32cube_fw_f4_v1210\STM32Cube_FW_F4_V1.21.0\Projects\STM324xG_EVAL\Applications\LwIP
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-5 05:13 , Processed in 0.146703 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表