OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5540|回复: 4

FreeRTOS + LWIP1.4.1移植 xSemaphoreGiveFromISR中断释放问题

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-4-1
在线时间
16 小时
发表于 2021-11-28 15:54:57 | 显示全部楼层 |阅读模式
本帖最后由 hualuoshuijia 于 2021-11-28 16:03 编辑

在移植freeRTOS + LWIP 1.4.1的过程中,一直卡死在while循环中:
代码如下:
void ETH_IRQHandler(void)
{
        portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
        
        printf("function into [%s] \r\n", __FUNCTION__);
        while(ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)         //检测是否收到数据包
        {
                printf("111111111\r\n");
                xSemaphoreGiveFromISR( g_xSemaphoreRx, &xHigherPriorityTaskWoken ); // 释放信号量(去唤醒LWIP任务)
                printf("ISR释放g_xSemaphoreRx信号量成功!!\r\n");
        }
        ETH_DMAClearITPendingBit(ETH_DMA_IT_R);         //清除DMA中断标志位
        ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);        //清除DMA接收中断标志位
        //printf("111111111+++\r\n");
        if(xHigherPriorityTaskWoken != pdFALSE )
        {
                //printf("111111111---\r\n");
                portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);  //切换调度程序
        }
        //printf("22222222222\r\n");
}


等待获取信号量的代码如下:
void ethernetif_input(void *para)
{
  struct pbuf *p;

        printf("function into [%s] \r\n", __FUNCTION__);
        
        for(;;)
        {
                //printf("mmmmmmmmmmmmmmmmm \r\n");
                //拿到信号量
                if(xSemaphoreTake(g_xSemaphoreRx, BLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
                {
                        printf("获取g_xSemaphoreRx信号量成功!!\r\n");
                        /*将接收到的数据包移动到新的 pbuf 中*/
                        p = low_level_input(g_pxNetIf);
                        if (p == NULL) return; /* 没有可读取的数据包时,返回 */
                        if (g_pxNetIf->input(p, g_pxNetIf) != ERR_OK)
                         {
                                 printf("ethernetif_input: IP input error\r\n");
                                 pbuf_free(p);
                                 p = NULL;
                         }
                }        
        }
}


优先级设置:
/***************************************************************************************************************/
/*                                FreeRTOS与中断有关的配置选项                                                  */
/***************************************************************************************************************/
#ifdef __NVIC_PRIO_BITS
        #define configPRIO_BITS                       __NVIC_PRIO_BITS
#else
        #define configPRIO_BITS                       4                  
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY                        15                      //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5                     //系统可管理的最高中断优先级
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  //240
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )  //80(0~79)


调试结果移植卡死在ETH_IRQHandler(void)中断函数中,ethernetif_input函数获取不到结果
参考的例程:原子哥的stm32F407 FreeRTOS 代码,NKD_Tester_V1.2,和STemWin5.22+FreeRTOS+Fatfs-LWIP
调试结果:


求大家帮忙看下什么问题,谢谢!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-11-29 10:56:36 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-3-22
在线时间
14 小时
发表于 2022-3-14 21:59:25 | 显示全部楼层
您好,能交流一下FreeRTOS+Lwip吗?我的邮箱是w1129109592@163.com
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2021-12-11
在线时间
7 小时
发表于 2022-3-19 10:12:34 | 显示全部楼层
把你的printf()代码全部删除掉,再试一下。
回复 支持 反对

使用道具 举报

16

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2016-6-11
在线时间
82 小时
发表于 2022-9-14 11:07:41 | 显示全部楼层
老哥,你好,请问你解决这个问题了吗?我这边也遇到类似的,但还不确定是不是循环在了ETH_IRQHandler里,你是怎样确定在这里的?谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 14:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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