打印

在加上FreeRTOS后以太网初始化不成功的情况

[复制链接]
1279|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 发给她更好fh 于 2024-6-1 08:35 编辑

在将GD32F450替换STM32F429后,遇到以太网在不使用操作系统时初始化成功但网络不能正常运行,而在加上FreeRTOS后以太网初始化不成功的情况,问题可能出在多个方面。以下是一些详细的检查和可能的解决方案:

确认初始化代码和FreeRTOS配置
时钟配置:

确认系统时钟配置正确,确保GD32F450的时钟设置符合以太网和FreeRTOS的要求。时钟配置错误可能导致定时器和中断工作不正常。
中断优先级配置:

FreeRTOS对中断优先级有严格的要求,尤其是使用NVIC的配置。在FreeRTOS下,以太网中断优先级必须低于configMAX_SYSCALL_INTERRUPT_PRIORITY。

使用特权

评论回复
沙发
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:35 编辑

检查FreeRTOSConfig.h中的中断优先级配置,例如:
c

#define configMAX_SYSCALL_INTERRUPT_PRIORITY   5


确认以太网中断优先级低于上述值。

使用特权

评论回复
板凳
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:35 编辑

堆栈大小和内存配置:

确认FreeRTOS任务堆栈大小和内存分配足够。以太网和网络协议栈通常需要较大的堆栈空间。
增大FreeRTOS的堆栈大小,确保任务有足够的空间运行。

使用特权

评论回复
地板
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:35 编辑

任务优先级:

确认以太网和LWIP相关任务的优先级设置合理,确保这些任务能够及时运行。

使用特权

评论回复
5
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:36 编辑

检查和调试步骤
单独初始化以太网:

在FreeRTOS启动前,单独初始化以太网,确保硬件和基本驱动初始化正确。
确认以太网PHY芯片初始化正确,配置正确的引脚和时钟。
FreeRTOS下的以太网初始化:

在FreeRTOS任务中进行以太网初始化,确保初始化在FreeRTOS环境下执行。

使用特权

评论回复
6
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:36 编辑

例如,创建一个初始化任务:
c

void Ethernet_InitTask(void *pvParameters)
{
    // 以太网初始化代码
    Ethernet_Init();
    // 删除初始化任务
    vTaskDelete(NULL);
}


使用特权

评论回复
7
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:36 编辑

确保中断安全:

确认以太网中断处理函数中没有使用FreeRTOS API,或者使用了中断安全的API(以FromISR结尾的API)。

使用特权

评论回复
8
发给她更好fh|  楼主 | 2024-5-31 23:42 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:37 编辑

代码示例
以下是一个简化的示例代码,展示如何在FreeRTOS下初始化以太网:

c

#include "FreeRTOS.h"
#include "task.h"
#include "lwip/init.h"
#include "ethernetif.h"
#include "gd32f4xx.h"

// FreeRTOS任务句柄
TaskHandle_t xEthernetTaskHandle = NULL;

// 以太网初始化任务
void Ethernet_InitTask(void *pvParameters)
{
    // 以太网初始化函数
    Ethernet_Init();

    // 启动网络协议栈
    lwip_init();

    // 启动主任务
    xTaskCreate(MainTask, "MainTask", 1024, NULL, 5, NULL);

    // 删除初始化任务
    vTaskDelete(NULL);
}

// 主任务
void MainTask(void *pvParameters)
{
    while (1)
    {
        // 处理以太网输入
        ethernetif_input(&gnetif);
        // 检查超时
        sys_check_timeouts();
        // 延时一段时间
        vTaskDelay(1);
    }
}

int main(void)
{
    // 初始化系统
    SystemInit();

    // 创建以太网初始化任务
    xTaskCreate(Ethernet_InitTask, "Ethernet_InitTask", 1024, NULL, 5, &xEthernetTaskHandle);

    // 启动调度器
    vTaskStartScheduler();

    // 如果调度器启动失败,将进入这个死循环
    while (1);
}


使用特权

评论回复
9
发给她更好fh|  楼主 | 2024-5-31 23:43 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:37 编辑

其他建议
调试信息:

使用串口或其他调试手段输出调试信息,检查以太网和FreeRTOS的初始化过程中的关键步骤是否成功。
检查硬件兼容性:

再次确认GD32F450的硬件配置和引脚映射是否与STM32F429完全兼容,特别是与以太网相关的部分。
参考示例代码:

查看GD32F450的官方示例代码和参考手册,确保使用的初始化和配置方法正确。

逐步定位和解决GD32F450替换STM32F429时以太网在FreeRTOS下初始化不成功的问题。

使用特权

评论回复
10
发给她更好fh|  楼主 | 2024-5-31 23:43 | 只看该作者
本帖最后由 发给她更好fh 于 2024-6-1 08:37 编辑

如果问题依然存在,建议进一步查看GD32F450的硬件手册和技术支持文档,或向厂商技术支持寻求帮助。

使用特权

评论回复
11
FranklinUNK| | 2024-6-20 20:54 | 只看该作者
应该是移植的有问题吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

430

帖子

1

粉丝