在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

  • 参考文章
  • 源码下载地址
  • 一、SDL2的创建、初始化、退出
  • 二、系统基本Tick、彩屏刷新、按键事件
  • 三、彩屏获取与设置颜色
  • 四、彩屏填充颜色及清屏
  • 五、彩屏显示中文和英文字符串
  • 六、彩屏显示数字
  • 七、彩屏初始化
  • 八、主函数测试
  • 九、测试效果

参考文章

  • 在CodeBlocks下搭建SDL2开发工程
  • 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)



源码下载地址

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示


一、SDL2的创建、初始化、退出


typedef struct
{
    SDL_Window   * MainWindow;  /* 窗口 */
    SDL_Renderer * MainRender;  /* 渲染器 */
    SDL_Texture  * MainTexture; /* 纹理 */
    u8             ExitWindow;  /* 退出窗口 */
}AppGlobal_TypeDef, * AppGlobal_TypeDef_t;


static AppGlobal_TypeDef AppSystem = {0};
AppGlobal_TypeDef * pAppSystem = &AppSystem;


 /* 初始化SDL */
static u8 ubInit_SDL2(void)
{
    /* 初始化SDL */
    if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0)
    {
        SDL_Log("SDL Init Fail......%s\r\n", SDL_GetError());
        return 1;
    }

    /* 创建窗口 */
    AppSystem.MainWindow = SDL_CreateWindow("Virtual TFT SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);
    if (AppSystem.MainWindow == NULL)
    {
        SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());
        return 2;
    }

    /* 创建渲染器 */
    AppSystem.MainRender = SDL_CreateRenderer(AppSystem.MainWindow, -1, SDL_RENDERER_ACCELERATED);
    if (AppSystem.MainRender == NULL)
    {
        SDL_Log("SDL Create Renderer Fail......%s", SDL_GetError());
        return 3;
    }

    /* 创建纹理 */
    AppSystem.MainTexture = SDL_CreateTexture(AppSystem.MainRender, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, TFT_LCD_PHY_XWIDTH, TFT_LCD_PHY_YHEIGHT);
    if (AppSystem.MainTexture == NULL)
    {
        SDL_Log("SDL Create Texture Fail......%s", SDL_GetError());
        return 4;
    }

    /* 设置纹理模式 */
    SDL_SetTextureBlendMode(AppSystem.MainTexture, SDL_BLENDMODE_BLEND);
    memset(TFT_LCD_DIS_MEMORY, 0x99, TFT_LCD_PHY_XWIDTH * TFT_LCD_PHY_YHEIGHT * sizeof(u32));

    SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));
    SDL_RenderClear(AppSystem.MainRender);

    SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);
    SDL_RenderPresent(AppSystem.MainRender);

    return 0;
}


/* 退出SDL */
static void vQuit_SDL2(void)
{
    SDL_Log("Complier Date: %s  %s %d\r\n", __DATE__, __TIME__, ulSuperTimer_GetTick());

    /* 销毁纹理 */
    if (AppSystem.MainTexture != NULL) SDL_DestroyTexture(AppSystem.MainTexture);

    /* 销毁渲染器 */
    if (AppSystem.MainRender != NULL)  SDL_DestroyRenderer(AppSystem.MainRender);

    /* 销毁窗口 */
    if (AppSystem.MainWindow != NULL) SDL_DestroyWindow(AppSystem.MainWindow);

    /* 退出SDL */
    SDL_Quit();
}



二、系统基本Tick、彩屏刷新、按键事件


/* 系统基本Tick */
static void vSystem_BasicTick(void)
{
    static Uint64 oldTick = 0;
    Uint64 curTick = SDL_GetTicks64();
    if (oldTick == curTick) return;

    vSuperTimer_IncTick((u16)(curTick - oldTick));
    oldTick = curTick;
}


