页次: 1
超过32K的话,将初始化用到的函数,数据,指定编译到到前面32K的位置。
link文件参考这个修改。
.text :
{
PROVIDE(__image_start = .);
PROVIDE(__text_start = .);
PROVIDE(__spl_start = .);
KEEP(*(.text.start))
. = ALIGN(8);
*(.text.utils)
PROVIDE(__ddr_bin_start = .);
KEEP(*(.ddr.bin))
PROVIDE(__ddr_bin_end = .);
*/sys-*.o(.text*)
*\\libc.a:*memcpy.o(.text*)
*\\libc.a:*memset.o(.text*)
PROVIDE(__spl_end = .);
*(.entry)
*(.text.vectors)
*(.text*)
*(.iplt)
*(.note.gnu.build-id)
PROVIDE(__text_end = .);
} > ram
PROVIDE(__spl_size = __spl_end - __spl_start);
startup.s文件参考这个修改
.section .text.start
.global _start
.global __Vectors
_start:
/* Boot head information for BROM */
jal x0, reset
//.long 0x0300006f // pc += 0x30
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0x12345678 /* checksum */
.long __spl_size /* spl size */
.long 0x30 /* boot header size */
.long 0x30303033 /* boot header version */
.long 0x00020000 /* return value */
.long 0x00020000 /* run address */
.long 0x0 /* eGON version */
.byte 0x00, 0x00, 0x00, 0x00 /* platform information - 8byte */
.byte 0x34, 0x2e, 0x30, 0x00
这样就能避开32K的限制。
我刚开始开发D1S的lvgl程序时都没用到spl。
March 说:@bigmagic
您好,请问RT中的C906文件夹的内容是哪里来的啊?我在RT官网没找到啊大哥你也来了啊,哈哈,freertos 177秒宕机问题找到了吗,我这里测试也是177秒死机....一直在研究
CLINT计时器中断比较值寄存器 只能用32位指针读写,用64位指针写时高32位是写不进去的。32位无符号整数最大值4294967295/晶振频率24000000=178.957秒。所以到了178.956秒的中断后,会一直进入中断直至0x10000000000000000/24000000=8895999天后才正常。
*(uint32_t*)CLINT_MTIMECMPL(0) = tick_l;
*(uint32_t*)CLINT_MTIMECMPH(0) = tick_h;
参考NUC970_NonOS_BSP的LCD_MPU例程移植了LVGL,但没有使用LCM双缓存功能,而是使用LCM单缓存,需要更新显示时才刷新屏幕。工作没问题。
参考NUC970_NonOS_BSP的USBH_MassStorage和SD_FATFS例程,实现了USB MSC,能当读卡器用。
将LVGL,MSC组合在一起,单单做读卡器或单单使用屏幕都能正常工作。在电脑读写TF卡时,点击屏幕,屏幕应该会更新的,但这时程序极易发生程序死机,电脑没显示U盘有断开连接,用sysprintf打印调试信息,发现USB中断程序里的USBD_GINTSTS_EPBIF_Msk有周期响应,但程序就是不正常运行。通过多个地方添加sysprintf打印调试信息,初步判断应该是在lv_task_handler(这函数是1ms执行一次的)里进入死循环。用Jlink连接调试时,发现电脑不能识别MSC,无法检测哪里出问题。
该怎么让LVGL和USB MSC一起正常工作?
------------------------------------------------
已解决。
通过取消MSC的功能,1s执行1次500ms的while循环堵塞,发现问题所在:
disp_flush执行到执行lv_disp_flush_ready的过程中是不能执行lv_task_handler的,不然若在这过程中LVGL要更新显示,就会进入lv_refr.c 里的某个while(vdb->flushing){。。。}里不退出。
页次: 1