初级会员
- 积分
- 99
- 金钱
- 99
- 注册时间
- 2017-4-1
- 在线时间
- 16 小时
|
本帖最后由 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
调试结果:
求大家帮忙看下什么问题,谢谢!!!
|
|