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

news2024/12/30 3:20:20

一、主核心的介绍

        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_CODE
    if (uhs_psram_init() < 0) {
        while (1) {
        }
    }
#endif
#endif

    size_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







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

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

相关文章

基于微信小程序的高校宿舍管理系统设计与实现(亮点:选择宿舍、宿舍评分、宿舍报修)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【中秋节快乐】Matplotlib:3d绘图合集

目录 一、环境介绍 二、Matplotlib绘图&#xff08;3d&#xff09; 0. 设置中文字体 1. 3D线框图&#xff08;3D Wireframe Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 3. 3D条形图&#xff08;3D Bar Plot&#xff09; 4. 3D曲面图&#xff0…

微信小游戏从零到上线系列文章整理,建议收藏

引言 本系列是《从零开始开发贪吃蛇小游戏到上线系列》&#xff0c;欢迎大家关注分享收藏订阅。 大家中秋快乐&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。前面笔者给大家讲解了微信小游戏如何从零到上线的流程。可能很多小伙伴都还没有看到。 本…

【深度学习_TensorFlow】卷积神经网络(CNN)

写在前面 这篇文章的行文思路如下&#xff1a; 先根据视频了解卷积和卷积神经网络的整体框架 接着了解卷积神经网络构建过程中的一些重要操作&#xff0c;包括内积、填充、池化。 然后介绍卷积层如何实现。 最后用卷积神经网络的开山之作&#xff08;LeNet-5&#xff09;来…

22 mysql range 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

奶茶果饮外卖配送小程序商城的作用是什么

奶茶果饮商家众多&#xff0c;有加盟品牌也有独立自创品牌或小店等&#xff0c;奶茶果饮已经成为众多年轻人群体喜爱的饮品&#xff0c;在实际消费方面&#xff0c;普遍以到店外卖为主&#xff0c;市场需求较高&#xff0c;但同样的竞争压力也不小。 同行竞争激烈&#xff0c;…

【教学类-35-03】学号+姓名+班级(小3班)学号字帖(A4竖版2份)

图片展示: 背景需求: 本周排到小3班&#xff0c;还没有来得及设计小班主题活动书的内容&#xff0c;于是就把小2班的学号字帖微调一下&#xff0c;做一份竖版2份的学号字帖。 让幼儿熟悉自己的学号&#xff0c;让我也熟悉幼儿的名字和学号 材料准备&#xff1a; 描字写&#…

Excel 使用 ctrl + E 快捷键进行数据提取、合并、添加前后缀等操作

使用组合键【Ctrl E】&#xff0c;你可以对数据进行合并、数据提取、添加前后缀等操作。 合并 提取 加前后缀或单位

KNN(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

day09_数组进阶

今日内容 零、 复习昨日 一、作业 二、引用类型[重要] 三、数组拷贝 四、数组扩容 五、数组排序[面试|笔试] 六、Arrays 零、 复习昨日 1数组创建后能否改变长度 不能 2数组创建后能否存储不同类型的数据 不能 √能,能默认转型的可以存储 double[] arr2 new double[3]; arr2[0…

TouchGFX之动态位图

标准位图会被编译到应用中&#xff0c;因此必须在编译时提供。在运行时间在RAM中创建位图&#xff0c;被称为动态位图。 动态位图的使用与编译到应用中的静态位图相同。 动态位图配置 必须先配置位图缓存&#xff0c;然后才能创建动态位图。 FrontendApplication.hpp#inclu…

基于PHP+MySQL的养老院管理系统

摘要 随着21世纪互联网时代的兴起&#xff0c;我们见证了人们生活方式的巨大改变。这个时代不仅深刻影响了我们的生活&#xff0c;还改变了我们对信息科学的看法。社会的各个领域都在不断发展&#xff0c;人们的思维也在不断进步&#xff0c;与此同时&#xff0c;信息的需求也与…

开具数电票如何减少认证频次?

“数电票”开具需多次刷脸认证&#xff0c;如何减少认证频次&#xff1f; 法定代表人、财务负责人可以在“身份认证频次设置”功能自行设置身份认证时间间隔&#xff0c;方法如下&#xff1a; 第一步 登录电子税务局。企业法定代表人或财务负责人通过手机APP“扫一扫”&#x…

jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error

1、错误信息 2、解决办法 打开Anaconda Promt界面&#xff0c;进入自己的虚拟环境。在命令行输入以下指令&#xff1a; pip install --upgrade nbconvert

全国排名前三的直播公司无锋科技入驻天府蜂巢成都直播产业基地

最近&#xff0c;全国排名前三的直播公司——无锋科技&#xff0c;正式宣布入驻位于成都的天府蜂巢直播产业基地&#xff0c;这一消息引起了业内人士的高度关注。成都直播产业基地一直是中国直播产业的重要地标之一&#xff0c;其强大的技术和资源优势为众多直播公司提供了广阔…

TouchGFX之二进制字体

将字体链接到应用的基本原则的主要优势是应用始终会自动包含应用中使用的更新文本和字体排印。 因此&#xff0c;使用起来十分容易和安全。 其缺点在于字体会使应用的体积变大。 为了缓解这个问题&#xff0c;TouchGFX允许应用使用二进制字体。 这些字体不链接到应用&#xff…

西北主要河流水系(绿洲)流域(山区)及高程分类数据集(一)

最近收集整理的了西北地区主要河流水系&#xff08;绿洲&#xff09;流域&#xff08;山区&#xff09;及高程分类数据&#xff0c;&#xff0c;本次主要是新疆的河流水系&#xff08;绿洲&#xff09;流域&#xff08;山区&#xff09;及高程分类数据&#xff08;矢量&#xf…

Mysql高级——数据库调优策略(1)

数据库其它调优策略 1. 数据库调优的措施 1.1 调优的目标 尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务。&#xff08;吞吐量更大&#xff09;合理的结构设计和参数调整&#xff0c;以提高用户操作响应的速度。&#xff08;响应速度更快&#xff09;减少系…

使用华为eNSP组网试验⑶-OSPF单区域组网

从2019年6月份开始学习网络&#xff0c;最主要的驱动力是一旦涉及网络配置的改动都需要找别人帮忙&#xff0c;有时候被别人找理由拖延或者拒绝&#xff0c;心里就会难过&#xff0c;不就是配置一些代码吗&#xff1f;&#xff01;这和写程序有多大的区别&#xff1f;&#xff…

Swift 周报 第三十八期

文章目录 前言新闻和社区苹果自研调制解调器芯片受挫&#xff1a;速度太慢容易过热&#xff0c;落后高通 3 年App Store 现已接受适用于最新版操作系统的 App 和游戏提交 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组…