中科蓝讯内存COM区和Bank区:【图文讲解】

中科蓝讯芯片采用最近比较流行的RISC-V(32位)开源内核架构 + 国产RT-Thread操作系统.  不过从代码上来看, 操作系统代码已经被封装到库中, 一般用户可以不用涉及操作系统代码, 降低了开发难度.

中科蓝讯芯片 "冯·诺依曼结构", 即代码与数据的统一编址. 框架结构大致如下:

芯片内部一般会封装一颗512K或1M SpiFlash, 用于存放代码及资源文件/参数记忆等. SpiFlash和芯片之间通过spi接口进行通信.

首先,代码不会直接在SpiFlash上运行, SpiFlash中所有程序及数据均需要先通过spi接口加载到芯片RAM中, CPU再从RAM中取指令或数据运行.

1:com区和bank区

基于上述的程序存储框架, 中科蓝讯芯片在程序编写时, 有两个重要的概念:

com区(公共区) 和 bank区.

com区(公共区):

芯片上电, 一般从Mask程序区开始运行, 在进入main函数之前, 程序会先把com区程序从Flash加载到芯片内部Ram. 由于在程序的整个生命周期内, com区程序会一直保留在RAM中. CPU执行com区代码会很快.  但由于芯片RAM有限, com区一般分配在几十K以内.

bank区(也称为flash区):

Flash中的bank区(存储区)一般是几百K以上.

RAM中的bank程序运行区(类似cache), 一般从几K到几十K不等.

由于RAM中的bank区远远小于FLASH中的bank区, 所以CPU会根据需要不断把Flash(bank程序存储区)中的代码动态替换(加载)到 RAM中的bank程序运行区运行. 由于芯片与Flash之间通过spi进行通信, bank区代码执行速度相对比较慢.

 2:开发Tips:

1:中断函数(及其子函数)必须放入com区, 否则(放入bank区)会导致死机.

中断响应需要非常及时, com区程序常驻于RAM中, CPU可以迅速响应中断函数.  如果中断函数放入bank区, 中断响应时,可能该bank区还未加载到RAM中, 还需要先加载再运行,耗时相对较慢.  为了防止中断响应慢,芯片做了限定: 中断中加载bank区代码则直接死机. 另外需要特别注意: 中断函数中不能有switch语句, swith语句编译后生成的跳转常量表会默认放到bank区, 引起中断函数访问bank区死机. 请用if-else语句代替switch语句.一些实时性要求比较高的代码,首选放入com区.

2).函数前没有AT指定存放段的代码, 默认放入bank区,  bank区代码自动加载(或替换), 不需要人工干预.

由于bank区加载到RAM, 需要spi通信, IO翻转会有一定干扰, 在一些对干扰敏感的应用中, 如FM, 可以把所有相关程序放入同一个命名的bank, 这样bank加载时, 会大概率地把所有同一bank中的程序一次性加载到RAM中,减少程序运行时可能不断多次地加载引起的spi通信干扰.

3:函数放入com区的写法

在函数前面加入AT(.指定段名到com区) 即可.示例如 usr_tmr1ms_isr函数前面的AT(.com_text.timer)

AT(.com_text.timer)

void usr_tmr1ms_isr(void)
{
    gui_scan();                   
    .....
}

在map.text中可以看到, usr_tmr1ms_isr位于 0x20e4a.位于0x20000~ (0x20000+34K) 的com区内.

另外有一点, printf参数中的字符串常量也是默认放在bank区中, 如果在中断中调用printf, 也需要把字符串常量放入com区.

如下:

AT(.com_text.str1)

const char str1[] = "Com String";

AT(.com_text.str2) //注意每个字符串前都需要增加 AT定位到com区去.

const char str2[] = "val = %d\n";

调用printf时, 直接使用该字符串即可:

AT(.com_text.timer)

void usr_tmr5ms_isr(void)

{

    printf(str1);

    printf(str2, test_val);

    ......

}

<think>好的,我现在要解决用户提出的关于OpenGL中缺失EGL的问题。首先,我需要回忆EGL在OpenGL中的作用。EGL是作为OpenGL本地窗口系统之间的中间层,负责上下文管理、表面创建等。如果缺少EGL,可能导致无法正确初始化渲染环境。 用户提到的问题可能是他们在开发过程中遇到了EGL相关的错误,比如无法初始化EGLDisplay或者找不到相关的函数。我需要考虑可能导致这个问题的原因。根据引用[1]中的代码片段,eglInitialize函数的实现位于特定的源码位置,这可能意味着在某些环境中EGL的实现可能没有被正确链接或包含。 接下来,我需要分步骤思考解决方案。首先,用户应该检查开发环境是否安装了正确的EGL库。例如,在Linux上,可能需要安装如libegl1-mesa-dev这样的包。引用[4]提到,开发板需要GPU厂商提供的OpenGL ES库头文件,这可能意味着用户需要确保这些依赖项已正确安装。 然后,用户需要验证他们的项目配置是否正确,包括编译器链接器是否指向正确的库路径。例如,使用-lEGL来链接EGL库。如果用户使用的是跨平台环境,比如Android,可能需要检查NDK的配置,确保包含EGL头文件库。 另外,用户可能需要检查代码中的初始化流程是否正确。例如,在引用[3]中提到的EGL环境搭建步骤,是否正确创建了Display、Config、ContextSurface。如果步骤有误,可能导致EGL功能无法正常使用。 还有可能需要考虑硬件支持的问题。某些集成显卡或旧硬件可能不支持EGL,或者需要特定的驱动程序。用户应检查GPU是否支持所需的EGL版本,并安装最新的驱动。 最后,用户可能需要查阅更多的文档或社资源,如Khronos的官方文档,以获取针对他们特定平台的指导。如果问题依然存在,可能需要调试代码,使用工具检查库的加载情况,或者查看更详细的错误日志。</think>### OpenGL缺失EGL问题的解决方案 EGL是OpenGL/OpenGL ES与本地窗口系统之间的接口层,负责上下文管理、表面创建资源绑定。若出现EGL缺失问题,可按照以下步骤排查解决: #### 1. 验证系统环境支持 - **Linux系统**需安装Mesa库: ```bash sudo apt-get install libegl1-mesa-dev mesa-common-dev ``` - **Android NDK开发**需在`CMakeLists.txt`中添加EGL链接: ```cmake target_link_libraries(YourTarget EGL GLESv2) ``` - **嵌入式平台**需确认GPU厂商提供了EGL库(如Mali/Adreno驱动),引用[4]指出需确保GPU相关库已正确安装 #### 2. 检查代码初始化流程 正确EGL初始化顺序应为: 1. 获取Display:`eglGetDisplay()` 2. 初始化Display:`eglInitialize()` 3. 选择Config:`eglChooseConfig()` 4. 创建Context:`eglCreateContext()` 5. 创建Surface:`eglCreateWindowSurface()` 6. 绑定上下文:`eglMakeCurrent()` 代码示例参考引用[1]中的`eglInitialize`实现: ```cpp EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) { clearError(); egl_connection_t* const cnx = &gEGLImpl; return cnx->platform.eglInitialize(dpy, major, minor); } ``` #### 3. 检查依赖项链接 - 编译时需添加`-lEGL`链接器标志 - Windows系统需要`egl.h``egl.lib`(通常由ANGLE库提供) - 确认头文件包含路径正确: ```cpp #include <EGL/egl.h> #include <GLES2/gl2.h> ``` #### 4. 调试常见错误场景 | 错误现象 | 可能原因 | 解决方案 | |--------------------------|---------------------------|------------------------------| | `eglInitialize`失败 | 显示设备不兼容 | 改用`EGL_DEFAULT_DISPLAY` | | 未找到EGL函数符号 | 动态库加载顺序错误 | 先加载`libEGL.so`再加载GL库 | | `eglCreateContext`返回NULL| 未正确设置GL版本属性 | 添加`EGL_CONTEXT_CLIENT_VERSION`属性 | #### 5. 平台特定注意事项 - **Android**:必须使用`EGLContext`而非`GLX/WGL`,引用[3]中Android OpenGLES开发教程强调必须通过EGL创建渲染环境 - **WebGL**:浏览器自动处理EGL等价功能,无需手动配置 - **嵌入式系统**:可能需要设置`LD_LIBRARY_PATH`指向GPU厂商提供的库路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevinLGT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值