完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大哥,遇到一个在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. 不知道应该怎么搞了。不知道还有朋友遇到这样的问题吗?? |
|
相关推荐
1个回答
|
|
在使用信号量之前,需要先创建一个信号量对象并初始化。
在CubeMX生成的代码中,可以在`MX_FREERTOS_Init()`函数中添加信号量的创建和初始化代码。例如: ``` osSemaphoreDef(EthBinSem); osSemaphoreId EthBinSemHandle; void MX_FREERTOS_Init(void) { /* Other code */ /* Create the semaphore */ osSemaphoreDef(EthBinSem); EthBinSemHandle = osSemaphoreCreate(osSemaphore(EthBinSem), 1); /* Other code */ } ``` 然后,在等待信号量的任务中使用此信号量: ``` extern osSemaphoreId EthBinSemHandle; void task_usart_function() { osSemaphoreWait(EthBinSemHandle, osWaitForever); // 执行其他任务操作 osSemaphoreRelease(EthBinSemHandle); } ``` 确保在等待信号量之前,使用`osSemaphoreWait()`函数来等待信号量,然后在任务完成后,使用`osSemaphoreRelease()`函数释放信号量。 这样,信号量就可以在FreeRTOS + LWIP中成功使用了。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1645 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1564 浏览 1 评论
992 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1610 浏览 2 评论
1870浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
541浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
514浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 20:00 , Processed in 0.928021 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号