打印
[AT32F407]

RAM从96K调到224K后 程序运行异常

[复制链接]
550|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sjdcz|  楼主 | 2024-3-13 00:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AT32F407RGT7 外部8M晶振,系统工作200M,RMII接口接外部PHY,输出50M时钟驱动PHY.
rt-thread 4.1.1以及4.0.3系统,0.1.6  以及 0.1.4驱动,编译优化O1。

之前使用LAN8720对接RMII接以太网,LWIP 2.0.3,freemodbus 这个对接都正常,一直多个产品正常出货,不同产品使用FLASH在160~290K之间,RAM大约100K+;

最近把8720换成KSZ8863,一直调不好。最终发现,优化RAM后,RAM占用在95K以内。
当RAM配置为96K时,系统工作正常。 PING 3小时,modbus poll 测试modbus tcp扫描速度设置为0ms 30万次 都不丢包。
单纯把RAM配置为224K,其余不变(链接器都还是填96K)。modbus tcp大概每500~3000次错一次,ping几百秒丢一包。
RAM更改代码如下,在void SystemInit (void)函数开始处调用extend_sram();

#define EXTEND_SRAM_96K      0xFF
#define EXTEND_SRAM_224K     0xFE

#define EXTEND_SRAM     EXTEND_SRAM_224K
void extend_sram(void)
{
  /* check if ram has been set to expectant size, if not, change eopb0 */
  if(((USD->eopb0) & 0xFF) != EXTEND_SRAM) //224K,96K
  {
    flash_unlock();
    /* erase user system data bytes */
    flash_user_system_data_erase();

    /* change sram size */
    flash_user_system_data_program((uint32_t)&USD->eopb0, EXTEND_SRAM);

    /* system reset */
    nvic_system_reset();
  }
}






仔细翻阅了手册,查阅了多个帖子,只是知道这个RAM从96k改到224K后,FLASH的零等待区会从256K降低到128K。 没有找到有需要配置的寄存器来适应这个零等待区的改变。

为了排除其他程序的干扰,我注释了多个线程的启动代码,使得只有modbus tcp 网络必须的和系统需要保留的线程继续运行,其余线程处于init状态。 丢包依然没有改变。 尝试过更换系统版本、驱动版本,调整编译优化。也没有解决。

目前我先把RAM调到96K,勉强出了样机(系统运行后查询剩余空间不到1k了)。
由于后期程序升级需要把RAM改大。 我们的产品也大量的使用这个MCU,陆续多个产品从8720改大8863都会有这个头痛的问题。还请雅特力指导下解决故障的方向。
谢谢









使用特权

评论回复
来自 2楼
sheltonyu| | 2024-3-13 14:49 | 只看该作者
您好,从现象来看感觉应该是遇到了非零等待区效能问题:零等待区运行代码比非零等待区更快。
当采用96K sram时,flash零等待区的大小是256K,您的产品代码在160~290K之间,这个时候代码几乎全运行在零等待区内,所以此时就算数据处理量大也能处理过来。
但是当SRAM扩展为224K后,flash零等待区大小为128K,此时代码就有一部分处于非零等待区,如果以太网部分的执行代码在这个区间再加上数据量频繁就可能出现处理不过来的情况。您所尝试的关闭其他线程,链接器sram维持96K等,实际上都没有改变以太网部分处于非零等待区的位置,所以效果一样。
针对该问题处理的方式就是将需要及时处理的数据或代码尽量的挪到前128K范围内,修改链接文件link.lds,简单示例如下:SECTIONS
{
    .text :
    {
        ......
        KEEP (*(.isr_vector))
        .=ALIGN(4)
        *drv_emac.o  (.text.*)   //将以太网驱动挪到flash靠前区域
        ......                             //按实际情况将以太网其他相关代码或相对优先处理的内容链接到该位置
        *(.text)
        *(.text.*)
    }
}

使用特权

评论回复
板凳
sjdcz|  楼主 | 2024-3-13 17:07 | 只看该作者
sheltonyu 发表于 2024-3-13 14:49
您好,从现象来看感觉应该是遇到了非零等待区效能问题:零等待区运行代码比非零等待区更快。
当采用96K sra ...

好的,谢谢,
明天把网络相关的代码移动flash靠前区域试试。

使用特权

评论回复
地板
wangshujun| | 2024-3-14 09:01 | 只看该作者
直接在keil里面也能设置分散加载,配置两片flash区域,在程序文件的属性里面设置放在哪个区域就行了,没必要自己编辑加载文件

使用特权

评论回复
5
MarxDai| | 2024-3-14 09:13 | 只看该作者
可以参考厂家的这篇文档
https://www.arterytek.com/download/FAQ/FAQ0050_%E5%B0%86%E5%87%BD%E6%95%B0%E5%8A%A0%E8%BD%BD%E5%88%B0Flash%E6%88%96SRAM%E6%8C%87%E5%AE%9A%E5%9C%B0%E5%9D%80%E7%9A%84%E6%96%B9%E6%B3%95_V2.0.2.pdf

使用特权

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

本版积分规则

4

主题

50

帖子

1

粉丝