DM365+EC122调试(一)

硬件平台:瑞泰DM365开发板

开发板内核:Linux 2.6.18

DVSDK版本:2_10_00_17

//

问题1:

root@192.168.1.3:~# usb 1-1.2: USB disconnect, address 4
printk: 1 messages suppressed.
oom-killer: gfp_mask=0x201d2, order=0
Mem-info:
DMA per-cpu:
cpu 0 hot: high 18, batch 3 used:2
cpu 0 cold: high 6, batch 1 used:0
DMA32 per-cpu: empty
Normal per-cpu: empty
HighMem per-cpu: empty
Free pages:        1296kB (0kB HighMem)
Active:2465 inactive:116 dirty:0 writeback:0 unstable:0 free:296 slab:841 mapped:117 pagetables:281
DMA free:1184kB min:1068kB low:1332kB high:1600kB active:9888kB inactive:548kB present:71680kB pages_scanned:1219 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
Normal free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
HighMem free:0kB min:128kB low:128kB high:128kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
DMA: 47*4kB 32*8kB 0*16kB 1*32kB 0*64kB 1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB 0*8192kB 0*16384kB = 1116kB
DMA32: empty
Normal: empty
HighMem: empty
Swap cache: add 0, delete 0, find 0/0, race 0+0

//

    开发板通过NFS加载的是虚拟机中的文件系统。

    使用 usb_modeswitch 和 wvdial 配合调试3G(EC122)模块。

    无论是使用自己的制作的NFS文件系统,还是使用瑞泰自带的NFS文件系统,在运行 usb_modeswitch -W 时偶尔会出现如上的信息。经过努力搜索资料,初步认为是OOM(Out Of Memory)Killer引起的。

    于是搜索OOM Killer 与 MD365,期间查到一些与OOM Killer有关的东西,比如

*********************************************************************参考链接一**********************************************************************************

关于oom killer的问题

        Out-of-Memory(OOM) Killer,就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉。
  
  在 32 位CPU 架构下寻址是有限制的。Linux 内核定义了三个区域:
  # DMA: 0×00000000 – 0×00999999 (0 – 16 MB)
  # LowMem: 0×01000000 – 0×037999999 (16 – 896 MB) – size: 880MB
  # HighMem: 0×038000000 -
  
  什么时候会触发oom killer?大概就两种情况:
  1、当low memory被耗尽的时候,即使high memory还有很大的空闲内存
  2、low memory里都是碎片,请求不到连续的内存区域
  
  通常的问题是high memory很大仍然会触发oom killer,或者由于碎片触发oom killer,解决办法:
  1、升级至64位的Linux 版本,这是最好的解决方案。
  2、如果是32位的Linux 版本,最好的解决办法就是应用hugemem kernel,还有一个解决方法设置/proc/sys/vm/lower_zone_protection值为250或更高。
  # echo “250″ > /proc/sys/vm/lower_zone_protection
  设置成启动加载,在/etc/sysctl.conf中加入
  vm.lower_zone_protection = 250
  3、最无力的解决办法,就是禁用oom-killer,这可能会导致系统挂起,所以要慎重使用。
  使oom-killer关闭/开启:
  # echo “0″ > /proc/sys/vm/oom-kill
  # echo “1″ > /proc/sys/vm/oom-kill
  使设置启动时生效,需要在/etc/sysctl.conf中加入
  vm.oom-kill = 0
  
        【关于overcommit_memory】
  
  The Linux kernel supports the following overcommit handling modes
  0 – Heuristic overcommit handling. Obvious overcommits of address space are refused. Used for a typical system. It ensures a seriously wild allocation fails while allowing overcommit to reduce swap usage. root is allowed to allocate slighly more memory in this mode. This is the default.
  1 – Always overcommit. Appropriate for some scientific applications.
  2 – Don’t overcommit. The total address space commit for the system is not permitted to exceed swap + a configurable percentage (default is 50) of physical RAM. Depending on the percentage you use, in most situations this means a process will not be killed while accessing pages but will receive errors on memory allocation as appropriate.
  
  The overcommit policy is set via the sysctl `vm.overcommit_memory’.
  The overcommit percentage is set via `vm.overcommit_ratio’.
  The current overcommit limit and amount committed are viewable in
  /proc/meminfo as CommitLimit and Committed_AS respectively.
  ——————————————————————————————
  #echo 2>/proc/sys/vm/overcommit_memory
  #echo 0>/proc/sys/vm/overcommit_ratio
  ——————————————————————————————
  实际测试:
  overcommit_memory == 2,物理内存使用完后,打开任意一个程序均显示“内存不足”;
  overcommit_memory == 1,会从buffer中释放较多物理内存,适合大型科学应用软件,但oom-killer机制仍然起作用;
  overcommit_memory == 0,系统默认设置,释放物理内存较少,使得oom-killer机制运作很明显。
From - http://zhangsir.org/?p=213

*********************************************************************参考链接二**********************************************************************************

You are lucky - I spent several weeks to solve this.

In brief - issue the following commands to solve this:

sysctl -w vm.overcommit_memory=2
sysctl -w vm.overcommit_ratio=90
sysctl -w vm.dirty_ratio=10

For the help search Internet for these parameters.

Regards

Form - http://e2e.ti.com/support/embedded/linux/f/354/t/124193.aspx

*********************************************************************华丽的分割线**********************************************************************************

    参考了上述自我感觉很有用的资料,也在瑞泰DM365开发板上做尝试,但是结果令人遗憾,问题依旧。

    此时,我已经快到了崩溃的边缘,与此同时,实验室又有人提议明天要去爬山。哦,我的神啊,最近实验一直出问题,我哪里有心情出去玩啊!

    临近崩溃边缘的我做最后的挣扎。我尝试使用NandFlash上的文件系统试试。

    究竟使用NandFlash上的文件系统进展的如何?进入 《DM365+EC122调试(二)》 吧。

 

