gd32+gcc+rtthread+lwip+ppp+nat开发总结

2024-02-16 03:08

本文主要是介绍gd32+gcc+rtthread+lwip+ppp+nat开发总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、背景
自研DTU项目,替代别家产品,降低装置成本。技术路线上,采用国产gd32f450芯片和rtthread实时操作系统,运行轻量化tcp/ip协议栈lwip,通过ppp协议拨号上网,分别通过串口和网口透传数据,网口使用nat。

2、总结
▶串口6中断模式接收数据导致芯片崩溃
当时的现象是这样的,不开中断的情况下,串口6收发数据正常;如果打开中断模式,发送数据没有问题,一旦收到任何数据,芯片立马跑飞挂掉。一开始怀疑的是中断处理函数有问题,然而怎么修改也不见有效,也看了启动文件,前面几眼也没发现有什么问题,过了几天再看,发现问题了,启动文件的中断向量表有缺失,因为在串口6的中断之前,所以造成了地址偏移,然后串口6的中断号处填的是串口7的中断处理函数,详细可以看rtthread论坛的帖子GD32 GCC下startup中断向量表有遗漏
todo:如果提供了串口7的中断处理函数,芯片是否能正常工作?

▶使用外部时钟时,串口打印乱码
当初在排除串口工具和电脑的问题后,也看了系统的时钟配置,觉得没啥问题,就是一个宏定义而已,过了几天后再看,发现开启外部时钟时,默认的外部时钟是25M,但是我们的板子上是8M的晶振,不乱码才怪!详细可以看rtthread论坛的帖子外部时钟配置

▶boot跳转到app后,rtthread出现栈溢出
这个问题,一开始各种增加heap和stack的大小,但是一直没用,周末在家搜索的时候,看到一个帖子说gd32官方eth的驱动内,在配置eth的中断前,重新设置了中断向量表的地址为0x08000000,个人认为有点多余,回头再看rtthread的bsp中,也有此设置,导致跳转到app之后,使用的是boot的中断向量表,stack大小也是boot中的配置,比较小一些,rtthread直接报stack overflow!详细可以看rtthread论坛的帖子eth驱动重设中断向量表

▶nat移植,不知道怎么测试,报文也没有按照配置转发
做nat之前,一直懵逼,socket编程还有点基础,但是网络报文,真是从来都没有碰过,在煎熬了几天之后,终于痛下决心,买了tcp/ip详解卷一卷二和卷三。其实工作的第一年我的师傅就给我推荐过这三本书,很经典,但是一直也没碰到过这类问题,加上一直不求上进的态度,也就没看。当时师傅还给我推荐过比特币,12年的价格10刀左右…而我都买了啥?单反,手机,ipad,山地车…
rtthread组件中nat的源文件,看了好几遍,报文也没有正确转发,当时的配置是这样的,服务器ip:123.123.123.123,4G的公网ip:234.234.234.234,然后我把ppp的net dev设成192.168.1.1,eth设成192.168.1.30,pc设成192.168.1.210,看出问题了么?当时我知道要设.1的地址进行转发,但是设成了ppp,其实还是不理解网关的意思和作用,回头详细看一遍再写个博客,正确配置应该是这样的,ppp的net dev不用配置,eth设为192.168.1.1,然后就通了。最后多说一句,nat的转发函数,应当加入到err_t ip4_input(struct pbuf *p, struct netif *inp)函数中,回头做个总结,esp官方的SDK中也有nat的移植可供参考。

▶pbuf_free: p->ref > 0内存问题

3、感悟
出现问题,第一时间确定发生问题的原因,方向错了,怎么跑都是偏的;
不熟悉的技术方向,开发之前一定要补基础知识,否则就一直懵逼下去。

这篇关于gd32+gcc+rtthread+lwip+ppp+nat开发总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/713311

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子