[嵌入式系统-35]:RT-Thread -20- 新手指南:在Keil MDK-ARM 模拟器上运行RT-Thread

news2025/1/16 4:48:47

目录

前言:

一、Keil MDK-ARM 模拟器概述

1.1 Keil概述

1.2 Keil MDK-ARM

1.3 Keil MDK-ARM软件仿真模拟器

1.4 Keil模拟器支持的CPU类型

二、Keil MDK ARM安装


前言:

一般嵌入式操作系统因为它的特殊性,往往和硬件平台密切相关连,具体的嵌入式操作系统往往只能在特定的硬件上运行。对于刚接触 RT-Thread 操作系统的读者并不容易马上就获得一个和 RT-Thread 操作系统相配套的硬件模块,但随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行 RT-Thread 操作系统的硬件模块,本文提供的方法是:Keil公司提供的ARM MDK仿真模拟环境。

一、Keil MDK-ARM 模拟器概述

1.1 Keil概述

Keil是一家提供嵌入式系统开发工具的公司,其产品Keil MDK(Microcontroller Development Kit)是专为嵌入式系统开发而设计的集成开发环境(IDE)。

Keil的开发工具主要用于针对各种微控制器和微处理器的软件开发,包括但不限于ARM架构的处理器。

一些Keil MDK的主要特点包括:

  1. 集成开发环境(IDE):Keil MDK提供了一个集成的开发环境,包括代码编辑器、编译器、调试器和仿真器等工具,方便开发人员进行全面的软件开发和调试。

  2. 支持多种微控制器架构:Keil MDK广泛支持多种微控制器架构,包括ARM Cortex-M系列、Cortex-R系列和Cortex-A系列处理器,以及其他常见的微控制器架构。

  3. 优秀的调试功能:Keil MDK提供了强大的调试功能,如单步执行、断点设置、变量监视等,帮助开发人员快速定位和修复代码中的问题。

  4. 模拟器支持:Keil MDK还提供了模拟器工具,可以在没有实际硬件的情况下运行和测试嵌入式代码,便于早期验证和调试。

  5. 支持多种编程语言:Keil MDK支持多种编程语言,如C、C++等,方便开发人员进行软件开发。

总的来说,Keil作为一家专注于嵌入式系统开发工具的公司,其产品Keil MDK在嵌入式软件开发领域有着广泛的应用。通过Keil MDK,开发人员可以高效地进行嵌入式软件开发,加速产品开发周期,提高代码质量,并提供强大的调试和仿真功能。

1.2 Keil MDK-ARM

MDK-ARM(MDK-ARM Microcontroller Development Kit)软件是一套完整的集成开发环境(IDE),它出自 ARM 公司,包括了针对 ARM 芯片(ARM7,ARM9,Cortex-M 系列,Cortex-R 系列等)的高效 C/C++ 编译器;针对各类 ARM 设备、评估板的工程向导,工程管理;用于软件模拟运行硬件平台的模拟器;以及与市面上常见的如 ST-Link,JLink 等在线仿真器相连接以配合调试目标板的调试器。

1.3 Keil MDK-ARM软件仿真模拟器

Keil模拟器是针对Keil MDK(Microcontroller Development Kit)集成开发环境中的嵌入式系统开发而设计的模拟器。Keil MDK是一种流行的开发工具套件,用于开发和调试嵌入式应用程序。

Keil模拟器为开发人员提供了一种仿真环境,用于在没有实际硬件的情况下运行和测试嵌入式代码。通过Keil模拟器,开发人员可以模拟微控制器的行为和功能,以验证代码的正确性和性能,进行调试和功能测试,而无需实际硬件的支持。

使用Keil模拟器的优点包括:

  1. 快速验证:Keil模拟器可以帮助开发人员在开发早期就迅速验证和调试代码。这样可以尽早地发现和解决问题,并加快产品上市时间。

  2. 无需实际硬件:Keil模拟器可以在没有实际硬件的情况下运行和测试代码。这对于硬件准备不足或尚未开发的项目非常有用。

  3. 方便调试:Keil模拟器提供了强大的调试功能,如单步执行、观察和修改变量值、设置断点等。这使得开发人员可以更轻松地调试和定位问题。

  4. 性能仿真:Keil模拟器还提供性能仿真功能,开发人员可以评估代码在模拟器上的执行效率和资源使用情况。

