项目背景:1) 使用STM32F103ZET6芯片,默认使用内部的64K RAM。
2) 连接RW007 WiFi模块,通过EVN工具配置RW007软件包,LWIP软件包之后,运行程序打印某些队列建立失败,通过跟踪,发现是rt_malloc()失败。
\ | /
rw007 sn: []
rw007 ver: []
尝试措施:
1)刚好板子上有1个SRAM扩展芯片,接在FSMC_NE3片上。大小是512KByte,使用STM32CubMx工具生成了初始化FSMC代码中,并且增加了工程中,INIT_PREV_EXPORT(HAL_SRAM_MspInit)导出,系统启动时候自动初始时候。
2)将这个512KByte的SRAM交个RT-thread管理,在board.h文件中 将STM32_SRAM_SIZE 修改为512
3) MDK工程中设置使用如下分散加载文件进行编译,但运行起来后,一直停在rt_int32_t rt_vsnprintf()函数中。
; *
; Scatter-Loading Description File generated by uVision
; *
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
.o (RESET, +First)
(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x68000000 0x00200000 { ; RW data
.ANY (+RW +ZI)
}
}
现在不知道怎么解决这个问题?
谢谢。
1) 按照您的建议,已经将SRAM加入工程文件同时将外扩的SRAM 通过调用rt_memheap_init()分配权交给了RT-thread。
2)分配权交给之后再进行读写测试(直接操作地址),读写测试也OK。
3)RW007软件包建立“”wlan_job“任务的时候,第一次第二次调用 RT_KERNEL_MALLOC能够分配到内存,但第3次调用,则Hard fault 错误。
[0m[D/drv.sram] sram init success, mapped at 0x68000000, size is 512 Kbytes, data width is 16[0m
[0m[D/drv.sram] Writing the 4194304 bytes data, waiting….[0m
[0m[D/drv.sram] Write data success, total time: 0.000S.[0m
[0m[D/drv.sram] start Reading and verifying data, waiting….[0m
[0m[D/drv.sram] SRAM test end![0m
\ | /
psr: 0x01000000
r00: 0x68000818
r01: 0x55555555
r02: 0x20000d38
r03: 0xffffffff
r04: 0x20000cf4
r05: 0x68000000
r06: 0x00000800
r07: 0xed55553d
r08: 0x00000000
r09: 0x00000800
r10: 0x00000016
r11: 0x0000000a
r12: 0x00000000
lr: 0x08015641
pc: 0x08013de8
hard fault on thread: main
thread pri status sp stack size max used left tick error
wlan_job 0 init 0x00000000 0x00000000 00% 0x00000000 000
tidle 31 ready 0x00000044 0x00000100 26% 0x00000020 000
main 10 ready 0x00000044 0x00000800 11% 0x00000013 000
bus fault:
SCB_CFSR_BFSR:0x04 IMPRECISERR
还需要继续查询问题。
1)今天调试了一下,上面提到的新问题原因是因为我在启动RT-thread任务调度之前,自己的SRAM进行了读写测试,但读写测试的内容没有清零,导致rt_malloc()申请到地址后,rt-thread判断一些申请结构的数据之后指针地址内容适合出差。 将测试内容写入全零后即可,rt-thread可以正常运行起来了。
2) 现在加入RW007后包后,RW007初始化过程中,打印“[I/drv.spi] spi transfer error : 3” 错误信息,也即SPI收发数据错误。
经过单步追踪,发现在 rt_spi_configure()这个函数中跳过了SPI设备配置。也就是没有配置SPI端口,数据接收当然出错。
rt_err_t rt_spi_configure(struct rt_spi_device device,
struct rt_spi_configuration cfg)
{
rt_err_t result;
}
现在在解决此问题,还不知道原因在哪里?