<think> 嗯,用户这次想了解STM32与EC600系列4G模块的连接及使用技术细节。从用户提供的引用材料来看,用户已经做了些前期调研,引用的内容涵盖了USB驱动、MQTT连接和串口调试等关键点。 用户可能正在开发个物联网项目,需要将STM32作为主控,通过EC600模块实现云端通信。用户提供的三篇引用很有价值: 第篇详细描述了USB Host模式连接EC600U的方案,涉及STM32CubeMX基础工程搭建和USB-CDC驱动修改; 第二篇侧重MQTT协议连接华为云的实现,特别提到EC600N的两种工作模式区别; 第三篇展示了串口+DMA的调试技巧和代码片段。 从这些引用能看出用户的技术基础不错,但可能对具体实现细节仍有困惑。比如: - 如何根据项目需求选择连接方式(USB还是串口) - 非透传模式下AT指令交互的具体流程 - DMA接收数据时如何避免缓冲区溢出 - 华为云MQTT连接的安全认证机制 用户没有明确说明具体型号(EC600U/N),但根据出现频率,后续回复会以EC600N为主示例。考虑到用户可能实际动手调试,在回复中需要强调几个易错点: 1) USB枚举时供电电流要求(EC600启动峰值可达500mA) 2) AT指令必须带回车换行符 3) 网络超时重发机制的必要性 另外注意到用户引用[2]提到华为云连接,这部分需要补充access token生成等关键步骤,因为华为云文档对此描述较为分散。调试方面,可以增加AT指令日志记录的建议,这对排查"ERROR"类响应很有帮助。 </think> 以下基于引用信息和STM32与移远EC600系列4G模块(如EC600N/EC600U)的典型开发实践,整理关键连接方式及技术要点: --- ### **、硬件连接方式** 1. **USB高速连接(推荐)** - **场景**:适用于EC600U等支持USB CDC协议的模块 - **接线**: - STM32的USB_OTG_HS(如PA11/PA12)连接模块的USB_DP/DM - 需外接5V电源(模块峰值电流可达500mA) - **优势**: - 免驱动(CDC类),速率高达480Mbps - 简化数据收发流程(直接虚拟串口通信)[^1] 2. **UART串口连接(通用方案)** - **场景**:所有EC600系列兼容,需配合AT指令 - **接线**: - STM32 USART的TX/RX连接模块的UART_RX/TX(如EC600N的PIN55/PIN56) - 建议启用DMA降低CPU负载[^3] - **注意**: - 波特率建议115200bps(默认值) - 需硬件流控(RTS/CTS)防数据丢失 --- ### **二、软件实现要点** #### **1. USB通信流程(以STM32CubeMX配置为例)** ```c /* 关键步骤 */ 1. 在CubeMX中启用USB_OTG_HS (Host Mode) 2. 加载USBH_CDC类驱动 3. 修改VID/PID匹配模块(如EC600U的VID=0x2C7C) 4. 实现数据收发回调: void USBH_CDC_ReceiveCallback(USBH_HandleTypeDef *phost) { // 处理模块返回数据 } ``` **调试难点**: - 枚举失败时检查VBUS供电是否稳定 - 需添加模块特定初始化AT指令(如`AT+QCFG="usbnet",1`启用CDC模式)[^1] #### **2. UART+AT指令控制(非透传模式)** **典型操作流程**: ```mermaid graph TD A[STM32发送AT] --> B[模块响应OK] B --> C[发送AT+QMTOPEN开通MQTT连接] C --> D[模块返回+QMTOPEN: 0,0] D --> E[发送数据AT+QMTPUBEX] ``` **代码优化技巧**: - 使用环形缓冲区+DMA双缓冲接收 - AT指令超时重发机制(参考引用[3]的`findStr()`函数) - 为关键指令添加互斥锁(FreeRTOS场景) #### **3. 华为云MQTT连接(引用[2]方案)** ```c // 示例指令序列 AT+QMTOPEN=0,\"your_endpoint\",1883 // 打开华为云连接 AT+QMTCONN=0,\"client_id\",\"username\",\"password\" // 用户名=设备ID,密码=加密token AT+QMTSUB=0,1,\"topic/sub\",1 // 订阅主题 AT+QMTPUB=0,0,0,0,\"topic/pub\",\"Hello Huawei Cloud!\" // 发布消息 ``` --- ### **三、调试常见问题** 1. **USB枚举失败** - 检查原理图:USB差分线是否等长,D+需接1.5K上拉电阻 - 电源问题:模块独立供电并添加1000uF电容缓冲 2. **AT指令无响应** - 确认串口波特率/校验位(默认8N1) - 发送指令需以`\r\n`结尾(如`HAL_UART_Transmit(&huart3, "AT\r\n", 4, 1000);` 3. **MQTT断连频繁** - 启用KeepAlive(`AT+QMTCFG=\"keepalive\",0,60`) - 关闭低功耗模式(`AT+QSCLK=0`) --- ### **四、工程参考** 1. [STM32F4+FreeRTOS+USBH_CDC驱动EC600U](https://github.com/example/ec600_usb_cdc) [^1] 2. [EC600N MQTT华为云移植指南(UART版)](https://gitee.com/ec600n_mqtt_demo) [^2] 3. [AT指令解析框架(含DMA超时管理)](https://github.com/example/uart_at_parser) [^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值