需要注意的是,虽然Keil模拟器可以提供方便的开发环境,但在最终部署产品时,仍然需要通过实际的硬件平台进行验证和测试。模拟器只是开发过程中的一个工具,供开发人员在早期进行快速开发和测试使用。

MDK-ARM 软件中的软件仿真模拟器,采用完全软件模拟方式解释执行 ARM 的机器指令,并实现外围的一些外设逻辑,从而构成一套完整的虚拟硬件环境,使得用户能够不借助真实的硬件平台就能够在电脑上执行相应的目标程序。

MDK-ARM 集成开发环境因为其完全的 STM32F103 软件仿真环境,也让我们有机会在不使用真实硬件环境的情况下直接在电脑上运行目标代码。这套软件仿真模拟器能够完整地虚拟出 ARM Cortex-M3 的各种运行模式、外设,如中断异常,时钟定时器,串口等这几乎和真实的硬件环境完全一致实践也证明,本文使用到的这份 RT-Thread 入门例程,在编译成二进制代码后,不仅能够在模拟器上软件模拟运行,也能够不需要修改地在真实硬件平台上正常运行

1.4 Keil模拟器支持的CPU类型

Keil模拟器广泛支持多种CPU类型,包括但不限于以下几种:

  1. ARM Cortex-M系列:Keil模拟器对ARM Cortex-M系列微控制器提供了广泛的支持,包括 Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4、Cortex-M7 等。

  2. ARM Cortex-R系列:Keil模拟器也支持ARM Cortex-R系列微控制器,如 Cortex-R4、Cortex-R5 等。

  3. ARM Cortex-A系列:部分Keil模拟器还支持ARM Cortex-A系列应用处理器,如 Cortex-A5、Cortex-A9、Cortex-A53、Cortex-A57 等。

  4. 其他微控制器架构:Keil模拟器还支持其他常见的微控制器架构,如8051、C16x、C251 等。

请注意,Keil模拟器的具体支持范围可能会随着版本的更新而有所变化。建议在使用Keil模拟器之前,根据所需的CPU类型和型号,查看Keil官方文档或支持列表,以获取最新的支持信息。这样可以确保选择的CPU类型在Keil模拟器中得到有效支持,以获得最佳的仿真体验。

下面我们将选择 MDK-ARM 集成开发环境作为目标硬件平台来观察 RT-Thread 操作系统是如何运行的。

二、Keil MDK ARM安装

(1)MDK 开发环境:

需要安装 MDK-ARM 5.24 (正式版或评估版,5.14 版本及以上版本均可),这个版本也是当前比较新的版本,它能够提供相对比较完善的调试功能。安装方法可以参考 Keil MDK安装。

在运行 RT-Thread 操作系统前,我们需要安装 MDK-ARM 5.24(正式版或评估版,5.14 版本及以上版本均可),这个版本也是当前比较新的版本,它能够提供相对比较完善的调试功能。

这里采用了 16K 编译代码限制的评估版 5.24 版本(免费),如果要解除 16K 编译代码限制,请购买 MDK-ARM 正式版。

先从 www.keil.com 官方网站下载 MDK-ARM 评估版: Keil Downloads

在下载时,需要填一些个人基本信息,请填写相应的完整信息,然后开始下载。下载完成后,鼠标双击运行.

(2)STM32F103 pack安装

使用 STM32F103 软件仿真 ,还需要下载安装 STM32F103 pack 文件,如果在 MDK 中下载较慢,也可以点击此处下载,下载后双击安装即可。

三、RT-Thread的Keil MDK工程

3.1 下载RT-Thread的Keil MDK工程文件

作为一个操作系统,RT-Thread 的代码规模怎么样呢?

在弄清楚这些之前,我们先要做的就是获得与本文相对应的 RT-Thread 的例子(Keil MDK工程),这份例子可以从以下链接获得:

RT-Thread Simulator 例程

3.2 解压后的RT-Thread文件与目录结构(只包含RTT操作系统相关的源文件)

这个例子是一个压缩包文件,将它解压,我们这里解压到 D:/。

解压完成后的目录结构如下图所示:

rtthread_simulator_v0.1.0 代码目录

