BL808学习日志-0-概念理解

2023-10-23 23:20

本文主要是介绍BL808学习日志-0-概念理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、主核心的介绍

        1.三个核心在FREERTOS系统中相互独立,各负责各自的外设和程序;其中M0和LP核心在一个总线上,D0单独在一个总线上,两个总线使用AXI4.0(??)通讯?

CPU0(M0)-E907架构,320MHz;

CPU1(LP)-E902架构,160MHz;

CPU2(D0)-C906架构,480MHz;

        2.CPU0(M0)先启动,然后再启动CPU2(C906),CPU1(e902);相关的代码在博流的SDK中位置如下:/../BOUFFALO_SDK/bsp/board/bl808dk/board.c;

#if defined(CPU_M0)
void board_init(void)
{int ret = -1;uintptr_t flag;flag = bflb_irq_save();GLB_Halt_CPU(GLB_CORE_ID_D0);GLB_Halt_CPU(GLB_CORE_ID_LP);ret = bflb_flash_init();system_clock_init();peripheral_clock_init();bflb_irq_initialize();console_init();#ifdef CONFIG_PSRAM
#ifndef CONFIG_PSRAM_COPY_CODEif (uhs_psram_init() < 0) {while (1) {}}
#endif
#endifsize_t heap_len = ((size_t)&__HeapLimit - (size_t)&__HeapBase);kmem_init((void *)&__HeapBase, heap_len);bl_show_log();if (ret != 0) {printf("flash init fail!!!\r\n");}bl_show_flashinfo();printf("dynamic memory init success,heap size = %d Kbyte \r\n", ((size_t)&__HeapLimit - (size_t)&__HeapBase) / 1024);printf("sig1:%08x\r\n", BL_RD_REG(GLB_BASE, GLB_UART_CFG1));printf("sig2:%08x\r\n", BL_RD_REG(GLB_BASE, GLB_UART_CFG2));log_start();#if (defined(CONFIG_LUA) || defined(CONFIG_BFLOG) || defined(CONFIG_FATFS))rtc = bflb_device_get_by_name("rtc");
#endif/* set CPU D0 boot XIP address and flash address */Tzc_Sec_Set_CPU_Group(GLB_CORE_ID_D0, 1);/* D0 boot from 0x58000000 */GLB_Set_CPU_Reset_Address(GLB_CORE_ID_D0, 0x58000000);/* D0 image offset on flash is CONFIG_D0_FLASH_ADDR+0x1000(header) */bflb_sf_ctrl_set_flash_image_offset(CONFIG_D0_FLASH_ADDR + 0x1000, 1, SF_CTRL_FLASH_BANK0);Tzc_Sec_Set_CPU_Group(GLB_CORE_ID_LP, 0);/* LP boot from 0x58020000 */GLB_Set_CPU_Reset_Address(GLB_CORE_ID_LP, 0x58020000);bflb_irq_restore(flag);GLB_Release_CPU(GLB_CORE_ID_D0);GLB_Release_CPU(GLB_CORE_ID_LP);/* release d0 and then do can run */BL_WR_WORD(IPC_SYNC_ADDR1, IPC_SYNC_FLAG);BL_WR_WORD(IPC_SYNC_ADDR2, IPC_SYNC_FLAG);L1C_DCache_Clean_By_Addr(IPC_SYNC_ADDR1, 8);
}

其中按照顺序依次是

bflb_irq_save();                                                    关闭全局中断;

GLB_Halt_CPU(GLB_CORE_ID_D0);                关闭D0核心

GLB_Halt_CPU(GLB_CORE_ID_LP);                关闭LP低功耗核心;

bflb_flash_init();                                                   初始化FLASH;

system_clock_init();                                             初始化时钟;

peripheral_clock_init();                                         初始化外设时钟;

bflb_irq_initialize();                                               初始化中断;

console_init();                                                       初始化串口;

uhs_psram_init();                                                  初始化内置的64M UHS_PSRAM ;