/* 屏幕刷新+按键事件处理 */
static void vRefresh_KeyEvent_Handler(void)
{
    static Uint64 oldTick = 0;
    Uint64 curTick  = SDL_GetTicks64();
    SDL_Event event = {0};


    if ((curTick - oldTick) >= 20)
    {
        SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));
        SDL_RenderClear(AppSystem.MainRender);
        SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);
        SDL_RenderPresent(AppSystem.MainRender);
        oldTick = curTick;
    }

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT: AppSystem.ExitWindow = EXIT_WINDOW_TYPE_QUIT; break;

            case SDL_KEYDOWN:
            {
                switch (event.key.keysym.sym)
                {
                    case SDLK_UP:    SDL_Log("SDLK_UP......\r\n");    break;
                    case SDLK_DOWN:  SDL_Log("SDLK_DOWN......\r\n");  break;
                    case SDLK_LEFT:  SDL_Log("SDLK_LEFT......\r\n");  break;
                    case SDLK_RIGHT: SDL_Log("SDLK_RIGHT......\r\n"); break;
                    default: break;
                }
            }
            break;

            default: break;
        }
    }
}



三、彩屏获取与设置颜色


/* 设置颜色 */
void vTFT_LCD_SetColor(u32 x, u32 y, ColorType color)
{
    /* 越界 */
    if (x > (AppDevTFT.xWidth  - 1)) return;
    if (y > (AppDevTFT.yHeight - 1)) return;
    AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
}


/* 获取颜色 */
ColorType xTFT_LCD_GetColor(u32 x, u32 y)
{
    /* 越界 */
    if (x > (AppDevTFT.xWidth  - 1)) return 0;
    if (y > (AppDevTFT.yHeight - 1)) return 0;
    return RGB_DEV(AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x]);
}



四、彩屏填充颜色及清屏


/* 填充矩形(单色) */
void vTFT_LCD_FillRect_SinColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType color)
{
    u32 x = 0, y = 0;

    /* 越界 */
    if (x1 > (AppDevTFT.xWidth  - 1)) return;
    if (y1 > (AppDevTFT.yHeight - 1)) return;

    /* 最大范围 */
    if (x2 > (AppDevTFT.xWidth  - 1)) x2 = (AppDevTFT.xWidth - 1);
    if (y2 > (AppDevTFT.yHeight - 1)) y2 = (AppDevTFT.yHeight - 1);

    /* 填充颜色 */
    for (x = x1; x <= x2; x++)
    {
        for (y = y1; y <= y2; ++y)
        {
            AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
        }
    }
}

/* 填充矩形(多色) */
void vTFT_LCD_FillRect_MultColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType * pColor)
{
    u32 x = 0, y = 0, ex = 0, ey = 0;

    /* 越界 */
    if (x1 > (AppDevTFT.xWidth  - 1)) return;
    if (y1 > (AppDevTFT.yHeight - 1)) return;

    /* 最大范围 */
    ex = (x2 > (AppDevTFT.xWidth  - 1)) ? (AppDevTFT.xWidth  - 1) : x2;
    ey = (y2 > (AppDevTFT.yHeight - 1)) ? (AppDevTFT.yHeight - 1) : y2;
    for (y = y1; y <= ey; y++)
    {
        for (x = x1; x <= ex; ++x)
        {
            AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(*pColor);
        }

        pColor += (x2 - ex);
    }
}


/* 清屏幕 */
void vTFT_LCD_ClearScreen(ColorType color)
{
    u32 x = 0, y = 0;

    for (x = 0; x <= (AppDevTFT.xWidth - 1); x++)
    {
        for (y = 0; y <= (AppDevTFT.yHeight - 1); ++y)
        {
            AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
        }
    }
}



五、彩屏显示中文和英文字符串


/* 获取字符数据源地址 */
static void vGet_CharSrc(u8 chr, u8 charSize, u8 ** pSrc)
{
    switch (charSize)
    {
        case ASCII_FONT_TYPE_1206 : *pSrc = (u8 *)(&ASCII_FONT_1206[chr - ' ']); break;
        case ASCII_FONT_TYPE_1608 : *pSrc = (u8 *)(&ASCII_FONT_1608[chr - ' ']); break;
        case ASCII_FONT_TYPE_2412 : *pSrc = (u8 *)(&ASCII_FONT_2412[chr - ' ']); break;
        default: *pSrc = NULL; break;
    }
}



/* 显示字符 */
static void vTFT_LCD_DisplayChar(u32 x, u32 y, u8 chr, u8 charSize, ColorType backColor, ColorType foreColor)
{
    ColorType color = foreColor;
    u8 charByte = 0, k = 0, i = 0;
    u8 dat = 0, * pSrcDat = NULL;
    u32 y0 = y;


    //获取字符数据源地址
    vGet_CharSrc(chr, charSize, &pSrcDat);
    if (pSrcDat == NULL) return;

    // 字符点阵占用字节数
    charByte = ((charSize >> 3) + ((charSize & 0x07) ? 1 : 0)) * (charSize >> 1);

    // 遍历字符点阵数据
    for(k = 0; k < charByte; ++k)
    {
        dat = pSrcDat[k];
        for(i = 0; i < 8; ++i)
        {
            // 显示有效范围
            if ((x < AppDevTFT.xWidth) && (y < AppDevTFT.yHeight))
            {
                //低位在前
                if ((dat >> i) & 0x01) color = foreColor;
                else                   color = backColor;

                vTFT_LCD_SetColor(x, y, color);
            }

            y++;// 纵坐标自加
            if (XABS2(y , y0) >= charSize)//纵坐标偏移量等于字符点阵高度
            {
                y = y0;
                x++;
                break;
            }
        }
    }
}

/* 显示字符串 */
void vTFT_LCD_DisplayString(u32 x, u32 y, u8 * pStr, u8 strSize, ColorType backColor, ColorType foreColor)
{
    //显示ASCII常规字符
    while ((*pStr >= ' ') && (*pStr <= '~'))
    {
        /* 剩余的横纵小于字体宽度 换行显示 */
        if ((x + (strSize >> 1)) >= AppDevTFT.xWidth)
        {
            y += strSize;
            x  = 0;
        }

        /* 剩余纵轴小于字体高度 */
        // if ((y + strSize) >= AppDevTFT.yHeight)
        if (y >= AppDevTFT.yHeight)
        {
            return;
        }

        vTFT_LCD_DisplayChar(x, y, *pStr, strSize, backColor, foreColor);
        x += (strSize >> 1);
        pStr++;
    }
}





/* 显示中文字符 */
static void vTFT_LCD_Display_ChineseChar(u32 x, u32 y, u32 xWidth, u32 yHeight, const u8 * pData, ColorType backColor, ColorType foreColor)
{
    ColorType color = foreColor;
    u16 k = 0, j = 0, n = 0, i = 0;
    u32 y0 = y, yMax = 0;
    u8 dat = 0;


    yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0); //高度
    y0   = y; //原始纵坐标

    for(k = 0; k < xWidth; k++)
    {
        for(j = 0; j < yMax; j++)
        {
            dat = pData[n++];
            for(i = 0; i < 8; i++)
            {
                if ((y < AppDevTFT.yHeight) && (x < AppDevTFT.xWidth))
                {
                    //低位在前
                    if ((dat >> i) & 0x01) color = foreColor;
                    else                   color = backColor;

                    vTFT_LCD_SetColor(x, y, color);
                }

                y++;//纵坐标处理
                if (XABS2(y , y0) >= yHeight)
                {
                    y = y0;
                    x++;//横坐标处理
                    break;
                }
            }
        }
    }
}

/* 显示中文字符串 */
void vTFT_LCD_Display_ChineseString(u32 x, u32 y, u32 xWidth, u32 yHeight, u8 * pData, u16 num, ColorType backColor, ColorType foreColor)
{
    u16 i = 0;
    u8 charByte = 0;
    u8 * pMem = pData;


    /* 异常 */
    if ((!num) || (pData == NULL)) return;

    // 字符点阵占用字节数
    charByte = ((yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0)) * xWidth;

	for (i = 0; i < num; ++i)
	{
        /* 剩余的横纵小于字体宽度 换行显示 */
        if ((x + xWidth) > AppDevTFT.xWidth)
        {
            y += yHeight;
            x  = 0;
        }

        /* 剩余纵轴小于字体高度 */
        // if ((y + yHeight) >= AppDevTFT.yHeight)
        if (y >= AppDevTFT.yHeight)
        {
            return;
        }

        pMem = pData + (charByte * i);
        vTFT_LCD_Display_ChineseChar(x, y, xWidth, yHeight, pMem, backColor, foreColor);
        x += xWidth;
	}
}





六、彩屏显示数字


static u8 ubGet_EveryBit_Digit(u8 * pDat, u32 num)
{
    u8 i = 0;
    while (1)
    {
        pDat[i++] = num % 10;
        num = num / 10;
        if (!num)
        {
            break;
        }
    }

    u8 temp = 0;
    for (num = 0; num < (i >> 1); ++num)
    {

        temp = pDat[num];
        pDat[num] = pDat[i - num - 1];
        pDat[i - num - 1] = temp;
    }
    return i;
}

/* 显示数字 */
void vTFT_LCD_DisplayNumber(u32 x, u32 y, u32 num, u8 charSize, ColorType backColor, ColorType foreColor)
{
    u8 mem[20] = {0};
    u8 chr = 0, i = 0, len = ubGet_EveryBit_Digit(mem, num);

    for (i = 0; i < len; ++i)
    {
        /* 剩余的横纵小于字体宽度 换行显示 */
        if ((x + (charSize >> 1)) >= AppDevTFT.xWidth)
        {
            y += charSize;
            x  = 0;
        }

        /* 剩余纵轴小于字体高度 */
        // if ((y + charSize) >= AppDevTFT.yHeight)
        if (y >= AppDevTFT.yHeight)
        {
            return;
        }

        chr = mem[i] + 0x30;
        vTFT_LCD_DisplayChar(x, y, chr, charSize, backColor, foreColor);
        x += (charSize >> 1);
    }
}




七、彩屏初始化


/* 初始化TFT */
void vTFT_Init(void)
{
    AppDevTFT.xWidth  = TFT_LCD_PHY_XWIDTH;
    AppDevTFT.yHeight = TFT_LCD_PHY_YHEIGHT;
    AppDevTFT.pDisMem = TFT_LCD_DIS_MEMORY;
    AppDevTFT.BackColor = 0xDCDCDC;
    AppDevTFT.ForeColor = 0xFFFFFF;
    vTFT_LCD_ClearScreen(AppDevTFT.BackColor);

    vTFT_LCD_DisplayString(10,  10, (const u8 *)"Compiler: ", ASCII_FONT_TYPE_1608, 0, 0x00FF00);
    vTFT_LCD_DisplayString(90,  10, (const u8 *)__DATE__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);
    vTFT_LCD_DisplayString(178, 10, (const u8 *)"  ",         ASCII_FONT_TYPE_1608, 0, 0x00FF00);
    vTFT_LCD_DisplayString(194, 10, (const u8 *)__TIME__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);


    vTFT_LCD_DisplayString(10, 50,  (const u8 *)"xDemo TFT1...123ABC~!@#$%^&*()-=", ASCII_FONT_TYPE_1206, 0, 0xFFFF00);
    vTFT_LCD_DisplayString(10, 70,  (const u8 *)"xDemo TFT2...123ABC", ASCII_FONT_TYPE_1608, 0xFFFFFF, 0x0000FF);
    vTFT_LCD_DisplayString(10, 100, (const u8 *)"xDemo TFT3...123ABC", ASCII_FONT_TYPE_2412, 0, 0xF59A23);

    vTFT_LCD_Display_ChineseString(10, 140, 18, 18, (u8 *)&ChineseDemo[1], 9, 0, 0xFF0000);


    vTFT_LCD_DisplayNumber(10, 200, 985, ASCII_FONT_TYPE_2412, 0xDCDCDC, 0xFF0000);
}




八、主函数测试


int main( int argc, char * argv[] )
{
    if (ubInit_SDL2())
    {
        SDL_Log("Init SDL Fail......%s\r\n", SDL_GetError());
        vQuit_SDL2();
        return -1;
    }

    vTFT_Init();
    xSuperTimer_Init();
    AppSystem.ExitWindow = EXIT_WINDOW_TYPE_RUN;


    ubSuperTimer_Start(xDemo, 1000);
    while (AppSystem.ExitWindow)
    {
        vRefresh_KeyEvent_Handler();
        vSystem_BasicTick();
        vSuperTimer_RunHandler();
    }


    vQuit_SDL2();
    return 0;
}



九、测试效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Speech Recognition vs. Voice Recognition | 语音识别工作原理 | 模型训练 | 应用

注&#xff1a;机翻&#xff0c;未校。 Speech Recognition 与 Voice Recognition 剑桥词典 speech recognition&#xff0c;语音识别 voice recognition&#xff0c;声音识别 Speech vs. Voice - What’s the Difference? | This vs. That https://thisvsthat.io/speech-vs…

《Vue3实战教程》35:Vue3测试

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug&#xff0c;并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

【复盘】2024年终总结

工作 重构风控系统 今年上半年其实就是整体重构系统&#xff0c;经历了多次加班的&#xff0c;其中的辛酸苦辣只有自己知道&#xff0c;现在来看的话&#xff0c;其实对自己还有一定的成长&#xff0c;从这件事情上也明白 绩效能不能拿到A&#xff0c;在分配的任务的时候就决…

美食烹饪互动平台

本文结尾处获取源码。 一、相关技术 后端&#xff1a;Java、JavaWeb / Springboot。前端&#xff1a;Vue、HTML / CSS / Javascript 等。数据库&#xff1a;MySQL 二、相关软件&#xff08;列出的软件其一均可运行&#xff09; IDEAEclipseVisual Studio Code(VScode)Navica…

linux-centos-安装miniconda3

参考&#xff1a; 最新保姆级Linux下安装与使用conda&#xff1a;从下载配置到使用全流程_linux conda-CSDN博客 https://blog.csdn.net/qq_51566832/article/details/144113661 Linux上删除Anaconda或Miniconda的步骤_linux 删除anaconda-CSDN博客 https://blog.csdn.net/m0_…

[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)

简介&#xff1a;从20世纪90年代开始&#xff0c;利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高&#xff0c;传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…

工厂模式与抽象工厂模式在Unity中的实际应用案例

一、实验目的 实践工厂模式和抽象工厂模式的实际应用。 创建一个小型的游戏场景&#xff0c;通过应用这些设计模式提升游戏的趣味性和可扩展性。 掌握在复杂场景中管理和使用不同类型的对象。 比较在实际游戏开发中不同设计模式的实际效果和应用场景。 学习如何进行简单的性…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

[Linux]redis5.0.x升级至7.x完整操作流程

1. 从官网下载最新版redis&#xff1a; 官网地址&#xff1a;https://redis.io/download 注&#xff1a;下载需要的登录&#xff0c;如果选择使用github账号登录&#xff0c;那么需要提前在github账号中取消勾选“Keep my email addresses private”&#xff08;隐藏我的邮箱…

android 外挂modem模块实现Telephony相关功能(上网,发短信,打电话)

一.背景 当前模块不支持Telephony相关的功能,例如上网、发短信等功能,就需要外挂另一个模块实现此功能,这就是外挂modem模块实现Telephony功能,此篇主要就是说实现外挂modem模块功能中的Framework层实现逻辑,如下流程是在Android 13中实现的外挂pcie模块的流程 二.ril库相…

倍思氮化镓充电器分享:Super GaN伸缩线快充35W

快节奏的时代,在旅游、办公等场景下,一款高效、便捷的充电器可以让我们的生活更便捷、高效。今天就给大家推荐一款倍思氮化镓充电器——Super GaN伸缩线快充35W。它具备多重亮点,可以满足我们在许多场景下的充电需求,成为我们的得力助手。 倍思氮化镓Super GaN伸缩线快充35W的亮…

若依前后端分离项目部署(使用docker)

文章目录 一、搭建后端1.1 搭建流程&#xff1a;1.2 后端零件:1.2.1 mysql容器创建&#xff1a;1.2.2 redis容器创建&#xff1a;1.2.3 Dockerfile内容&#xff1a;1.2.4 构建项目镜像&#xff1a;1.2.5 创建后端容器&#xff1a; 二、前端搭建&#xff1a;2.1 搭建流程&#x…

STM32驱动NRF24L01

一、NRF24L01的相关介绍 1.2 引脚的介绍 关于SPI的引脚就不再说了&#xff0c;这里介绍其余的两个引脚&#xff1a; CE 模块控制引脚&#xff1a;芯片开启信号&#xff0c;激活RX或TX模式 IRQ 模块中断信号输出引脚&#xff1a;其低电平有效&#xff0c;也就是中断时变为低电平…

OneOS操作系统入门-驱动-03:I2C总线及驱动

一、I2C总线 1.1、I2C总线简介 IIC(Inter-Integrated Circuit) 总线是一种由 PHILIPS 公司开发的两线式串行总线&#xff0c;用于连接微控制器以及其外围设备。它是由数据线 SDA 和时钟线 SCL 构成的串行总线&#xff0c;可发送和接收数据&#xff0c;在 CPU 与被控 IC…

【可实战】Bug的判定标准、分类、优先级、定位方法、提交Bug(包含常见面试题)

一、Bug相关概念 &#xff08;一&#xff09;bug判定标准 &#xff08;二&#xff09;常见 Bug 分类 &#xff08;三&#xff09;bug优先级 1.bug严重程度与优先级的关系 有些很严重的Bug&#xff0c;只在极端的条件下才出现&#xff0c;用户碰到的概率很低&#xff0c;这种情…

nginx学习之路-nginx配置https服务器

文章目录 1. 生成证书2. 配置证书1. 拷贝证书文件2. 修改conf/nginx.conf文件内容 3. 查看效果1. 重载配置2. 访问 1. 生成证书 在linux系统下执行&#xff0c;使用openssl命令。&#xff08;windows环境也可以使用cmder&#xff09; # 1. 生成私钥 server2025.key(无密码保护…

【mybatis】Mybatis整体架构解析

从本篇开始我们开始学习mybatis的系列源码&#xff0c;主要的主题可能就是四个方面 从整体把握mybatis系统架构通过一个查询SQL 源码解析核心流程mybatis的缓存机制-源码级别mybatis的插件机制-源码级别spring是如何整合的mybatis框架的 1.整体架构 上述是mybatis的源码&…

DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义

摘要&#xff1a; 在本文中&#xff0c;我们提出了一种新的端到端模型&#xff0c;称为双鉴别条件生成对抗网络&#xff08;DDcGAN&#xff09;&#xff0c;用于融合不同分辨率的红外和可见光图像。我们的方法建立了一个生成器和两个鉴别器之间的对抗博弈。生成器的目的是基于特…

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令

K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台&#xff1b;我这里是安装的其他开…