各个目录所包含的文件类型的描述如下表所示:

目录名描述
applicationsRT-Thread 应用程序。
rt-threadRT-Thread 的源文件。
- componentsRT-Thread 的各个中间件组件目录
- includeRT-Thread 内核的头文件。
- libcpu各类芯片的移植代码,此处包含了 STM32 的移植文件。
- srcRT-Thread 内核的源文件。
- toolsRT-Thread 命令构建工具的脚本文件
driversRT-Thread 的驱动,不同平台的底层驱动具体实现。
LibrariesST 的 STM32 固件库文件。
kernel-sample-0.1.0RT-Thread 的内核例程。

3.3 MDK5工程文件目录(包括MDK ARM开发工具自带的程序)

在目录下,有一个 project.uvprojx 文件,它是本文内容所引述的例程中的一个 MDK5 工程文件,双击 “project.uvprojx” 图标,打开此工程文件:

打开第一个 RT-Thread 工程

在工程主窗口的左侧 Project 栏里可以看到该工程的文件列表,这些文件被分别存放到如下几个组内,分别是:

目录组描述
Applications对应的目录为 rtthread_simulator_v0.1.0/applications,它用于存放用户应用代码。
Drivers对应的目录为 rtthread_simulator_v0.1.0/drivers,它用于存放 RT-Thread 底层的驱动代码。
STM32_HAL对应的目录为 rtthread_simulator_v0.1.0/Libraries/CMSIS/Device/ST/STM32F1xx,它用于存放 STM32 的固件库文件。
kernel-sample对应的目录为 rtthread_simulator_v0.1.0/kernel-sample-0.1.0,它用于存放 RT-Thread 的内核例程。
Kernel对应的目录为 rtthread_simulator_v0.1.0/rt-thread/src,它用于存放 RT-Thread 内核核心代码。
CORTEX-M3对应的目录为 rtthread_simulator_v0.1.0/rt-thread/libcpu,它用于存放 ARM Cortex-M3 移植代码。
DeviceDrivers对应的目录为 rtthread_simulator_v0.1.0/rt-thread/components/drivers,它用于存放 RT-Thread 驱动框架源码。
finsh对应的目录为 rtthread_simulator_v0.1.0/rt-thread/components/finsh,它用于存放 RT-Thread 命令行 finsh 命令行组件。

3.4 编译工程代码

现在我们点击一下窗口上方工具栏中的按钮

img

,对该工程进行编译,如图所示:

编译工程

编译的结果显示在窗口下方的 “Build” 栏中,没什么意外的话,最后一行会显示“0 Error(s), * Warning(s).”,即无任何错误和警告。 注:由于新版本的编译器已经升级为6,当前的例子编译器版本是5,所以编译会报出很多错误,这里要去补下载compiler 5,这里有传送门 提取码: iRob 注:由于工程中包含的内核例程代码较多,若使用的是 MDK 试用版本,则会有 16KB 限制,此时可以只保留某个目标例程的代码(例如内核例程只保留一个 thread_sample.c 参与编译),将其他不用的例程先从工程中移除,然后编译。

在编译完 RT-Thread/STM32 后,我们可以通过 MDK-ARM 的模拟器来仿真运行 RT-Thread。点击窗口右上方的按钮

img

或直接按 “Ctrl+F5” 进入仿真界面,再按 F5 开始运行,然后点击该图工具栏中的按钮或者选择菜单栏中的 “View→Serial Windows→UART#1”,打开串口 1 窗口,可以看到串口的输出只显示了 RT-Thread 的 LOGO,这是因为用户代码是空的,其模拟运行的结果如图所示:

模拟运行 RT-Thread

提示:我们可以通过输入Tab键或者 help + 回车  输出当前系统所支持的所有命令,如下图所示。

模拟运行 RT-Thread

3.5 系统启动代码

一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中

系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,

然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,

最后进入用户程序入口 main()。

下面我们来看看在 components.c 中定义的这段代码:

//components.c 中定义
/* re-define main function */
int $Sub$$main(void)
{
    rt_hw_interrupt_disable();
    rtthread_startup();
    return 0;
}复制错误复制成功