/* set CPU D0 boot XIP address and flash address */

    Tzc_Sec_Set_CPU_Group(GLB_CORE_ID_D0, 1);

    /* D0 boot from 0x58000000 */

    GLB_Set_CPU_Reset_Address(GLB_CORE_ID_D0, 0x58000000);

    /* D0 image offset on flash is CONFIG_D0_FLASH_ADDR+0x1000(header) */

    bflb_sf_ctrl_set_flash_image_offset(CONFIG_D0_FLASH_ADDR + 0x1000, 1, SF_CTRL_FLASH_BANK0);

    Tzc_Sec_Set_CPU_Group(GLB_CORE_ID_LP, 0);

    /* LP boot from 0x58020000 */

    GLB_Set_CPU_Reset_Address(GLB_CORE_ID_LP, 0x58020000);

    bflb_irq_restore(flag);

    GLB_Release_CPU(GLB_CORE_ID_D0);

    GLB_Release_CPU(GLB_CORE_ID_LP);

    /* release d0 and then do can run */

    BL_WR_WORD(IPC_SYNC_ADDR1, IPC_SYNC_FLAG);

    BL_WR_WORD(IPC_SYNC_ADDR2, IPC_SYNC_FLAG);

    L1C_DCache_Clean_By_Addr(IPC_SYNC_ADDR1, 8);

        3.内存划分,这部分比较抽象,MM内核指的是multi-media内核(手册上多次出现MM前缀的外设,也就是指C906独有的部分),也就是C906(d0)内核,MCU指的就是E907和E902共用的部分;均可使用直接地址访问。

        4.C906的外设只能C906使用;E907(M0)的外设,E902(LP)核心也可以使用(因为他们本来就是在一条AHB总线上的)包括串口和IO之类的;默认的MCU部分有3个串口,UART0、UART1、UART2;C906只有一个串口,在系统中默认编号是UART3;   

        5.XRAM的大小是16K,地址为0x40000000,其设定的意义是让三个核心可以通过这个区域进行IPC通讯;

        每个内核都有一组 IPC 的寄存器,包括 IPCx_TRI、IPCx_STS、IPCx_ACK、IPCx_IEN、IPCx_IDIS、IPCx_ISTS 共 6 个寄存器,这些寄存器的长度都是 32bits,每个 bit 都对应 IPC 的一个通道。核 M0、LP、D0 分别对应 IPC0、IPC1、IPC2。当一个核需要向另一个核发通知时,只需要向接收核的 IPCx_TRI 的对应通道写 1 即可,此时接收核的 IPCx_STS 的对应通道即被设置为 1,如果接收核的 IPC 对应通道的中断也被使能,则会收到一个中断,此时即获知了其他核发来的通知。 

        目前此部分还未做实验,看zhihu上有人实验,D0和M0是可以正常通讯的,好像和LP之间有问题,估计是中断没处理好。地址在这   

        6.coremark测试,使用官方自带的测试例程进行测试,M0的程序可以正常运行,D0的无法正常运行,待修复;已修复,M0实验结果如下:显示为1111,-O3优化,数据放在STACK中;

____               __  __      _       _       _     |  _ \             / _|/ _|    | |     | |     | |    | |_) | ___  _   _| |_| |_ __ _| | ___ | | __ _| |__  |  _ < / _ \| | | |  _|  _/ _` | |/ _ \| |/ _` | '_ \ | |_) | (_) | |_| | | | || (_| | | (_) | | (_| | |_) ||____/ \___/ \__,_|_| |_| \__,_|_|\___/|_|\__,_|_.__/ Build:13:43:42,Sep 29 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 = 21 Kbyte 
sig1:ffff32ff
sig2:0000ffff
Benchmark started, please make sure it runs for at least 10s.
Now PC=58014b88
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 18067
Total time (secs): 18
Iterations/Sec   : 1111
Iterations       : 20000
Compiler version : GCC10.2.0
Compiler flags   : -O3
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x382f
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 1111 / GCC10.2.0 -O3 / STACK

  D0由于代码有问题,测试结果可能有问题,显示为1666,

____               __  __      _       _       _     |  _ \             / _|/ _|    | |     | |     | |    | |_) | ___  _   _| |_| |_ __ _| | ___ | | __ _| |__  |  _ < / _ \| | | |  _|  _/ _` | |/ _ \| |/ _` | '_ \ | |_) | (_) | |_| | | | || (_| | | (_) | | (_| | |_) ||____/ \___/ \__,_|_| |_| \__,_|_|\___/|_|\__,_|_.__/ Build:20:01:44,Sep 29 2023
Copyright (c) 2022 Bouffalolab team
dynamic memory init success,heap size = 59 Kbyte 
sig1:ffff32ff
sig2:0000ffff
cgen1:9f7ffffd
Benchmark started, please make sure it runs for at least 10s.
Now PC=580104c2
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 12240
Total time (secs): 12
Iterations/Sec   : 1666
Iterations       : 20000
Compiler version : GCC10.2.0
Compiler flags   : -O3
Memory location  : Stack
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x382f
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 1666 / GCC10.2.0 -O3 / Stack

LP的coremark暂时没搞定,跑出来只有2分,不确定是内存不足还是什么情况。

  ____               __  __      _       _       _     |  _ \             / _|/ _|    | |     | |     | |    | |_) | ___  _   _| |_| |_ __ _| | ___ | | __ _| |__  |  _ < / _ \| | | |  _|  _/ _` | |/ _ \| |/ _` | '_ \ | |_) | (_) | |_| | | | || (_| | | (_) | | (_| | |_) ||____/ \___/ \__,_|_| |_| \__,_|_|\___/|_|\__,_|_.__/ Build:15:26:15,Sep 29 2023
