BL808学习日志-2-LVGL for M0 and D0

一、lvgl测试环境

        对拿到的M1S_DOCK开发板进行开发板测试,博流的官方SDK是支持M0和D0两个内核都进行测试的;但是目前只实现了M0的LVGLBenchmark,测试D0内核中发现很多莫名其妙的问题。一会详细记录。

        使用的是开发板自带的SPI显示屏,280*240分辨率。

二、M0内核lvgl测试

        使用官方默认的SDK进行编译会报错缓存不够,按照下列方式修改SDK中的.ld内存分布文件

/bouffalo_sdk/bsp/board/bl808dk/bl808_flash_m0.ld文件。主要目的就是修改ram_memory的大小,把ram_wifi的大小暂时调整为0,因为目前官方SDK无法启用无线功能。如果测试过程中卡住,就是ram_memory太小了,缓存不够使用了,调大即可。

/****************************************************************************************
* @file flash.ld
*
* @brief This file is the link script file (gnuarm or armgcc).
*
* Copyright (C) BouffaloLab 2021
*
****************************************************************************************
*//* configure the CPU type */
OUTPUT_ARCH( "riscv" )/* configure the entry point */
ENTRY(__start)StackSize    = 0x0400; /*  1KB */
HeapMinSize  = 0x1000; /*  4KB */
psram_min_size = 0x1000;__EM_SIZE = DEFINED(btble_controller_init) ? 32K : 0K;MEMORY
{fw_header_memory  (rx)  : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4Kxip_memory  (rx)  : ORIGIN = 0x58000000, LENGTH = 32Mram_psram  (wxa)  : ORIGIN = 0x50000000, LENGTH = 64Mitcm_memory (rx)  : ORIGIN = 0x62020000, LENGTH = 32Kdtcm_memory (rx)  : ORIGIN = 0x62028000, LENGTH = 16Knocache_ram_memory (!rx) : ORIGIN = 0x2202C000, LENGTH = 16Kram_memory  (!rx) : ORIGIN = 0x62038000, LENGTH = 128Kram_wifi  (wxa)   : ORIGIN = 0x22058000, LENGTH = 0Kxram_memory  (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
}SECTIONS
{.fw_header :{KEEP(*(.fw_header))} > fw_header_memory.init :{KEEP (*(SORT_NONE(.init)))KEEP (*(SORT_NONE(.vector)))} > xip_memory.text :{. = ALIGN(4);__text_code_start__ = .;*(.text)*(.text.*)/* section information for shell */. = ALIGN(4);__fsymtab_start = .;KEEP(*(FSymTab))__fsymtab_end = .;. = ALIGN(4);__vsymtab_start = .;KEEP(*(VSymTab))__vsymtab_end = .;/* section information for usb usbh_class_info */. = ALIGN(4);__usbh_class_info_start__ = .;KEEP(*(.usbh_class_info)). = ALIGN(4);__usbh_class_info_end__ = .;/*put .rodata**/*(EXCLUDE_FILE( *bl808_glb*.o* \*bl808_glb_gpio*.o* \*bl808_pds*.o* \*bl808_aon*.o* \*bl808_hbn*.o* \*bl808_l1c*.o* \*bl808_common*.o* \*bl808_clock*.o* \*bl808_ef_ctrl*.o* \*bl808_sf_cfg*.o* \*bl808_sf_ctrl*.o* \*bl808_sflash*.o* \*bl808_xip_sflash*.o* \*bl808_romapi_patch*.o* ) .rodata*)*(.srodata)*(.srodata.*). = ALIGN(4);__text_code_end__ = .;} > xip_memory. = ALIGN(4);__itcm_load_addr = .;.itcm_region : AT (__itcm_load_addr){. = ALIGN(4);__tcm_code_start__ = .;*(.tcm_code.*)*(.tcm_const.*)*(.sclock_rlt_code.*)*(.sclock_rlt_const.*)*bl808_glb*.o*(.rodata*)*bl808_glb_gpio*.o*(.rodata*)*bl808_pds*.o*(.rodata*)*bl808_aon*.o*(.rodata*)*bl808_hbn*.o*(.rodata*)*bl808_l1c*.o*(.rodata*)*bl808_common*.o*(.rodata*)*bl808_clock*.o*(.rodata*)*bl808_ef_ctrl*.o*(.rodata*)*bl808_sf_cfg*.o*(.rodata*)*bl808_sf_ctrl*.o*(.rodata*)*bl808_sflash*.o*(.rodata*)*bl808_xip_sflash*.o*(.rodata*)*bl808_romapi_patch*.o*(.rodata*). = ALIGN(4);__tcm_code_end__ = .;} > itcm_memory__dtcm_load_addr = __itcm_load_addr + SIZEOF(.itcm_region);.dtcm_region : AT (__dtcm_load_addr){. = ALIGN(4);__tcm_data_start__ = .;*(.tcm_data)/* *finger_print.o(.data*) */. = ALIGN(4);__tcm_data_end__ = .;} > dtcm_memory/*************************************************************************//* .stack_dummy section doesn't contains any symbols. It is only* used for linker to calculate size of stack sections, and assign* values to stack symbols later */.stack_dummy (NOLOAD):{. = ALIGN(0x4);. = . + StackSize;. = ALIGN(0x4);} > dtcm_memory/* Set stack top to end of RAM, and stack limit move down by* size of stack_dummy section */__StackTop = ORIGIN(dtcm_memory) + LENGTH(dtcm_memory);PROVIDE( __freertos_irq_stack_top = __StackTop);__StackLimit = __StackTop - SIZEOF(.stack_dummy);/* Check if data + heap + stack exceeds RAM limit */ASSERT(__StackLimit >= __tcm_data_end__, "region RAM overflowed with stack")/*************************************************************************/__nocache_ram_load_addr = __dtcm_load_addr + SIZEOF(.dtcm_region);.nocache_ram_region  : AT (__nocache_ram_load_addr){. = ALIGN(4);__nocache_ram_data_start__ = .;*(.nocache_ram). = ALIGN(4);__nocache_ram_data_end__ = .;} > nocache_ram_memory__ram_load_addr = __nocache_ram_load_addr + SIZEOF(.nocache_ram_region);/* Data section */RAM_DATA : AT (__ram_load_addr){. = ALIGN(4);__ram_data_start__ = .;PROVIDE( __global_pointer$ = . + 0x800 );*(.data)*(.data.*)*(.sdata)*(.sdata.*)*(.sdata2)*(.sdata2.*). = ALIGN(4);__bflog_tags_start__ = .;*(.bflog_tags_array). = ALIGN(4);__bflog_tags_end__ = .;__ram_data_end__ = .;} > ram_memory__psram_load_addr = (__ram_load_addr + SIZEOF (RAM_DATA));.psram_data_region : AT (__psram_load_addr){. = ALIGN(4);__psram_data_start__ = .;KEEP(*(.psram_data*)). = ALIGN(4);__psram_data_end__ = .;} > ram_psram__etext_final = (__psram_load_addr + SIZEOF (.psram_data_region));ASSERT(__etext_final <= ORIGIN(xip_memory) + LENGTH(xip_memory), "code memory overflow").bss (NOLOAD) :{. = ALIGN(4);__bss_start__ = .;*(.bss*)*(.sbss*)*(COMMON). = ALIGN(4);__bss_end__ = .;} > ram_memory.noinit_data (NOLOAD) :{. = ALIGN(4);__noinit_data_start__ = .;*(.noinit_data*). = ALIGN(4);__noinit_data_end__ = .;} > ram_memory.nocache_noinit_ram_region (NOLOAD) :{. = ALIGN(4);__nocache_noinit_ram_data_start__ = .;*(.nocache_noinit_ram)*(.noncacheable). = ALIGN(4);__nocache_noinit_ram_data_end__ = .;} > nocache_ram_memory.heap (NOLOAD):{. = ALIGN(4);__HeapBase = .;/*__end__ = .;*//*end = __end__;*/KEEP(*(.heap*)). = ALIGN(4);__HeapLimit = .;} > ram_memory__HeapLimit = ORIGIN(ram_memory) + LENGTH(ram_memory);ASSERT(__HeapLimit - __HeapBase >= HeapMinSize, "heap region overflow").psram_noinit_data (NOLOAD):{. = ALIGN(4);__psram_noinit_data_start__ = .;KEEP(*(.psram_noinit*)). = ALIGN(4);__psram_noinit_data_end__ = .;} > ram_psram.psram_heap (NOLOAD):{. = ALIGN(4);__psram_heap_base = .;KEEP(*(.psram_heap*)). = ALIGN(4);__psram_heap_end = .;} > ram_psram__psram_limit = ORIGIN(ram_psram) + LENGTH(ram_psram);ASSERT(__psram_limit - __psram_heap_base >= psram_min_size, "psram heap region overflow").wifibss  (NOLOAD) :{PROVIDE( __wifi_bss_start = ADDR(.wifibss) );PROVIDE( __wifi_bss_end = ADDR(.wifibss) + SIZEOF(.wifibss) );*ipc_shared.o(COMMON)*sdu_shared.o(COMMON)*hal_desc.o(COMMON)*txl_buffer_shared.o(COMMON)*txl_frame_shared.o(COMMON)*scan_shared.o(COMMON)*scanu_shared.o(COMMON)*mfp_bip.o(COMMON)*me_mic.o(COMMON)*bl_sta_mgmt_others.o(COMMON)*bl_pmk_mgmt.o(COMMON)*bl_pmk_mgmt_internal.o(COMMON)*libwifi_drv.a:bl_utils.o(COMMON)*libwifi_drv.a:bl_utils.o(.bss*)*(.wifi_ram*). = ALIGN(16);} > ram_wifiPROVIDE(__LD_CONFIG_EM_SEL = __EM_SIZE);
}

        修改完成后最好把LP内核的内存分布文件也修改一下。这里引申出一个问题,就是内存的分布肯定是LP和M0内核共享OCRAM+WRAM,但是不知道两个内核的itcm_memory 和dtcm_memory的大小是不是要按照规格书改成32K+16K,官方默认的大小是20K+4K,搞不懂是什么用意。而且两个内核的部分区域在官方SDK中竟然重叠了,好奇怪。对于初学者来说,实在是头大,官方也没有任何说明。

        这里直接贴图一个成绩。

____               __  __      _       _       _|  _ \             / _|/ _|    | |     | |     | || |_) | ___  _   _| |_| |_ __ _| | ___ | | __ _| |__|  _ < / _ \| | | |  _|  _/ _` | |/ _ \| |/ _` | '_ \| |_) | (_) | |_| | | | || (_| | | (_) | | (_| | |_) ||____/ \___/ \__,_|_| |_| \__,_|_|\___/|_|\__,_|_.__/Build:10:29:32,Oct  4 2023
Copyright (c) 2022 Bouffalolab team
======== flash cfg ========
flash size 0x01000000
jedec id     0xEF4018
mid              0xEF
iomode           0x04
clk delay        0x01
clk invert       0x01
read reg cmd0    0x05
read reg cmd1    0x35
write reg cmd0   0x01
write reg cmd1   0x31
qe write len     0x01
cread support    0x00
cread code       0xFF
burst wrap cmd   0x77
===========================
dynamic memory init success,heap size = 86 Kbyte
sig1:ffff32ff
sig2:0000ffff
lvgl case
lvgl success
[LVGL]
LVGL v8.3.7  Benchmark (in csv format)
[LVGL] Weighted FPS: 67
[LVGL] Opa. speed: 97%
[LVGL] Text small,19
[LVGL] Text small + opa,[LVGL] 19
[LVGL] Text medium,19
[LVGL] Text medium + opa,[LVGL] 19
[LVGL] Text large,19
[LVGL] Text large + opa,[LVGL] 19
[LVGL] Text large compressed,16
[LVGL] Substr. shadow,19
[LVGL] Substr. text,15
[LVGL] Rectangle,60
[LVGL] Rectangle + opa,[LVGL] 57
[LVGL] Rectangle rounded,53
[LVGL] Rectangle rounded + opa,[LVGL] 52
[LVGL] Circle,49
[LVGL] Circle + opa,[LVGL] 48
[LVGL] Border,59
[LVGL] Border + opa,[LVGL] 59
[LVGL] Border rounded,52
[LVGL] Border rounded + opa,[LVGL] 52
[LVGL] Circle border,46
[LVGL] Circle border + opa,[LVGL] 46
[LVGL] Border top,54
[LVGL] Border top + opa,[LVGL] 54
[LVGL] Border left,54
[LVGL] Border left + opa,[LVGL] 54
[LVGL] Border top + left,53
[LVGL] Border top + left + opa,[LVGL] 52
[LVGL] Border left + right,53
[LVGL] Border left + right + opa,[LVGL] 52
[LVGL] Border top + bottom,52
[LVGL] Border top + bottom + opa,[LVGL] 53
[LVGL] Shadow small,40
[LVGL] Shadow small + opa,[LVGL] 39
[LVGL] Shadow small offset,35
[LVGL] Shadow small offset + opa,[LVGL] 35
[LVGL] Shadow large,26
[LVGL] Shadow large + opa,[LVGL] 25
[LVGL] Shadow large offset,27
[LVGL] Shadow large offset + opa,[LVGL] 28
[LVGL] Image RGB,170
[LVGL] Image RGB + opa,[LVGL] 180
[LVGL] Image ARGB,161
[LVGL] Image ARGB + opa,[LVGL] 154
[LVGL] Image chorma keyed,165
[LVGL] Image chorma keyed + opa,[LVGL] 164
[LVGL] Image indexed,150
[LVGL] Image indexed + opa,[LVGL] 151
[LVGL] Image alpha only,158
[LVGL] Image alpha only + opa,[LVGL] 150
[LVGL] Image RGB recolor,156
[LVGL] Image RGB recolor + opa,[LVGL] 150
[LVGL] Image ARGB recolor,142
[LVGL] Image ARGB recolor + opa,[LVGL] 141
[LVGL] Image chorma keyed recolor,151
[LVGL] Image chorma keyed recolor + opa,[LVGL] 142
[LVGL] Image indexed recolor,144
[LVGL] Image indexed recolor + opa,[LVGL] 143
[LVGL] Image RGB rotate,118
[LVGL] Image RGB rotate + opa,[LVGL] 118
[LVGL] Image RGB rotate anti aliased,100
[LVGL] Image RGB rotate anti aliased + opa,[LVGL] 96
[LVGL] Image ARGB rotate,114
[LVGL] Image ARGB rotate + opa,[LVGL] 112
[LVGL] Image ARGB rotate anti aliased,86
[LVGL] Image ARGB rotate anti aliased + opa,[LVGL] 86
[LVGL] Image RGB zoom,125
[LVGL] Image RGB zoom + opa,[LVGL] 121
[LVGL] Image RGB zoom anti aliased,108
[LVGL] Image RGB zoom anti aliased + opa,[LVGL] 107
[LVGL] Image ARGB zoom,118
[LVGL] Image ARGB zoom + opa,[LVGL] 120
[LVGL] Image ARGB zoom anti aliased,97
[LVGL] Image ARGB zoom anti aliased + opa,[LVGL] 98
[LVGL] Text small,19
[LVGL] Text small + opa,[LVGL] 19
[LVGL] Text medium,19
[LVGL] Text medium + opa,[LVGL] 19
[LVGL] Text large,19
[LVGL] Text large + opa,[LVGL] 19
[LVGL] Text small compressed,18
[LVGL] Text small compressed + opa,[LVGL] 18
[LVGL] Text medium compressed,17
[LVGL] Text medium compressed + opa,[LVGL] 17
[LVGL] Text large compressed,16
[LVGL] Text large compressed + opa,[LVGL] 16
[LVGL] Line,53
[LVGL] Line + opa,[LVGL] 54
[LVGL] Arc think,44
[LVGL] Arc think + opa,[LVGL] 43
[LVGL] Arc thick,44
[LVGL] Arc thick + opa,[LVGL] 43
[LVGL] Substr. rectangle,36
[LVGL] Substr. rectangle + opa,[LVGL] 36
[LVGL] Substr. border,37
[LVGL] Substr. border + opa,[LVGL] 37
[LVGL] Substr. shadow,19
[LVGL] Substr. shadow + opa,[LVGL] 19
[LVGL] Substr. image,125
[LVGL] Substr. image + opa,[LVGL] 126
[LVGL] Substr. line,33
[LVGL] Substr. line + opa,[LVGL] 33
[LVGL] Substr. arc,42
[LVGL] Substr. arc + opa,[LVGL] 42
[LVGL] Substr. text,15
[LVGL] Substr. text + opa,[LVGL] 15

三、D0内核调试挖坑!!!

        测试D0内核花费了3天时间也没搞定,总是进入初始化以后,直接就卡屏卡死了。因为在假期,没带DEBUG工具,只能随便打点测试了一下;

        1.SPI1无法启用

按照官方SDK进行测试,发现根本没有使用SPI1,而且在lcd_spi_hard_4_init(lcd_spi_hard_4_init_t *dbi_parra)初始化过程中,spi_hd = bflb_device_get_by_name(LCD_SPI_HARD_4_NAME);得到的是spi0。。。

int lcd_spi_hard_4_init(lcd_spi_hard_4_init_t *dbi_parra)
{/* spi */struct bflb_spi_config_s spi_cfg = {.freq = dbi_parra->clock_freq,.role = SPI_ROLE_MASTER,.mode = SPI_MODE3,.data_width = SPI_DATA_WIDTH_8BIT,.bit_order = SPI_BIT_MSB,.byte_order = SPI_BYTE_LSB,.tx_fifo_threshold = 0,.rx_fifo_threshold = 0,};/* dma cfg */struct bflb_dma_channel_config_s dma_spi_tx_cfg = {.direction = DMA_MEMORY_TO_PERIPH,.src_req = DMA_REQUEST_NONE,.dst_req = DMA_REQUEST_SPI0_TX,.src_addr_inc = DMA_ADDR_INCREMENT_ENABLE,.dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE,.src_burst_count = DMA_BURST_INCR4,.dst_burst_count = DMA_BURST_INCR4,.src_width = DMA_DATA_WIDTH_16BIT,.dst_width = DMA_DATA_WIDTH_16BIT,};pixel_format = dbi_parra->pixel_format;#if (SPI_FIFO_WIDTH_VARIABLE_SUPPORT)/* SPI support burst*4 */spi_cfg.tx_fifo_threshold = (2 * 4 - 1);spi_cfg.rx_fifo_threshold = (2 * 4 - 1);spi_cfg.byte_order = SPI_BYTE_MSB;
#elifspi_cfg.tx_fifo_threshold = 4 - 1;spi_cfg.rx_fifo_threshold = 4 - 1;
#endifspi_hd = bflb_device_get_by_name(LCD_SPI_HARD_4_NAME);/* CS and DC pin init */gpio = bflb_device_get_by_name("gpio");bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_CS, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_DC, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);LCD_SPI_HARD_4_CS_HIGH;LCD_SPI_HARD_4_DC_HIGH;if (spi_hd->idx == 0) {bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_CLK, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_DAT, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);}
#if defined(GPIO_FUNC_SPI1)else if (spi_hd->idx == 1) {bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_CLK, GPIO_FUNC_SPI1 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);bflb_gpio_init(gpio, LCD_SPI_HARD_4_PIN_DAT, GPIO_FUNC_SPI1 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_2);}#endif/* spi init */bflb_spi_init(spi_hd, &spi_cfg);/* spi enabled continuous mode */// bflb_spi_feature_control(spi_hd, SPI_CMD_SET_CS_INTERVAL, true);if (pixel_format == LCD_SPI_LCD_PIXEL_FORMAT_RGB565) {dma_spi_tx_cfg.src_width = DMA_DATA_WIDTH_16BIT;dma_spi_tx_cfg.dst_width = DMA_DATA_WIDTH_16BIT;}if (spi_hd->idx == 0) {dma_spi_tx_cfg.dst_req = DMA_REQUEST_SPI0_TX;spi_tx_fifo_address = DMA_ADDR_SPI0_TDR;}
#if defined(DMA_REQUEST_SPI1_TX)else if (spi_hd->idx == 1) {dma_spi_tx_cfg.dst_req = DMA_REQUEST_SPI1_TX;spi_tx_fifo_address = DMA_ADDR_SPI1_TDR;}
#endif/* dma init */spi_dma_hd = bflb_device_get_by_name(LCD_SPI_HARD_4_DMA_NAME);bflb_dma_channel_init(spi_dma_hd, &dma_spi_tx_cfg);/* dma int cfg */bflb_dma_channel_irq_attach(spi_dma_hd, spi_dma_callback, NULL);return 0;
}

按照device_table.c文件中,竟然没有规定spi1..........,也没有规定DMA2的对应0-7个通道,但是却规定了DMA0的0-7个通道,官方datasheet中DMA0和DMA1只有一个通道。8个通道的寄存器基地址都是DMA0_BASE(  #define DMA0_BASE ((uint32_t)0x2000c000)),在else这个分支里面竟然中断号都是0XFF,真是被这SDK搞懵了。看这样子好像官方并不想让使用spi1来使用?????这个问题等待后续解决。

{ .name = "spi0",.reg_base = SPI0_BASE,
#if defined(CPU_M0) || defined(CPU_LP).irq_num = BL808_IRQ_SPI0,
#else.irq_num = 0xff,
#endif.idx = 0,.dev_type = BFLB_DEVICE_TYPE_SPI,.user_data = NULL 
},{ .name = "dma0_ch0",.reg_base = DMA0_BASE + 1 * DMA_CHANNEL_OFFSET,
#if defined(CPU_M0) || defined(CPU_LP).irq_num = BL808_IRQ_DMA0_ALL,
#else.irq_num = 0xff,
#endif.idx = 0,.sub_idx = 0,.dev_type = BFLB_DEVICE_TYPE_DMA,.user_data = NULL 
},

 四、引申出来的RAM分配问题

        下面贴一下官方的SDK中定义的分配方案,看的我脑袋大,有点看不懂能不能这样使用,或者是这样使用会不会出现冲突。(0x62020000的意思是使用chache访问,和直接访问0x2202000是一个意思,但是nocache_ram_memory区域必须使用0x22034000直接访问,不能使用cache访问)。

        1.M0的ram_memory区域,ram_memory  (!rx) : ORIGIN = 0x6202A000, LENGTH = 24K,也就是0x2202A000-0x2203000,但是LP内核的itcm_memory (rx)  : ORIGIN = 0x2202C000, LENGTH = 16K,也就是0x2202C000-0x2203000;

        2.LP内核区域的dtcm_memory (rx)  : ORIGIN = 0x22030000, LENGTH = 16K和M0内核的ram_wifi  (wxa)   : ORIGIN = 0x22030000, LENGTH = 160K - __EM_SIZE冲突,虽然LP内核内部没有cache功能,但是也好奇怪为什么还会划分idata和ddata这两个区域。

        3.我自己曾经尝试过按照不冲突的RAM地址升序顺序和严格按照手册所写的itcm和dtcm大小进行内存划分,没有发现明显区别,coremark和lvgl都没有任何提升。看看后续如何理解这个问题和解决问题。

LP-MEMORY
{fw_header_memory  (rx)  : ORIGIN = 0x58020000 - 0x1000, LENGTH = 4Kxip_memory  (rx)  : ORIGIN = 0x58020000, LENGTH = 1Mitcm_memory (rx)  : ORIGIN = 0x2202C000, LENGTH = 16Kdtcm_memory (rx)  : ORIGIN = 0x22030000, LENGTH = 16Knocache_ram_memory (!rx) : ORIGIN = 0x22030000, LENGTH = 0Kram_memory  (!rx) : ORIGIN = 0x22034000, LENGTH = 16Kxram_memory  (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
}M0-MEMORY
{fw_header_memory  (rx)  : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4Kxip_memory  (rx)  : ORIGIN = 0x58000000, LENGTH = 32Mram_psram  (wxa)  : ORIGIN = 0x50000000, LENGTH = 64Mitcm_memory (rx)  : ORIGIN = 0x62020000, LENGTH = 20Kdtcm_memory (rx)  : ORIGIN = 0x62025000, LENGTH = 4Knocache_ram_memory (!rx) : ORIGIN = 0x22026000, LENGTH = 16Kram_memory  (!rx) : ORIGIN = 0x6202A000, LENGTH = 24Kram_wifi  (wxa)   : ORIGIN = 0x22030000, LENGTH = 160K - __EM_SIZExram_memory  (!rx) : ORIGIN = 0x40000000, LENGTH = 16K
}D0-MEMORY
{fw_header_memory  (rx)  : ORIGIN = 0x58000000 - 0x1000, LENGTH = 4Kxip_memory  (rx)  : ORIGIN = 0x58000000, LENGTH = 32Mitcm_memory (rx)  : ORIGIN = 0x3eff0000, LENGTH = 28Kdtcm_memory (rx)  : ORIGIN = 0x3eff7000, LENGTH = 4Knocache_ram_memory (!rx) : ORIGIN = 0x3eff8000, LENGTH = 0Kram_memory  (!rx) : ORIGIN = 0x3eff8000, LENGTH = 32K + 32Kxram_memory (!rx) : ORIGIN = 0x40004000, LENGTH = 16K
}

        还是希望官方能够多给点文档看啊,linux下的M1S_DOCK_SDK好像就有很多正常的功能寄存器,还有库文件,我看文件抬头都是博流写的,真的是无语了。

        后续还是在Linux下使用M1S_DOCK_SDK开发吧,官方的库我实在是搞不懂。浪费精力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148651.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

STM32复习笔记(五):FSMC连接外部SRAM

目录 Preface&#xff1a; &#xff08;一&#xff09;原理相关 &#xff08;二&#xff09;CUBEMX配置 &#xff08;三&#xff09;轮询方式读写 &#xff08;四&#xff09;DMA方式读写 Preface&#xff1a; STM32F4有一个FSMC&#xff08;Flexible Static Memory Contr…

C++ YAML使用

C++工程如何使用YAML-cpp 一、前期准备工作 1、已安装minGW、cmake、make等本地工具。 2、下载YAML-cpp第三方开源代码(一定要下载最新的release版本,不然坑很多)。 3、生成YAML-cpp静态库 (1)在yaml-cpp-master下建立build文件夹; (2)在该文件夹下生成MakaFile文…

Ubuntu22.04 交叉编译gcc9.5 for arm

一、准备 环境&#xff1a;ubuntu22.04为刚刚安装&#xff0c;未安装gcc等包 vi ~/.bashrc输入 export PATH$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin 保存,reboot 安装&#xff1a; sudo apt install cmake sudo apt install gawk sudo apt instal…

C++ 程序员入门之路——旅程的起点与挑战

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

国庆假期day5

作业&#xff1a;请写出七层模型及每一层的功能&#xff0c;请绘制三次握手四次挥手的流程图 1.OSI七层模型&#xff1a; 应用层--------提供函 表示层--------表密缩 会话层--------会话 传输层--------进程的接收和发送 网络层--------寻主机 数据链路层----相邻节点的可靠传…

国庆10.4

QT实现TCP服务器客户端 服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表容器 #include <QMe…

mysql面试题14:讲一讲MySQL中什么是全同步复制?底层实现?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:讲一讲mysql中什么是全同步复制?底层实现? MySQL中的全同步复制(Synchronous Replication)是一种复制模式,主服务器在写操作完成后,必须等待…

Apacha Flume

0目录 1.Flume概述 2.Flume安装部署 3.案例1 4.案例2 5.案例3 1.Flume概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的&#xff0c;高可靠的&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构&#xff0c;灵活简单。 1.2 Flume基础架构 Flume组…

ES6中对象的扩展

1. 属性的简洁表示法 可以直接写入变量和函数作为对象的属性和方法。在对象中只写属性名&#xff0c;不写属性值&#xff0c;代表属性值等于和属性名相同的的变量的值。 属性的简写 let foo bar; let baz {foo}; // { foo: bar } // 等同于 let baz { foo: foo}方法的简写…

Nginx高级 第一部分:扩容

Nginx高级 第一部分&#xff1a;扩容 通过扩容提升整体吞吐量 1.单机垂直扩容&#xff1a;硬件资源增加 云服务资源增加 整机&#xff1a;IBM、浪潮、DELL、HP等 CPU/主板&#xff1a;更新到主流 网卡&#xff1a;10G/40G网卡 磁盘&#xff1a;SAS(SCSI) HDD&#xff08;机械…

十天学完基础数据结构-第二天(数据结构简介)

什么是数据结构&#xff1f; 在计算机科学中&#xff0c;数据结构是一种组织和存储数据的方式。它定义了数据的布局&#xff0c;以及对这些数据执行的操作。你可以把数据结构看作是计算机内存中的特定组织方式&#xff0c;就像图书馆中书籍的排列一样。 数据结构可以是各种形…

python获取时间戳

使用 datetime 库获取时间。 获取当前时间&#xff1a; import datetime print(datetime.datetime.now()) . 后面的是微秒&#xff0c;也是一个时间单位&#xff0c;1秒1000000微秒。 转为时间戳&#xff1a; import datetimedate datetime.datetime.now() timestamp date…

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

Springboot场景开发多面手

LinkedBear &#xff0c;资深 Java 高级工程师&#xff0c;底层技术研究者与分享者&#xff0c;倾心研究 Spring 技术体系多年&#xff0c;对 Spring、Spring Boot 、SpringCloud 等框架有独到的见解&#xff0c;拥有丰富的框架体系实践经验和架构封装经验。善于总结、输出&…

CharacterEncodingFilter的用法

CharacterEncoding是SpringMVC提供的一个一个过滤器,用于设置请求和响应的字符编码,解决乱码问题,他本身是一个过滤器 那么在SpringBoot中,CharacterEncoding就有一个很好的秒用 setEncoding("UTF-8")设置编码 setForceEncoding(true) 设置请求和响应编码 还需要在配…

leetcode做题笔记160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

计算机视觉——飞桨深度学习实战-深度学习网络模型

深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分&#xff0c;本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍&#xff0c;从经典的深度学习网络模型以CNN、RNN为代表&#xff0c;到为了解决显存不足、实时性不够等问题的轻量化网络…

Day-05 CentOS7.5 安装docker

参考 &#xff1a; Install Docker Engine on CentOS | Docker DocsLearn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/install/centos/ Doc…

计算机网络 第二章物理层

计算机网络第二章知识点速刷 其中重要的是信源和信宿&#xff0c;以及调制解调器在通信模型当中起到的作用。 单工、半双工和全双工。

【Java 进阶篇】JDBC 数据库连接池详解

数据库连接池是数据库连接的管理和复用工具&#xff0c;它可以有效地降低数据库连接和断开连接的开销&#xff0c;提高了数据库访问的性能和效率。在 Java 中&#xff0c;JDBC 数据库连接池是一个常见的实现方式&#xff0c;本文将详细介绍 JDBC 数据库连接池的使用和原理。 1…