在这里 $Sub$$main 函数仅仅调用了 rtthread_startup() 函数。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一入口点,所以 $Sub$$main 函数只需调用 rtthread_startup() 函数即可。例如采用 GNU GCC 编译器编译的 RT-Thread,就是直接从汇编启动代码部分跳转到 rtthread_startup() 函数中,并开始第一个 C 代码的执行的。在 components.c 的代码中找到 rtthread_startup() 函数,我们将可以看到 RT-Thread 的启动流程:

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();

    /* board level initalization
     * NOTE: please initialize heap inside board initialization.
     */
    rt_hw_board_init();

    /* show RT-Thread version */
    rt_show_version();

    /* timer system initialization */
    rt_system_timer_init();

    /* scheduler system initialization */
    rt_system_scheduler_init();

#ifdef RT_USING_SIGNALS
    /* signal system initialization */
    rt_system_signal_init();
#endif

    /* create init_thread */
    rt_application_init();

    /* timer thread initialization */
    rt_system_timer_thread_init();

    /* idle thread initialization */
    rt_thread_idle_init();

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return 0;
}复制错误复制成功

这部分启动代码,大致可以分为四个部分

  • 初始化与系统相关的硬件;

  • 初始化系统内核对象,例如定时器,调度器;

  • 初始化系统设备,这个主要是为 RT-Thread 的设备框架做的初始化;

  • 初始化各个应用线程,并启动调度器。

用户入口代码

上面的启动代码基本上可以说都是和 RT-Thread 系统相关的,那么用户如何加入自己的应用程序的初始化代码呢?RT-Thread 将 main 函数作为了用户代码入口,只需要在 main 函数里添加自己的代码即可。

int main(void)
{
  /* user app entry */
  return 0;
}复制错误复制成功

提示:
为了在进入 main 程序之前,完成系统功能初始化,可以使用 $sub$$ 和 $super$$ 函数标识符在进入主程序之前调用另外一个例程,这样可以让用户不用去管 main() 之前的系统初始化操作。详见ARM® Compiler v5.06 for µVision® armlink User Guide

跑马灯的例子

对于从事电子方面开发的技术工程师来说,跑马灯大概是最简单的例子,就类似于每种编程语言中程序员接触的第一个程序 Hello World 一样,所以这个例子就从跑马灯开始。让它定时地对 LED 进行更新(亮或灭)。

我们 UART#1 中输入 msh 命令:led 然后回车就可以运行起来了,如图所示:

模拟运行跑马灯

跑马灯例子

/*
 * 程序清单:跑马灯例程
 *
 * 跑马灯大概是最简单的例子,就类似于每种编程语言中程序员接触的第一个程序
 * Hello World 一样,所以这个例子就从跑马灯开始。创建一个线程,让它定时地对
 * LED 进行更新(亮或灭)
 */

int led(void)
{
    rt_uint8_t count;

    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);

    for(count = 0 ; count < 10 ;count++)
    {
        rt_pin_write(LED_PIN, PIN_HIGH);
        rt_kprintf("led on, count : %d\r\n", count);
        rt_thread_mdelay(500);

        rt_pin_write(LED_PIN, PIN_LOW);
        rt_kprintf("led off\r\n");
        rt_thread_mdelay(500);
    }
    return 0;
}
MSH_CMD_EXPORT(led, RT-Thread first led sample);复制错误复制成功

其他例子

其他更多的内核示例可以从 kernel-sample-0.1.0 目录下找到。

更多内核示例

常见问题

(1)出现如下编译错误

rt-thread\src\kservice.c(823): error: #929: incorrect use of vaarg fieldwidth = aarg(args, int);
rt-thread\src\kservice.c(842): error: #929: incorrect use of vaarg precision = aarg(args, int);
………复制错误复制成功

原因:这类问题基本上都是因为安装了 ADS 导致,ADS 与 keil共存,va_start 所在的头文件指向了 ADS 的文件夹。

解决办法:

  • 删除 ADS 环境变量
  • 卸载 ADS 和 keil,重启电脑,重装keil

(2)uses ARM-Compiler 'Default Compiler Version 5' which is not available

现在官网上没有v5的版本了,keil默认安装的是v6的版本,如果工程想要运行以前的工程,可以设置将工程的编辑器从v5转到v6,下面是方法:

1.使用MDK打开工程。

2.选择 Project - Options for Target from the menu。

3.点击 Target 选项卡,找到 ARM Compiler: 下拉列表。

4.设置为 Version 6 。

就完成了

(3) kernel-sample-0.1.0/signal_sample.c(67): error: use of undeclared identifier 'SIGUSR1'

这个错误提示表明在 ‘kernel-sample-0.1.0’ 目录下的 ‘signal_sample.c’ 文件中,第 66 行使用了一个未声明的标识符 ‘SIGUSR1’。

要解决这个问题,您可以尝试以下几个步骤:

  1. 包含正确的头文件:确保在 ‘signal_sample.c’ 文件的开头正确地包含了相关的头文件,例如 <signal.h>该头文件通常包含了信号的定义。

  2. 检查标识符的声明:确认 ‘SIGUSR1’ 标识符在代码中的其他地方有没有被正确声明。如果没有,您可能需要手动添加它的声明。可以在合适的位置添加如下代码来声明该标识符:

    extern const int SIGUSR1;
    
  3. 检查编译选项和宏定义:有时,编译选项或宏定义可能会影响标识符的可见性。确保编译选项和宏定义没有屏蔽或修改了对 ‘SIGUSR1’ 的可见性。

  4. 确认平台的支持:某些操作系统或平台可能不支持 ‘SIGUSR1’ 信号,或者该信号的定义可能有所不同。在这种情况下,您需要查询相关的文档或参考示例代码,以了解平台上正确的信号定义和使用方法。

通过逐步检查这些步骤,您应该能够找到导致 ‘SIGUSR1’ 标识符未声明的原因,并相应地修复该问题。

第三方 RTOS 兼容层

为方便之前有其他 RTOS 使用经验的用户快速上手 RT-Thread,以及将基于其他 RTOS 的 API 编写的应用层代码快速移植到 RT-Thread 上,RT-Thread 社区编写了第三方 RTOS 兼容层。目前支持以下第三方 RTOS 的 API 无感移植:

  • uCOS-II操作系统兼容层
  • uCOS-III操作系统兼容层

以上第三方 RTOS 兼容层均提供本章所述的STM32F103 Keil 软件模拟工程,以供入门者可以不依托开发板评估兼容层。

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

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

相关文章

【C++精简版回顾】12.友元函数

1.友元函数 1.class class MM { public:MM(int age,string name):age(age),name(name){}friend void print(MM mm); private:int age;string name;void print() {cout << age << "岁的" << name << "喜欢你" << endl;} }; f…

DAY31--learning English

一、积累 1.stiff 2.curve 3.pungent 4.mellow 5.marinate 6.drain 7.corrupt 8.magnet 9.liver 10.stew 11.maid 12.sonogram 13.folk 14.anecdote 15.altar 16.spaghetti 17.ammunition 18.shield 19.beacon 20.hanger 二、练习 1.牛津原译 stiff /stɪf/ ( stiffer stiff…

编程的基础:理解时间和空间复杂度

编程的基础&#xff1a;理解时间和空间复杂度 时间复杂度空间复杂度示例常数时间复杂度 O(1)线性时间复杂度 O(n)线性对数时间复杂度 O(n log n)二次时间复杂度 O(n^2)指数时间复杂度 O(2^n) 空间复杂度示例常数空间复杂度 O(1)线性空间复杂度 O(n)线性对数空间复杂度 O(log n)…

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

获取tensorflow lite模型指定中间层的输出

以mobilenet v2为例子&#xff0c;我已经训练好了模型&#xff0c;有tflite格式和onnx格式两种模型的权重文件&#xff0c;我想获取tflite模型在推理阶段neck部分的输出。 查看onnx模型得到neck最后一层位置 使用netron查看onnx模型结构 从name中能知道Reshape是neck的最后一…

【蓝桥杯】拓扑排序

一.拓扑排序 1.定义&#xff1a; 设G&#xff08;V&#xff0c;E&#xff09;是一个具有n个顶点的有向图&#xff0c;V中的顶点序列称为一个拓扑序列&#xff0c;当且仅当满足下列条件&#xff1a;若从顶点到有一条路径&#xff0c;则在顶点序列中顶点必在之前。 2.基本思想…

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…

社交媒体变革者:剖析Facebook对在线互动的贡献

随着数字化时代的蓬勃发展&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。在这个领域的发展中&#xff0c;Facebook作为先行者和领导者&#xff0c;对在线互动的演变和发展产生了深远的影响。本文将深入剖析Facebook在社交媒体领域的贡献&#xff0c;以及它对在…

✅鉴权—cookie、session、token、jwt、单点登录

基于 HTTP 的前端鉴权背景cookie 为什么是最方便的存储方案&#xff0c;有哪些操作 cookie 的方式session 方案是如何实现的&#xff0c;存在哪些问题token 是如何实现的&#xff0c;如何进行编码和防篡改&#xff1f;jwt 是做什么的&#xff1f;refresh token 的实现和意义ses…

探索水下低光照图像检测性能,基于YOLOv6全系列【n/s/m/l】参数模型开发构建海底生物检测识别分析系统

底这类特殊数据场景下的检测模型开发相对来说比较少&#xff0c;在前面的博文中也有一些涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 试探索水下目标检测&#xff0c;基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBAM注意力…

查看笔记本电池健康状态-windows11

在 Windows 11 中获取详细的电池报告 Windows 11 中内置的 Powerfg 命令行选项来生成电池报告。 在任务栏上选择“搜索”&#xff0c;键入“cmd”&#xff0c;长按&#xff08;或右键单击&#xff09;“命令提示符”&#xff0c;然后选择“以管理员身份运行” ->“是”。 …

springboot215基于springboot技术的美食烹饪互动平台的设计与实现

美食烹饪互动平台的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统美食信息管理难度大&…

【电子书】数据库

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 数据库 ClickHouse原理解析与应用实践.epubECharts数据可视化&#xff1a;入门、实战与进阶.epubHAWQ数据仓库与数据挖掘实战.epubHBase不睡觉书.epubHBase原理与实践.epubMySQL 5.7从零开始学&…

主机开了电脑显示无视频输入怎么办 电脑显示无视频输入的解决方法

照理来说&#xff0c;我们开机之后电脑显示器就会进入工作状态&#xff0c;然后进入桌面&#xff0c;但最近由用户反映自己在开机之后显示无视频输入的字样&#xff0c;很是疑惑&#xff0c;那么电脑显示无视频输入怎么办?今天小编就专门给大家来讲一讲主机开了电脑显示无视频…

接口自动化测试用例如何设计

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…

Python文件和异常(二)

目录 三、异常 &#xff08;一&#xff09;处理 ZeroDivisionError 异常 &#xff08;二&#xff09;使用 try-except 代码块 &#xff08;三&#xff09;使用异常避免崩溃 &#xff08;四&#xff09;else 代码块 &#xff08;五&#xff09;处理 FileNotFoundError 异常…

基于相位的运动放大:如何检测和放大难以察觉的运动(02/2)

目录 一、说明二、算法三、准备处理四、高斯核五、带通滤波器六、复杂的可操纵金字塔七、最终预处理步骤八、执行处理九、金字塔的倒塌十、可视化结果十一、结论 一、说明 日常物体会产生人眼无法察觉的微妙运动。在视频中&#xff0c;这些运动的幅度小于一个像素&#xff0c;…

【电子书】系统_网络_运维

资料 wx&#xff1a;1945423050 整理了一些互联网电子书&#xff0c;推荐给大家 系统_网络_运维 4G无线网络原理及优化.epubHyperledger Fabric 技术内幕&#xff1a;架构设计与实现原理.epubJSP应用与开发技术&#xff08;第3版&#xff09;.epubKali Linux 2网络渗透测试实…

前后端分离Vue+node.js在线学习考试系统gqw7o

与其它应用程序相比&#xff0c;在线学习平台的设计主要面向于学校&#xff0c;旨在为管理员和学生、教师、院系提供一个在线学习平台。学生、教师、院系可以通过系统及时查看公告信息等。 在线学习平台是在Windows操作系统下的应用平台。为防止出现兼容性及稳定性问题&#xf…

深入理解指针2

各位小伙伴们&#xff0c;我们继续来学习指针&#xff0c;指针和结构体以及动态内存管理对后面的数据结构学习有非常大的帮助&#xff0c;所有我们一定要把这些知识点学会。OK,正式进入学习之旅吧 1.数组名的理解 在上⼀个章节我们在使⽤指针访问数组的内容时&#xff0c;有这…