Copyright (c) 2022 Bouffalolab team
lp does not use memheap due to little ram 
sig1:32ff76ff
sig2:0000ffff
cgen1:9f7ffffd
Benchmark started, please make sure it runs for at least 10s.
Now PC=580349bc
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 15729
Total time (secs): 15
Iterations/Sec   : 2
Iterations       : 30
Compiler version : GCC10.2.0
Compiler flags   : -O3
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xf8b3
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 2 / GCC10.2.0 -O3 / STACK

   二、应用例程探究                  

        看到好多网络上的例程和官方例程,这里着重写几个有意思的;

        1、模拟GBA游戏机

        例程来源于这里,在这位的基础上增加了一个简单的查看FPS的小功能,其实官方仓库都有;这里做一个对比:ESP32-S3 在分辨率是256*160跳帧为1的情况下是20帧,我测试的BL808的C906在400Mhz,256*160分辨率下是33-37帧。而且后面的日志显示,此时C906主频为400Mhz;

NameTested hardwarePerformanceNotes
ESP32-S3ESP32-S3-WROOM-1-N8R820 fpsframeskip: 1
SDL2AMD 3800X1800 fps
SDL2Switch314 fps
SDL2Apple M12300 fps
SDL2Vita131 fpsframeskip: 1, overclocked
SDL1New 3DS111 fpsframeskip: 1, overclocked
watchOSApple Watch Series 5451 fpsNot public yet
BL808_D0SIPEED M1S_DOCK33fps

        只需要按照原作者的文件,并进行一点点修改就行,增加两个freertos的头文件,增加一个时间获取的函数,计算一下生成120帧的时间,进行FPS平均值统计,结果是33-35FPS;看来对比ESP32-S3还是有点优势的,coremark从ESP32-S3的单核613,提升到BL808_D0的单核1666。

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#include "gba.h"
#include "globals.h"
#include "memory.h"
#include "sound.h"/* aos */
#include <aos/kernel.h>
#include <vfs.h>extern "C" {
#include "lcd.h"
#include <FreeRTOS.h>
#include <task.h>
}uint16_t lcd_buff[256 * 160];
uint8_t frameDrawn = 0;
uint32_t frameCount = 0;
void systemDrawScreen(void)
{frameDrawn = 1;uint16_t *src = pix;uint16_t *dst = lcd_buff;for (int y = 0; y < 160; y++) {for (int x = 0; x < 256; x++) {*dst++ = __builtin_bswap16(*src++);}}st7789v_spi_draw_picture_blocking(20, 40, 20+256-1, 40+160-1, lcd_buff);
}void systemOnWriteDataToSoundBuffer(int16_t *finalWave, int length) {}void systemMessage(const char *fmt, ...)
{char buf[256];va_list args;va_start(args, fmt);vsnprintf(buf, sizeof(buf), fmt, args);va_end(args);printf("GBA: %s", buf);
}extern "C" {
extern uint32_t bl808_key_read();
void emuMainLoop()
{int fd = -1;fd = aos_open("/flash/goodBoyAdv.gba", 0);if(fd >= 0){int model_bin_len = 0;model_bin_len = aos_lseek(fd, 0, SEEK_END);aos_lseek(fd, 0, SEEK_SET);aos_read(fd, rom, model_bin_len);aos_close(fd);}CPUSetupBuffers();CPUInit(NULL, false);CPUReset();int prevTimeStamp = 0;TickType_t fpsTick = xTaskGetTickCount();while (1){joy = bl808_key_read();UpdateJoypad();frameDrawn = 0;while (!frameDrawn) {CPULoop();}frameCount++;if (frameCount % 120 == 0) {TickType_t now = xTaskGetTickCount();int msPassed = (now - fpsTick) * portTICK_PERIOD_MS;fpsTick = now;int fps = 120 * 1000 / msPassed;printf("FPS: %d\r\n", fps);}}
}
}
Starting bl808 now....
Heap Info: 29819 KB @ [0x0x00000000522e10f8 ~ 0x0x0000000054000000]
[OS] Starting aos_loop_proc task...
[OS] Start c906 xram handle...
[OS] Starting OS Scheduler...
init ring:0,tx:0x0000000022020140,rx:0x0000000000000000
init ring:2,tx:0x0000000022021340,rx:0x0000000022020340
init ring:3,tx:0x0000000022022540,rx:0x0000000022022340
init ring:4,tx:0x0000000022022840,rx:0x0000000022022740
init ring:5,tx:0x0000000000000000,rx:0x0000000000000000
Init CLI with event Driven
FPS: 36
FPS: 37
FPS: 36
FPS: 37
FPS: 37
FPS: 36
FPS: 37
FPS: 37
FPS: 36
FPS: 37
FPS: 36
FPS: 36
FPS: 36
FPS: 34
FPS: 35
FPS: 34
FPS: 34
FPS: 35
FPS: 35
FPS: 34
FPS: 35
FPS: 34
FPS: 34
FPS: 35

这篇关于BL808学习日志-0-概念理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271119

相关文章

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx