精华内容
下载资源
问答
  • 任务管理器显示系统中断
    千次阅读
    2019-06-05 18:04:55

     Windows任务管理器参数解释


     

    一、概述及菜单

      任务管理器提供正在您的计算上运行的程序和进程的相关信息。也显示最常用的度量进程性能的单位。

    使用任务管理器可以监视计算机性能的关键指示器。可以查看正在运行的程序的状态,并终止已停止响应的程序。也可以使用多达 15个参数评估正在运行的进程的活动,查看反映 CPU 和内存使用情况的图形和数据。

      此外,如果与网络连接,则可以查看网络状态,了解网络的运行情况。

      如果有多个用户连接到您的计算机,您可以看到谁在连接、他们在做什么,还可以给他们发送消息。

    1,更改任务管理器中的显示选项

    单击与要更改的显示选项对应的选项卡。单击: “应用程序”选项卡,可以查看详细信息、大图标或小图标。 “进程”选项卡,可以选择要显示的列。 “性能”选项卡,可以更改 CPU 使用记录曲线图以及显示内核时间。 “网络”选项卡,可以查看有关网络连接的信息。在“查看”菜单上单击所需的命令。

    注意

    要显示内核时间以便在“CPU 使用”和“CPU使用记录”曲线图中添加红线,请单击“性能”选项卡。在“查看”菜单上单击“显示内核时间”。红线指示内核操作占用的 CPU资源数量。

    2,更新任务管理器数据

    在“查看”菜单上,单击“立即刷新”。

    注意

    要更改数据自动更新的频率,请在“查看”菜单上指向“更新速度”,然后单击所需的命令。 要暂时固定“任务管理器”中显示的数据,请在“查看”菜单上指向“更新速度”,然后单击“暂停”。 默认情况下,每隔两秒钟会对数据自动更新一次。

     

    二、“应用程序”选项卡显示计算机上正在运行的程序的状态。在此选项卡中,您能够结束、切换或者启动程序。

    1,启动新程序

    单击“应用程序”选项卡中的“新任务”。 在“打开”框中键入或选择要添加程序的名称,然后单击“确定”。

    注意

    “新任务”相当于“开始”菜单中的“运行”命令。 如果不知道要添加程序的名称,请单击“浏览”搜索该程序。

    2,切换到另一个程序

    在 “应用程序”选项卡上,单击要切换到的程序,然后单击“切换至”。

    3,更改正在运行的程序的优先级

    在 “进程”选项卡上,用右键单击要更改的程序,指向“设置优先级”,然后单击所需的命令。

    注意

    要查看正在运行的程序的优先级,请在“进程”选项卡上,单击“查看”菜单上的“选择列”。在“选择列”对话框中,选中“基本优先级”,然后单击“确定”。 更改进程的优先级可以使其运行更快或更慢(取决于是提升还是降低了优先级),但也可能对其他进程的性能有相反的影响。

    4,使用任务管理器终止程序

    在“应用程序”选项卡上,单击要终止的程序,然后单击“结束任务”。

    注意

    该程序中任何未保存的输入数据或所作更改均将丢失。 如果使用“结束任务”不能立即结束该程序,则可以单击要终止的程序,然后单击“转到进程”,在进程选项卡上进行操作。

     

    三、“进程”选项卡显示关于计算机上正在运行的进程的信息。例如,您可以显示关于 CPU和内存使用情况、页面错误、句柄计数以及许多其他参数的信息。

    1,进程计数器列标题

    在“进程”选项卡上,可以使用下列计数器监视正在运行的进程,这些计数器可以显示为列标题。要将某个进程显示为列标题,请在“查看”菜单上单击“选择列”。选中与要显示为列标题的进程对应的复选框。

    基本优先级

      决定处理器处理进程线程的顺序的优先级。可以使用“任务管理器”查看和更改基本优先级。

      对于“消息队列”,则是指定队列在公共队列中的优先级的属性。您可以将基本优先级设置成从 -32,768 到32,767;默认的优先级是0。专用队列不支持基本优先级。“消息队列”首先根据基本优先级路由和传递消息,然后根据消息优先级路由和传递消息。

    CPU 时间

      在“任务管理器”中,进程从启动起使用的总处理器时间,以秒为单位。

    CPU 使用情况

      在“任务管理器”中,进程从上一次更新以来使用 CPU的时间百分比。在“任务管理器”的“进程”选项卡上,列标题是“CPU”。

    GDI 对象

      来自应用程序编程接口 (API) 的“图形设备接口”(GDI)库的对象,用于图形输出设备。在“任务管理器”中,指进程当前使用的 GDI 对象数。

    句柄数

      在“任务管理器”中,进程对象表中的对象句柄。(句柄:在用户界面中,指添加到某个对象的界面,便于操作移动、调整大小、调整形状或其他属于对象的功能。在程序设计中,指的是指针到指针,也就是,允许某个程序访问所识别的资源的标记。)

    图像名

      在“任务管理器”中的进程名称,即“映像名称”。

    I/O 其他

      在“任务管理器”中,由进程产生的非读非写的输入/输出操作的数量,这包括文件、网络和设备I/O。该操作类型的范例是控制函数。指向 CONSOLE (控制台输入对象)句柄的“其他类型的 I/O”不计算在内。

    I/O 其他字节

      在“任务管理器”中,由进程产生的非读非写的输入/输出操作中所传输的字节数,这包括文件、网络和设备I/O。该操作类型的范例是控制函数。定向到 CONSOLE (控制台输入对象)句柄的“其他类型的 I/O字节”不计算在内。

    I/O 读取

      在“任务管理器”中,由进程产生的读的输入/输出操作的数量,这包括文件、网络和设备I/O 。该操作类型的范例是控制函数。定向到CONSOLE (控制台输入对象)句柄的“I/O 读操作”不计算在内。

    I/O 读字节

      在“任务管理器”中,由进程产生的输入/输出操作中的读取的字节数,这包括文件、网络和设备I/O。该操作类型的范例是控制函数。定向到 CONSOLE (控制台输入对象)句柄的“I/O 读取字节”不计算在内。

    I/O 写入

      在“任务管理器”中,由进程产生的写的输入/输出操作的数量,这包括文件、网络和设备I/O 。该操作类型的范例是控制函数。定向到CONSOLE (控制台输入对象)句柄的“I/O 写操作”不计算在内。

    I/O 写字节

      在“任务管理器”中,由进程产生的输入/输出操作中的写入的字节数,这包括文件、网络和设备I/O。该操作类型的范例是控制函数。定向到 CONSOLE (控制台输入对象)句柄的“I/O 写入字节”不计算在内。

    内存使用情况

      在“任务管理器”中,进程的当前工作集,以千字节为单位。当前工作集是当前驻留在内存中的页面数。在“任务管理器进程”选项卡中,列标题是“内存使用”。

    内存使用 Delta

      在“任务管理器”中,自上一次更新以来所使用的内存的改变量,以千字节为单位。

    非分页池

      永远不会页入磁盘的操作系统内存。页面调度就是将很少使用的程序工作内存部分从 RAM移到其他存储媒体,通常是硬盘。在“任务管理器”中,进程使用的内存量以 KB 为单位。

    页面错误

      当软件试图读取或写入标记为“不存在”的虚拟内存位置时发生的中断。

      在“任务管理器”中,页面错误是进程中当数据不在内存而必须从磁盘检索的次数。页面错误值从进程启动的时间开始累计。

    页面错误增量

      在“任务管理器”中,自上一次更新开始的页面错误次数的变化。

    分页池

      已指派给进程的,已及可以分页的系统分配的虚拟内存。页面调度就是将很少使用的程序工作内存部分从 RAM移到其他存储媒体,通常是硬盘。在“任务管理器”中,进程使用的系统分配虚拟内存数量以 KB 为单位。

    峰值内存使用率

      在“任务管理器”中,自进程启动以来驻留于进程中的物理内存的峰值。

    PID(进程标识符)

      唯一区分运行时的进程的数字标识符。使用“任务管理器”可以查看 PID。

    会话 ID

      拥有该进程的“终端服务”会话 ID 。只有安装了“终端服务”计数器才可以使用计数器。

    线程计数

      在“任务管理器”中,在进程中运行的线程数。

    用户名

      使 Windows标识用户帐户的唯一名称。帐户的用户名在其自身所在的域或工作组中的其他组名和用户名之中必须是唯一的。(用户:包含在服务器上的有用户权限的所有用户的特殊组。当Macintosh 用户将权限分配给每个人时,这些权限也将分配给组的用户和来宾。 )

    USER 对象

      “Window管理器”对象,包括窗口、菜单、光标、图标、异常分支、加速器、监视器、键盘布局和其他内部对象。在“任务管理器”中,指进程当前使用的USER 对象数。

    虚拟内存大小

      在“任务管理器”中,指分配给进程的虚拟内存数或地址空间。

      (虚拟内存:计算机使用的临时存储器,用来运行所需内存大于计算机具有的内存的程序。例如,程序可以访问计算机硬盘驱动器上 4GB 字节的虚拟内存,即使计算机只有 32 MB 的 RAM。当前没有装入计算机内存的程序数据将保存到页面文件中。)

      (页面文件:硬盘上的隐藏文件,Windows 用该文件来存储不能装入内存的程序和数据文件部分。页面文件和物理内存或 RAM构成虚拟内存。需要时,Windows将数据从页面文件移至内存,然后将数据从内存移至页面文件以便为新数据腾出空间。页面文件也被称为交换文件。 )

     

    2,指定进程计数器列标题

    在“进程”选项卡的“查看”菜单上,单击“选择列”。 选中与要显示为列标题的进程计数器对应的复选框,然后单击“确定”。

    注意

    有关进程计数器的详细信息,请单击“相关主题”。

    3,对进程列表排序

    在 “进程”选项卡上,单击您要根据其进行排序的列标题。

    注意

    要反转排序顺序,请再次单击列标题。 

    4,使用任务管理器终止进程

    在“进程”选项卡,单击要结束的进程,然后单击“结束进程”。

    要点

    终止进程时要小心。如果结束应用程序,您将丢失未保存的数据。如果结束系统服务,则系统的某些部分可能无法正常工作。

    注意

    若要结束某个进程以及由它直接或间接创建的所有进程,右键单击“进程”选项卡上要结束的进程,然后单击“结束进程树”。

    如果终止了电子邮件程序(如 Microsoft Outlook)的进程树,也就同时终止了相关的进程,如 MAPI 后台处理程序mapisp32.exe。

    5,给处理器指派进程

    在 “进程”选项卡上,用右键单击要指派的程序,单击“设置仿射性”,然后单击一个或多个处理器。

    注意

    “设置仿射性”命令仅在多处理器计算机上可用。 使用“设置仿射性”命令可以将程序或进程的执行限制在选定的处理器上,并且可能导致总体性能下降。

     

    四、“性能”选项卡显示计算机性能的动态概述,其中包括:

    CPU 和内存使用情况的图表。 计算机上正在运行的句柄、线程和进程的总数。 物理、核心和认可的内存总数(KB)。

    说明:查看计算机性能

    单击“性能”选项卡。

    注意

    “性能”选项卡显示有关计算机性能的信息,如 CPU 和各种内存的使用情况。 有关“性能”选项卡上显示的字段的详细信息,请单击“相关主题”。

    1,CPU 使用情况

    表明处理器工作时间百分比的图表。该计数器是处理器活动的主要指示器。查看该图表可以知道您当前使用的处理时间是多少。如果您的计算机看起来运行较慢,该图表就会显示较高的百分比。

    2,CPU 使用记录

    显示 CPU的使用程度随时间的变化情况的图表。图表中显示的采样情况取决于“查看”菜单上您选择的“更新速度”值。更新的几个可能值为: = 每秒两次;正常 = 每两秒一次; = 每四秒一次;暂停 =显示器不自动更新。

    3,PF 使用情况

    正被系统使用的页面文件的量。如果计算机运行接近最大限度,可以增大页面文件的大小。

    4,页面文件使用记录

    显示页面文件的量随时间的变化情况的图表。图表中显示的采样情况取决于“查看”菜单上您选择的“更新速度”值。

    5,总数

    计算机上正在运行的句柄、线程和进程的总数。

    6,执行内存 (K)

    分配给程序和操作系统的内存。由于复制到页面文件的内存(称为虚拟内存)的存在,“峰值”下所列的值可以超过最大物理内存。“总数”的值与“页面文件使用记录”图表中显示的值相同。

    7,物理内存 (K)

    计算机上所安装的总物理内存,也称为RAM。“可用”表示可供使用的内存的量。“系统缓存”显示当前用于映射打开的文件的页面的物理内存。

    8,内核内存 (K)

    操作系统内核和设备驱动程序所使用的内存。“分页”是可以复制到页面文件中的内存,由此可以释放物理内存。然后,物理内存可以由操作系统使用。“非分页”是保留在物理内存中的内存,不会复制到页面文件中。

     

    五、“网络”选项卡显示网络性能的图形表示。它提供了简单、定性的指示器,以显示正在您的计算机上运行的网络的状态。只有当网卡存在时,才会显示“网络”选项卡。

      在该选项卡上,可以查看网络连接的质量和可用性,无论是连接到一个还是多个网络上。

    说明:查看网络连接

    单击“网络”选项卡。

    注意

    只有当网卡存在时,才会显示“网络”选项卡。 “网络”选项卡指明与本地计算机接通的连接的网络流量。详细信息,请单击“相关主题”。

      “网络”选项卡提供有关本地计算机所连接的网络通信量的指示。通过参考它,可以很快决定正被消耗的网络带宽量。使用多个网络连接时,通过选项卡该可以轻松地比较每个连接的通信量。

      如果您的计算机上有多个网卡,则图表就会显示包含所有网络的复合索引,以表明所有网络通信量。

      为了在所有接口的网络通信量图表中都显示可见线条,视图会自动进行缩放,以放大通信量与可见带宽的关系视图。这样,在通信量低的情况下,图表的全高可以仅表示可用带宽的5%。当通信量高于该级别时,缩放程度将会减小,以便以较低的放大率显示当前通信量视图(例如,显示总可用带宽的10%)。图表上显示的百分比越大,通信量(相对于可用带宽)的放大率就越小。缩放系数显示在图表上。要禁用缩放功能,请在“选项”菜单上单击“自动缩放”以切换缩放系数的值。

      此外,还可以更改显示在图表下面的列标题。这些标题如下表所述。

    网卡名称是“网络连接”文件夹中网络适配器的名称。适配器描述 适配器的有关描述,通常与网络连接文件夹中的设备名称相同。网络利用 网络利用百分比,基于接口的初始连接速度。链接速度 源自初始连接速度的接口连接速度。发送字节吞吐量 在轮询时间周期内从计算机发出的通信量所使用连接带宽百分比。接收字节吞吐量 在轮询时间周期内计算机接收的通信量所使用连接带宽百分比。字节吞吐量 在轮询时间周期内发送和接收的通信量所使用连接带宽百分比。发送的字节数 到目前为止该连接上所发送的总字节数。累计,可以重置。接收的字节数 到目前为止该连接上所接收的总字节数。累计,可以重置。字节总数 到目前为止该连接上发送和接收的总字节数。累计,可以重置。发送的字节数/间隔 在轮询时间周期内该连接上所发送的总字节数。接收的字节数/间隔 在轮询时间周期内该连接上所接收的总字节数。字节数/间隔 在轮询时间间隔内该连接上发送和接收的总字节数。发送的单播数 更高级别的协议请求传送到单播地址的总字节数。该值中包括已被丢弃或未被发送的数据包。接收的单播数 更高级别的协议请求从单播地址接收的总字节数。单播数 到目前为止“发送的单播数”和“接收的单播数”的总计。发送的单播数/间隔 在轮询时间间隔内通过该连接由更高级别的协议请求传送到子网单播地址的总字节数。接收的单播数/间隔 在轮询时间间隔内通过该连接从子网单播地址传送到更高级别协议的总字节数。单播数/间隔 在轮询时间间隔内该连接的“发送的单播数”和“接收的单播数”的总计。发送的非单播数 到目前为止通过该连接由更高级别的协议请求传送到非子网单播地址的总字节数。接收的非单播数 到目前为止通过该连接从非子网单播地址传送到更高级别协议的总字节数。非单播数 到目前为止“发送的非单播数”和“接收的非单播数”的总计。发送的非单播数/间隔 在轮询时间间隔内通过该连接由更高级别的协议请求传送到非子网单播地址的总字节数。接收的非单播数/间隔 在轮询时间间隔内通过该连接从非子网单播地址传送到更高级别协议的总字节数。非单播数/间隔 在轮询时间间隔内“发送的非单播数”和“接收的非单播数”的总计。

     

    六、“用户”选项卡显示可以访问该计算机的用户,以及会话的状态与名称。“客户端名称”指定使用该会话的客户机的名称(如果有的话)。“会话”为您提供一个用来执行诸如向另一个用户发送消息、或连接到另一个用户会话这类任务的名称。

      只有在您所用的计算机启用了“快速用户切换”功能,并且作为工作组成员或独立的计算机时,才出现“用户”选项卡。对于作为网络域成员的计算机,“用户”选项卡不可用。

    说明:查看用户活动

    单击“用户”选项卡。

    注意

    如果启用“快速用户切换”,则会显示“用户”选项卡。有关“快速用户切换”的详细信息,请单击“相关主题”。 只有当所用计算机是工作组成员或独立计算机时,“快速用户切换”才可用。在属于网络域的计算机上,“快速用户切换”不可用。

      “用户”选项卡上的每个字段的说明如下。详细信息,请单击下列某项:

    1,用户

    显示登录该计算机的用户。

    2,ID

    显示该标识该计算机上的会话的数字 ID。

    3,状态

    显示会话的当前状态。“任务管理器”中的可能会话状态有“正在运行”和“已断开”。

    4,客户端名称

    如果有的话,指定使用会话的客户机的名称。

    5,会话

    显示该计算机上的会话名称

     

    更多相关内容
  • 原文:7 Fixes to System Interrupts High CPU Usage in Windows 10 什么是系统中断? 为什么系统中断使用这么多 CPU? 是病毒吗? 如果您使用 Windows10 操作系统,并且...您可以在任务管理器中发现它显示为一个进程

    原文:7 Fixes to System Interrupts High CPU Usage in Windows 10

    什么是系统中断? 为什么系统中断使用这么多 CPU? 是病毒吗? 如果您使用 Windows10 操作系统,并且遇到过系统中断CPU占用率高的问题,那么这篇文章不容错过。

    What Causes System Interrupts High CPU Usage

    系统中断是 Windows 操作系统的官方组成部分,它管理计算机硬件和系统之间的通信。您可以在任务管理器中发现它显示为一个进程,显示所有硬件中断的 CPU 使用率。

    系统中断就像 CPU 的警报系统。如果某个场景需要 CPU 关注,系统中断会提醒处理器高优先级条件。然后CPU暂停它正在做的事情,保存它,并处理重要的工作。一旦工作完成,它就会恢复到原来的状态。

    当有很多中断时,意味着在硬件层面可能会发生一些错误,这就是它们开始占用大量资源的原因。

    通常,系统中断占用 CPU 的 0.1% 和 2%。有时它会上升到 7%,这也被认为是正常的。但是,您有时可能会看到系统中断 100 CPU 使用率。这是比较危险的。如果系统中断占用了你的CPU的10%以上,你应该注意它,因为它表明发生了硬件错误。

    那么如何修复系统中断高 CPU Windows 10/8/7?首先,您可以尝试重新启动 PC。有时重新启动可以解决问题。如果这不起作用,您可以尝试以下已被许多用户实践的有效修复。

    方法1:Update Hardware Driver

    如果您遇到系统中断高 CPU 使用率问题,故障硬件驱动程序可能是罪魁祸首。 您可以按照以下步骤更新您的设备驱动程序。

    步骤 1. 右键单击 Windows 开始菜单并从弹出菜单中选择设置。

    步骤 2. 从窗口中选择更新和安全。

    步骤 3. 找到“Windows 更新”部分。 然后检查是否有任何可用的硬件驱动程序更新。 如果是,请单击下一步更新所有这些驱动。

    方法2. 禁用网络适配器

    网卡有权限在传输数据时唤醒您的计算机,这可能会导致 CPU 使用率过高,因为在此过程中会产生大量中断。 因此要停止系统中断高 CPU,您可以禁用该功能。

    这是教程。

    步骤 1. 右键单击 Windows 开始菜单并从菜单中选择设备管理器。或者,您可以按键盘上的 Windows 徽标键和 R 键调出运行对话框,然后输入 devmgmt.msc 并按 Enter 键以打开设备管理器。

    步骤 2. 展开网络适配器对话框。

    第 3 步。然后右键单击您的网络适配器并选择属性。

    步骤 4. 切换到高级选项卡。 然后在属性下,向下滚动以找到 Wake on Magic Packet 和 Wake on pattern match。

    步骤5.从下拉菜单中将其值一一设置为禁用。

    同时,我的设备管理器里,WAN Miniport(IPv6) 我也将其禁用了,因为觉得用不着。

    还有这个 NVIDIA USE Type-C Port Policy Controller, 在我的设备管理器里有黄色惊叹号,我也将其禁用了。

    方法3:禁用 Windows10 快速启动

    步骤 1. 在 Windows 10 Cortana 搜索框中键入 Control。 然后单击最匹配的控制面板将其打开。

    步骤 2. 在控制面板中,单击电源选项。

    步骤 4. 选择选项更改当前不可用的设置。这需要管理权限。

    步骤 5. 在屏幕底部,取消选中打开快速启动旁边的框。

    方法4:禁用鼠标唤醒电脑功能

    在设备管理器里找到鼠标,右键选择属性,电源管理 - Power management,将 Allow this device to wake the computer 前面的勾去掉,即不要让鼠标唤醒休眠中的电脑。

    笔者尝试了这四个方法之后,Windows10 system interrupt 系统中断 CPU 占用率高的问题得以解决,希望对大家有帮助。

    更多Jerry的原创文章,尽在:“汪子熙”:

    展开全文
  • 虚拟机启动任务管理器

    千次阅读 2021-08-12 02:06:09
    虚拟机启动任务管理器 内容精选换一换远程登录服务器出现蓝屏或黑屏,可能是由于explorer.exe进程异常导致的桌面无法显示。这是由于Windows服务器的explorer.exe进程异常导致的。explorer.exe是Windows程序管理...

    虚拟机启动任务管理器 内容精选

    换一换

    c8a5a5028d2cabfeeee0907ef5119e7e.png

    远程登录服务器出现蓝屏或黑屏,可能是由于explorer.exe进程异常导致的桌面无法显示。这是由于Windows服务器的explorer.exe进程异常导致的。explorer.exe是Windows程序管理器或者文件资源管理器,它用于管理Windows图形壳,包括桌面和文件管理,删除该程序会导致Windows图形界面无法使用。打开云服

    为了保证使用生成的镜像创建的新云服务器可以实现一键式重置密码功能,建议您安装密码重置插件CloudResetPwdAgent,可以应用一键式重置密码功能,给云服务器设置新密码。下载一键式重置密码插件CloudResetPwdAgent和CloudResetPwdUpdateAgent。下载并解压软件包CloudResetPwdAgent.

    虚拟机启动任务管理器 相关内容

    Windows系统启动Agent后,SMS控制台显示校验失败,提示“SMS.6533 源端的镜像服务VSS不存在”。出现该问题主要有以下两个原因:源端VSS服务不存在。源端VSS服务被禁止启动。在任务管理器中查看VSS服务是否存在,若不存在,请执行2,若存在,请执行3。查看VSS服务是否存在修改配置文件,不启动IO监控。如果不需要同步数据

    本地使用远程桌面连接登录Windows server 2012云服务器,报错:122.112...,服务器频繁掉线,Windows登录进程意外中断。系统资源不足或不可用。服务启动失败。通过VNC方式登录云服务器。单击打开服务管理,选择“管理工具 > 事件查看器 > Windows日志 > 系统 > 筛选当前日志”。事件查看器在“事件级别”

    虚拟机启动任务管理器 更多内容

    293f5c3a9815ee95e4ed79a7f04b8f18.png

    为了保证使用镜像创建的裸金属服务器可以实现一键式密码重置功能,建议您在制作镜像时安装重置密码插件“Cloud-reset-pwd Agent”。需保证虚拟机C盘可写入,且剩余空间大于600MB。安装一键式重置密码插件对插件的具体放置目录无特殊要求,请您自定义。下载地址:https://cn-south-1-cloud-reset-pwd.

    5eb5094525ac38c82d2a8e7d84950748.png

    远程连接Windows弹性云服务器后,不能复制、粘贴内容,右键单击菜单栏,“粘贴”选项置灰。未进行本地驱动器映射。服务器rdpclip.exe进程异常。系统禁止云服务器和本地主机之间进行文件的复制粘贴功能。未进行本地驱动器映射,图1以使用本地的C盘、D盘映射为例。在运行窗口输入“mstsc”回车打开“远程桌面连接”。选择“本地资源”页签,

    b139ef593fb8558052cf7d856d8ac3a5.png

    当您发现云服务器的运行速度变慢或云服务器突然出现网络断开的情况,则可能是云服务器的带宽和CPU利用率过高导致。如果您已经通过云监控服务创建过告警任务,当CPU或带宽利用率高时,系统会自动发送告警给您。Windows云服务器带宽流量过高或CPU利用率高,您可以按如下步骤进行排查:问题定位:定位影响云服务器带宽和CPU利用率高的进程。Wind

    b5693ff7a1d6bd5360d83fe2bfafdfb3.png

    主机迁移服务所提供的接口为SMS接口。通过使用SMS接口,您可以完整的使用主机迁移服务的所有功能,包括查询源端服务器列表、创建迁移任务和查看迁移进度等。

    0a0ca88b94963916c79cc35f28e2f501.png

    当您发现云服务器的运行速度变慢或云服务器突然出现网络断开的情况,则可能是云服务器的带宽和CPU利用率过高导致。如果您已经通过云监控服务创建过告警任务,当CPU或带宽利用率高时,系统会自动发送告警给您。Windows云服务器带宽流量过高或CPU利用率高,您可以按如下步骤进行排查:问题定位:定位影响云服务器带宽和CPU利用率高的进程。Wind

    ea3d514774dda107c847f333927c833f.png

    当您发现云服务器的运行速度变慢或云服务器实例突然出现网络断开的情况,则可能是云服务器的带宽和CPU利用率过高导致。如果您已经通过云监控服务完成创建过告警任务,当CPU或带宽利用率高时,系统会自动发送告警给您。Windows云服务器带宽流量过高或CPU利用率高,您可以按如下步骤进行排查:问题定位:定位影响云服务器带宽和CPU利用率高的进程。

    9bf196c9a2e0b7b0bc69748c838418a5.png

    主机迁移服务是一种P2V/V2V迁移服务,可以帮您把X86物理服务器或者私有云、公有云平台上的虚拟机迁移到华为云弹性云服务器上,从而帮助您轻松地把服务器上的应用和数据迁移到华为云。主机迁移服务的工作原理如下,其中第1步、第3步和第7步需要用户操作,其余步骤由主机迁移服务自动完成。用户在源端服务器上安装迁移Agent。源端服务器上的迁移Ag

    ef7fa0a88cabe2097a016125d8d62832.png

    主机迁移服务是一种P2V/V2V迁移服务,可以帮您把X86物理服务器或者私有云、公有云平台上的虚拟机迁移到华为云弹性云服务器上,从而帮助您轻松地把服务器上的应用和数据迁移到华为云。主机迁移服务的工作原理如下,其中第1步、第3步和第7步需要用户操作,其余步骤由主机迁移服务自动完成。用户在源端服务器上安装迁移Agent。源端服务器上的迁移Ag

    9548b768b78243d473da1b2758db3f2b.png

    华为云主机迁移服务帮助中心,为用户提供产品简介、快速入门、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用主机迁移服务。

    628a76026f26a9b0192a8fa75416b71f.png

    oVirt Engine是运行在基于JBoss的Java应用程序。该服务与主机上的VDSM进行通信,以部署、启动、停止、迁移和监控VM,并且还可以通过模板在存储上创建新的镜像。oVirt Engine以可扩展性、安全性、高性能为基础的架构技术,为大规模服务器和桌面虚拟化提供集中式管理。oVirt提供的具体功能如下:虚拟机生命周期管理网络管

    0b0fd50cfcc497558515f132e9f0a09e.png

    针对Windows 2012操作系统,由于安装应用系统会用到.net framework 3.5,而2012自带的.net framework 4.5版本需要卸载,但是卸载之后可能会遇到黑屏、无法进入系统桌面的问题,只能调出任务管理器。卸载.net framework 4.5后,系统由完整模式Full变为了核心模式Core,没有启用系统桌

    展开全文
  • FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。 FreeRTOS 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,...

    一、FreeRTOS简介

    FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。

    FreeRTOS 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS 结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。

    最新版本 V9.0.0(2016年),尽管现在 FreeRTOS 的版本已经更新到 V10.4.1 了,但是我们还是选择 V9.0.0,因为内核很稳定,并且网上资料很多,因为 V10.0.0 版本之后是亚马逊收购了FreeRTOS之后才出来的版本,主要添加了一些云端组件,一般采用 V9.0.0 版本足以。

    二、新建工程

    1. 打开 STM32CubeMX 软件,点击“新建工程”

    2. 选择 MCU 和封装

    3. 配置时钟
    RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

    选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
    修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置

    4. 配置调试模式
    非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
    SYS 设置,选择 Debug 为 Serial Wire

    三、SYS Timebase Source

    System Core 中选择 SYS ,对 Timebase Source 进行设置,选择 TIM1 作为HAL库的时基(除了 SysTick 外都可以)。

    在基于STM32 HAL的项目中,一般需要维护的 “时基” 主要有2个:

    1. HAL的时基,SYS Timebase Source
    2. OS的时基(仅在使用OS的情况下才考虑)

    而这些 “时基” 该去如何维护,主要分为两种情况考虑:

    • 裸机运行
      可以通过 SysTick(滴答定时器)或 (TIMx)定时器 的方式来维护 SYS Timebase Source,也就是HAL库中的 uwTick,这是HAL库中维护的一个全局变量。在裸机运行的情况下,我们一般选择默认的 SysTick(滴答定时器) 方式即可,也就是直接放在 SysTick_Handler() 中断服务函数中来维护。

    • 带OS运行
      前面提到的 SYS Timebase Source 是STM32的HAL库中的新增部分,主要用于实现 HAL_Delay() 以及作为各种 timeout 的时钟基准。

      在使用了OS(操作系统)之后,OS的运行也需要一个时钟基准(简称“时基”),来对任务和时间等进行管理。而OS的这个 时基 一般也都是通过 SysTick(滴答定时器) 来维护的,这时就需要考虑 “HAL的时基” 和 “OS的时基” 是否要共用 SysTick(滴答定时器) 了。

      如果共用SysTick,当我们在CubeMX中选择启用FreeRTOS之后,在生成代码时,CubeMX一定会报如下提示:

    强烈建议用户在使用FreeRTOS的时候,不要使用 SysTick(滴答定时器)作为 “HAL的时基”,因为FreeRTOS要用,最好是要换一个!!!如果共用,潜在一定风险。

    四、FreeRTOS

    4.1 参数配置

    Middleware 中选择 FREERTOS 设置,并选择 CMSIS_V1 接口版本


    CMSIS是一种接口标准,目的是屏蔽软硬件差异以提高软件的兼容性。RTOS v1使得软件能够在不同的实时操作系统下运行(屏蔽不同RTOS提供的API的差别),而RTOS v2则是拓展了RTOS v1,兼容更多的CPU架构和实时操作系统。因此我们在使用时可以根据实际情况选择,如果学习过程中使用STM32F1、F4等单片机时没必要选择RTOS v2,更高的兼容性背后时更加冗余的代码,理解起来比较困难。

    Config parameters 进行具体参数配置。

    Kernel settings:

    • USE_PREEMPTION: Enabled:RTOS使用抢占式调度器;Disabled:RTOS使用协作式调度器(时间片)。
    • TICK_RATE_HZ: 值设置为1000,即周期就是1ms。RTOS系统节拍中断的频率,单位为HZ。
    • MAX_PRIORITIES: 可使用的最大优先级数量。设置好以后任务就可以使用从0到(MAX_PRIORITIES - 1)的优先级,其中0位最低优先级,(MAX_PRIORITIES - 1)为最高优先级。
    • MINIMAL_STACK_SIZE: 设置空闲任务的最小任务堆栈大小,以字为单位,而不是字节。如该值设置为128 Words,那么真正的堆栈大小就是 128*4 = 512 Byte。
    • MAX_TASK_NAME_LEN: 设置任务名最大长度。
    • IDLE_SHOULD_YIELD: Enabled 空闲任务放弃CPU使用权给其他同优先级的用户任务。
    • USE_MUTEXES: 为1时使用互斥信号量,相关的API函数会被编译。
    • USE_RECURSIVE_MUTEXES: 为1时使用递归互斥信号量,相关的API函数会被编译。
    • USE_COUNTING_SEMAPHORES: 为1时启用计数型信号量, 相关的API函数会被编译。
    • QUEUE_REGISTRY_SIZE: 设置可以注册的队列和信号量的最大数量,在使用内核调试器查看信号量和队列的时候需要设置此宏,而且要先将消息队列和信号量进行注册,只有注册了的队列和信号量才会在内核调试器中看到,如果不使用内核调试器的话次宏设置为0即可。
    • USE_APPLICATION_TASK_TAG: 为1时可以使用vTaskSetApplicationTaskTag函数。
    • ENABLE_BACKWARD_COMPATIBILITY: 为1时可以使V8.0.0之前的FreeRTOS用户代码直接升级到V8.0.0之后,而不需要做任何修改。
    • USE_PORT_OPTIMISED_TASK_SELECTION: FreeRTOS有两种方法来选择下一个要运行的任务,一个是通用的方法,另外一个是特殊的方法,也就是硬件方法,使用MCU自带的硬件指令来实现。STM32有计算前导零指令吗,所以这里强制置1。
    • USE_TICKLESS_IDLE: 置1:使能低功耗tickless模式;置0:保持系统节拍(tick)中断一直运行。假设开启低功耗的话可能会导致下载出现问题,因为程序在睡眠中,可用ISP下载办法解决。
    • USE_TASK_NOTIFICATIONS: 为1时使用任务通知功能,相关的API函数会被编译。开启了此功能,每个任务会多消耗8个字节。
    • RECORD_STACK_HIGH_ADDRESS: 为1时栈开始地址会被保存到每个任务的TCB中(假如栈是向下生长的)。

    Memory management settings:

    • Memory Allocation: Dynamic/Static 支持动态/静态内存申请
    • TOTAL_HEAP_SIZE: 设置堆大小,如果使用了动态内存管理,FreeRTOS在创建 task, queue, mutex, software timer or semaphore的时候就会使用heap_x.c(x为1~5)中的内存申请函数来申请内存。这些内存就是从堆ucHeap[configTOTAL_HEAP_SIZE]中申请的。
    • Memory Management scheme: 内存管理策略 heap_4

    Hook function related definitions:

    • USE_IDLE_HOOK: 置1:使用空闲钩子(Idle Hook类似于回调函数);置0:忽略空闲钩子。
    • USE_TICK_HOOK: 置1:使用时间片钩子(Tick Hook);置0:忽略时间片钩子。
    • USE_MALLOC_FAILED_HOOK: 使用内存申请失败钩子函数。
    • CHECK_FOR_STACK_OVERFLOW: 大于0时启用堆栈溢出检测功能,如果使用此功能用户必须提供一个栈溢出钩子函数,如果使用的话此值可以为1或者2,因为有两种栈溢出检测方法。

    Run time and task stats gathering related definitions:

    • GENERATE_RUN_TIME_STATS: 启用运行时间统计功能。
    • USE_TRACE_FACILITY: 启用可视化跟踪调试。
    • USE_STATS_FORMATTING_FUNCTIONS: 与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数prvWriteNameToBuffer()、vTaskList()、vTaskGetRunTimeStats()。

    Co-routine related definitions:

    • USE_CO_ROUTINES: 启用协程。
    • MAX_CO_ROUTINE_PRIORITIES: 协程的有效优先级数目。

    Software timer definitions:

    • USE_TIMERS: 启用软件定时器。

    Interrupt nesting behaviour configuration:

    • LIBRARY_LOWEST_INTERRUPT_PRIORITY: 中断最低优先级。
    • LIBRARY_LOWEST_INTERRUPT_PRIORITY: 系统可管理的最高中断优先级。

    4.2 创建任务Task

    Tasks and Queues 进行配置。

    默认空闲任务是在系统无其它任务执行时执行。

    然后我们创建两个LED任务。

    • Task Name: 任务名称
    • Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级
    • Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入512那么任务大小为512*4字节
    • Entry Function: 入口函数
    • Code Generation Option: 代码生成选项
    • Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可
    • Allocation: 分配方式:Dynamic 动态内存创建
    • Buffer Name: 缓冲区名称
    • Conrol Block Name: 控制块名称

    五、LED

    5.1 参数配置

    System Core 中选择 GPIO 设置。

    在右边图中找到 LED 灯对应引脚,选择 GPIO_Output

    GPIO output level 中选择 Low 输出低电平点亮,可以添加自定义标签(这样生成代码也会根据标签设置引脚的宏定义)。

    六、UART串口打印

    查看 STM32CubeMX学习笔记(6)——USART串口使用

    七、生成代码

    输入项目名和项目路径

    选择应用的 IDE 开发环境 MDK-ARM V5

    每个外设生成独立的 ’.c/.h’ 文件
    不勾:所有初始化代码都生成在 main.c
    勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

    点击 GENERATE CODE 生成代码

    八、任务创建与启动

    8.1 相关API说明

    8.1.1 osThreadId

    任务ID。例如,对osThreadCreate的调用返回。可用作参数到osThreadTerminate以删除任务。

    /// Thread ID identifies the thread (pointer to a thread control block).
    /// \note CAN BE CHANGED: \b os_thread_cb is implementation specific in every CMSIS-RTOS.
    typedef TaskHandle_t osThreadId;
    

    8.1.2 osThreadCreate

    使用动态/静态内存的方法创建一个任务。

    函数osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
    参数thread_def: 引用由osThreadDef定义的任务

    argument: 任务入口函数形参
    返回值成功返回任务ID,失败返回0

    8.1.3 osThreadTerminate

    删除任务。任务被删除后就不复存在,也不会再进入运行态。

    函数osStatus osThreadTerminate (osThreadId thread_id)
    参数thread_id: 被删除任务的ID
    返回值错误码

    要想使用该函数必须在 Include parameters 中把 vTaskDelete 选择 Enabled 来使能。

    8.1.4 osKernelStart

    在创建完任务的时候,我们需要开启调度器,因为创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函数 osKernelStart() 中实现的。为什么要空闲任务?因为 FreeRTOS 一旦启动,就必须要保证系统中每时每刻都有一个任务处于运行态(Runing),并且空闲任务不可以被挂起与删除,空闲任务的优先级是最低的,以便系统中其他任务能随时抢占空闲任务的 CPU 使用权。

    函数osStatus osKernelStart (void)
    参数
    返回值错误码

    8.2 示例

    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "cmsis_os.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include <stdio.h>
    #include <string.h>
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    UART_HandleTypeDef huart1;
    DMA_HandleTypeDef hdma_usart1_rx;
    DMA_HandleTypeDef hdma_usart1_tx;
    
    /****************** 任务句柄 ******************/
    /* 
     * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
     * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
     * 这个句柄可以为NULL。
     */
     /* 空闲任务句柄 */
    osThreadId defaultTaskHandle;
    /* LED1 任务句柄 */ 
    osThreadId LED1Handle;
    /* LED2 任务句柄 */ 
    osThreadId LED2Handle;
    /* USER CODE BEGIN PV */
    
    /* USER CODE END PV */
    
    /*
    *************************************************************************
    * 函数声明
    *************************************************************************
    */
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_DMA_Init(void);
    static void MX_USART1_UART_Init(void);
    void StartDefaultTask(void const * argument);
    void LED1_Task(void const * argument);  /* LED1_Task 任务实现 */ 
    void LED2_Task(void const * argument);  /* LED2_Task 任务实现 */
    
    /* USER CODE BEGIN PFP */
    
    /* USER CODE END PFP */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    /* USER CODE END 0 */
    
    /**
      * @brief  The application entry point.
      * @retval int
      */
    int main(void)
    {
      /* USER CODE BEGIN 1 */
    
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_DMA_Init();
      MX_USART1_UART_Init();
      /* USER CODE BEGIN 2 */
    
      /* USER CODE END 2 */
    
      /* USER CODE BEGIN RTOS_MUTEX */
      /* add mutexes, ... */
      /* USER CODE END RTOS_MUTEX */
    
      /* USER CODE BEGIN RTOS_SEMAPHORES */
      /* add semaphores, ... */
      /* USER CODE END RTOS_SEMAPHORES */
    
      /* USER CODE BEGIN RTOS_TIMERS */
      /* start timers, add new ones, ... */
      /* USER CODE END RTOS_TIMERS */
    
      /* USER CODE BEGIN RTOS_QUEUES */
      /* add queues, ... */
      /* USER CODE END RTOS_QUEUES */
    
      /* 创建任务 */
      /* Create the thread(s) */
      /* definition and creation of defaultTask */
      osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
      defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
    
      /* definition and creation of LED1 */
      osThreadDef(LED1, LED1_Task, osPriorityIdle, 0, 128);
      LED1Handle = osThreadCreate(osThread(LED1), NULL);
    
      /* definition and creation of LED2 */
      osThreadDef(LED2, LED2_Task, osPriorityIdle, 0, 128);
      LED2Handle = osThreadCreate(osThread(LED2), NULL);
    
      /* USER CODE BEGIN RTOS_THREADS */
      /* add threads, ... */
      /* USER CODE END RTOS_THREADS */
    
      /* 启动任务调度 */
      /* Start scheduler */
      osKernelStart();  /* 启动任务,开启调度 */
    
      /* We should never get here as control is now taken by the scheduler */
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      /** Initializes the RCC Oscillators according to the specified parameters
      * in the RCC_OscInitTypeDef structure.
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
      RCC_OscInitStruct.HSEState = RCC_HSE_ON;
      RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
      RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
      /** Initializes the CPU, AHB and APB buses clocks
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /**
      * @brief USART1 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_USART1_UART_Init(void)
    {
    
      /* USER CODE BEGIN USART1_Init 0 */
    
      /* USER CODE END USART1_Init 0 */
    
      /* USER CODE BEGIN USART1_Init 1 */
    
      /* USER CODE END USART1_Init 1 */
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN USART1_Init 2 */
    
      /* USER CODE END USART1_Init 2 */
    
    }
    
    /**
      * Enable DMA controller clock
      */
    static void MX_DMA_Init(void)
    {
    
      /* DMA controller clock enable */
      __HAL_RCC_DMA1_CLK_ENABLE();
    
      /* DMA interrupt init */
      /* DMA1_Channel4_IRQn interrupt configuration */
      HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 5, 0);
      HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
      /* DMA1_Channel5_IRQn interrupt configuration */
      HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 5, 0);
      HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
    
    }
    
    /**
      * @brief GPIO Initialization Function
      * @param None
      * @retval None
      */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOB_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin|LED_R_Pin, GPIO_PIN_SET);
    
      /*Configure GPIO pins : LED_G_Pin LED_B_Pin LED_R_Pin */
      GPIO_InitStruct.Pin = LED_G_Pin|LED_B_Pin|LED_R_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    }
    
    /* USER CODE BEGIN 4 */
    /**
      * @brief 重定向c库函数printf到USARTx
      * @retval None
      */
    int fputc(int ch, FILE *f)
    {
      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
      return ch;
    }
     
    /**
      * @brief 重定向c库函数getchar,scanf到USARTx
      * @retval None
      */
    int fgetc(FILE *f)
    {
      uint8_t ch = 0;
      HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
      return ch;
    }
    /* USER CODE END 4 */
    
    /* USER CODE BEGIN Header_StartDefaultTask */
    /**
      * @brief  Function implementing the defaultTask thread.
      * @param  argument: Not used
      * @retval None
      */
    /* USER CODE END Header_StartDefaultTask */
    void StartDefaultTask(void const * argument)
    {
      /* USER CODE BEGIN 5 */
      /* Infinite loop */
      for(;;)
      {
        osDelay(1);
      }
      /* USER CODE END 5 */
    }
    
    /* USER CODE BEGIN Header_LED1_Task */
    /**
    * @brief Function implementing the LED1 thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_LED1_Task */
    void LED1_Task(void const * argument)
    {
      /* USER CODE BEGIN LED1_Task */
      /* Infinite loop */
      for(;;)
      {
        HAL_GPIO_TogglePin(GPIOB, LED_G_Pin);
        printf("LED1_Task\n");
        osDelay(1000);  /* 延时 1000 个 tick */ 
      }
      /* USER CODE END LED1_Task */
    }
    
    /* USER CODE BEGIN Header_LED2_Task */
    /**
    * @brief Function implementing the LED2 thread.
    * @param argument: Not used
    * @retval None
    */
    /* USER CODE END Header_LED2_Task */
    void LED2_Task(void const * argument)
    {
      /* USER CODE BEGIN LED2_Task */
      /* Infinite loop */
      for(;;)
      {
        HAL_GPIO_TogglePin(GPIOB, LED_B_Pin);
        printf("LED2_Task\n");
        osDelay(500);   /* 延时 500 个 tick */ 
      }
      /* USER CODE END LED2_Task */
    }
    
    /**
      * @brief  Period elapsed callback in non blocking mode
      * @note   This function is called  when TIM1 interrupt took place, inside
      * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
      * a global variable "uwTick" used as application time base.
      * @param  htim : TIM handle
      * @retval None
      */
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
      /* USER CODE BEGIN Callback 0 */
    
      /* USER CODE END Callback 0 */
      if (htim->Instance == TIM1) {
        HAL_IncTick();
      }
      /* USER CODE BEGIN Callback 1 */
    
      /* USER CODE END Callback 1 */
    }
    
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
    
      /* USER CODE END Error_Handler_Debug */
    }
    
    #ifdef  USE_FULL_ASSERT
    /**
      * @brief  Reports the name of the source file and the source line number
      *         where the assert_param error has occurred.
      * @param  file: pointer to the source file name
      * @param  line: assert_param error line source number
      * @retval None
      */
    void assert_failed(uint8_t *file, uint32_t line)
    {
      /* USER CODE BEGIN 6 */
      /* User can add his own implementation to report the file name and line number,
         tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
      /* USER CODE END 6 */
    }
    #endif /* USE_FULL_ASSERT */
    

    8.3 工程代码

    链接:https://pan.baidu.com/s/1hcYRL-bKEKX8i_s0vnGW0g 提取码:ax4a

    九、任务延时

    9.1 相关API说明

    9.1.1 osDelay

    相对延时函数。用于阻塞延时,调用该函数后,任务将进入阻塞状态,进入阻塞态的任务将让出 CPU 资源。

    函数osStatus osDelay (uint32_t millisec)
    参数millisec: 毫秒数
    返回值错误码

    要想使用该函数必须在 Include parameters 中把 vTaskDelay 选择 Enabled 来使能。

    9.1.2 osThreadTerminate

    绝对延时函数。常用于较精确的周期运行任务,比如我有一个任务,希望它以固定频率定期执行,而不受外部的影响,任务从上一次运行开始到下一次运行开始的时间间隔是绝对的,而不是相对的。

    函数osStatus osDelayUntil (uint32_t *PreviousWakeTime, uint32_t millisec)
    参数PreviousWakeTime: 任务上一次离开阻塞态(被唤醒)的时刻。这个时刻被用作一个参考点来计算该任务下一次离开阻塞态的时刻

    millisec: 毫秒数
    返回值错误码

    要想使用该函数必须在 Include parameters 中把 vTaskDelayUntil 选择 Enabled 来使能。

    9.2 示例

    9.2.1 相对延时

    void vTaskA( void * pvParameters )
    {
        while (1) 
        {
            // ...
            // 这里为任务主体代码
            // ...
    
            /* 调用相对延时函数,阻塞 1000 个 tick */ 
            osDelay( 1000 ); 
        }
    }
    

    9.2.2 绝对延时

    注意:在使用的时候要将延时时间转化为系统节拍,在任务主体之前要调用延时函数。

    void vTaskA( void * pvParameters ) 
    {
        /* 用于保存上次时间。调用后系统自动更新 */ 
        static portTickType PreviousWakeTime; 
        /* 设置延时时间,将时间转为节拍数 */ 
        const portTickType TimeIncrement = pdMS_TO_TICKS(1000); 
    
        /* 获取当前系统时间 */ 
        PreviousWakeTime = osKernelSysTick();
    
        while (1)
        {
            /* 调用绝对延时函数,任务时间间隔为 1000 个 tick */ 
            osDelayUntil( &PreviousWakeTime,TimeIncrement ); 
     
            // ...
            // 这里为任务主体代码 
            // ...
     
        }
    }
    

    十、任务挂起与恢复

    10.1 相关API说明

    10.1.1 osThreadSuspend

    挂起指定任务。被挂起的任务绝不会得到 CPU 的使用权,不管该任务具有什么优先级。

    函数osStatus osThreadSuspend (osThreadId thread_id)
    参数thread_id: 挂起指定任务的任务ID
    返回值错误码

    要想使用该函数必须在 Include parameters 中把 vTaskSuspend 选择 Enabled 来使能。

    10.1.2 osThreadSuspendAll

    将所有的任务都挂起。

    函数osStatus osThreadSuspendAll (void)
    参数
    返回值错误码

    10.1.3 osThreadResume

    让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。如果被恢复任务在所有就绪态任务中,处于最高优先级列表的第一位,那么系统将进行任务上下文的切换。

    函数osStatus osThreadResume (osThreadId thread_id)
    参数thread_id: 挂起指定任务的任务ID
    返回值错误码

    10.1.4 osThreadResume

    让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。如果被恢复任务在所有就绪态任务中,处于最高优先级列表的第一位,那么系统将进行任务上下文的切换。可用在中断服务程序中。

    函数osStatus osThreadResume (osThreadId thread_id)
    参数thread_id: 挂起指定任务的任务ID
    返回值错误码

    要想在中断服务程序中使用该函数必须在 Include parameters 中把 vTaskResumeFromISR 选择 Enabled 来使能。

    10.1.5 osThreadResumeAll

    将所有的任务都恢复。

    函数osStatus osThreadResumeAll (void)
    参数
    返回值错误码

    10.2 示例

    10.2.1 挂起

    /**************************** 任务句柄 ********************************/
    /*
    * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
    * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
    * 这个句柄可以为 NULL。
    */
    osThreadId LED1Handle;/* LED 任务句柄 */ 
    
    static void KEY_Task(void* parameter)
    {
        while (1) 
        {
            if ( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON ) 
            {
                /* K1 被按下 */
                printf("挂起 LED 任务!\n");
                osThreadSuspend(LED1Handle);/* 挂起 LED 任务 */ 
            }
            osDelay(20);/* 延时 20 个 tick */
        }
    }
    

    10.2.2 恢复

    /**************************** 任务句柄 ********************************/
    /*
    * 任务句柄是一个指针,用于指向一个任务,当任务创建好之后,它就具有了一个任务句柄
    * 以后我们要想操作这个任务都需要通过这个任务句柄,如果是自身的任务操作自己,那么
    * 这个句柄可以为 NULL。
    */
    osThreadId LED1Handle;/* LED 任务句柄 */ 
    
    static void KEY_Task(void* parameter)
    {
        while (1) 
        {
            if ( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON ) 
            {
                /* K2 被按下 */
                printf("恢复 LED 任务!\n");
                osThreadResume(LED1Handle);/* 恢复 LED 任务! */ 
            }
            osDelay(20);/* 延时 20 个 tick */
        }
    }
    

    10.2.3 中断服务中恢复

    使用 xTaskResumeFromISR()的时候有几个需要注意的地方:

    1. 当函数的返回值为 pdTRUE 时:恢复运行的任务的优先级等于或高于正在运行的任务,表明在中断服务函数退出后必 须进行一次上下文切换 , 使用 portYIELD_FROM_ISR() 进行上下文切换。当函数的返回值为 pdFALSE 时:恢复运行的任务的优先级低于当前正在运行的任务,表明在中断服务函数退出后不需 要进行上下文切换。
    2. xTaskResumeFromISR() 通常被认为是一个危险的函数,因为它的调用并非是固定的,中断可能随时来来临。所以 xTaskResumeFromISR()不能用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,这就会导致一次中断丢失(任务还没有挂起,调用 xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。这种情况下,可以使用信号量或者任务通知来同步就可以避免这种情况。
    void vAnExampleISR( void )
    {
        BaseType_t xYieldRequired;
    
        /* 恢复被挂起的任务 */ 
        xYieldRequired = osThreadResume( xHandle ); 
    
        if ( xYieldRequired == pdTRUE ) 
        { 
            /* 执行上下文切换, ISR 返回的时候将运行另外一个任务 */ 
            portYIELD_FROM_ISR(); 
        } 
    }
    

    10.2.4 全部恢复

    osThreadResumeAll 函数的使用方法很简单,但是要注意,调用了多少次 osThreadSuspendAll() 函数就必须同样调用多少次 osThreadResumeAll() 函数。

    void vDemoFunction( void )
    {
        osThreadSuspendAll();
        /* 处理 xxx 代码 */
        osThreadSuspendAll();
        /* 处理 xxx 代码 */
        osThreadSuspendAll();
        /* 处理 xxx 代码 */
     
        osThreadResumeAll(); 
        osThreadResumeAll(); 
        osThreadResumeAll(); 
    }
    

    十一、获取任务状态

    11.1 相关API说明

    11.1.1 osThreadGetState

    获取任务当前状态。

    函数osThreadState osThreadGetState(osThreadId thread_id)
    参数thread_id: 任务ID
    返回值以下值
    /* Thread state returned by osThreadGetState */
    typedef enum {
    	osThreadRunning   = 0x0,	      /* A thread is querying the state of itself, so must be running. */
    	osThreadReady     = 0x1 ,			        /* The thread being queried is in a read or pending ready list. */
    	osThreadBlocked   = 0x2,		        /* The thread being queried is in the Blocked state. */
    	osThreadSuspended = 0x3,	      /* The thread being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
    	osThreadDeleted   = 0x4,		          /* The thread being queried has been deleted, but its TCB has not yet been freed. */   
      osThreadError     = 0x7FFFFFFF
    } osThreadState;
    

    十二、注意事项

    用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。


    • 由 Leung 写于 2021 年 12 月 20 日

    • 参考:STM32CubeMX之FreeRTOS
        STM32CUBEMX的freertos一般使用方法笔记
        STM32CubeIDE(十一):FreeRTOS选项中Disable、CMSIS_V1和CMSIS_V2的区别
        HAL库中的 SYS Timebase Source 和 SysTick_Handler()

    展开全文
  • Linux下的任务管理器 top命令

    千次阅读 2018-11-06 06:18:15
    Linux下的任务管理器 top命令
  • soc(九) 中断控制

    千次阅读 2020-05-09 15:19:15
    中断控制在芯片中的位置 中断控制的发展 中断控制的分类
  • Linux系统中查看进程和计划任务管理

    千次阅读 2019-09-18 05:50:40
     各位小伙伴们大家好,本次给大家带来的是Linux操作系统中的进程和计划任务管理,首先大家都知道程序是保存在外部存储介质(如硬盘、光盘)中的可执行机器代码和数据的静态集合,而进程是在CPU及内存中处于动态...
  • 嵌入式应用软件任务划分的原则

    千次阅读 2019-07-28 20:22:31
    在基于实时操作系统(RTOS,RealTime Operating System)的单片机应用软件设计中,“任务”是一个很重要的概念。对于任务的划分,并没有一个人人都要遵守的规则,不同的人来设计一个同样规格要求的系统,会有不同的...
  • 中断使能 中断使能的情况下:中断产生---->中断标志位被mcu置1---->mcu暂停主程序去执行中断程序(别忘记清中断)—>返回主程序 不要陷入误区: 并不是说不使能串口接受中断就无法接收数据,只是为了在串口...
  • windows任务管理器 参数解释

    千次阅读 2013-01-31 21:46:25
     任务管理器提供正在您的计算上运行的程序和进程的相关信息。也显示最常用的度量进程性能的单位。 使用任务管理器可以监视计算机性能的关键指示。可以查看正在运行的程序的状态,并终止已停止响应的程序。也可以...
  • 超详细|一篇搞定操作系统——设备管理

    千次阅读 多人点赞 2021-01-05 21:27:11
    文章目录4.1 设备管理概述4.2 输入...除了进行实际I/O操作的设备外,也包括:设备控制、DMA控制中断控制、通道。 早期,计算机设计者没有将CPU的执行与I/O操作分开,甚至大多数人认为,输入输出与计算的时间
  • 在使用freertos时如何为lvgl配置心跳和任务管理器配置lvgl心跳(Tick)配置lvgl任务管理器(Task Handler) 配置lvgl心跳(Tick) 参考lvgl中文文档中的说明:...
  • Linux是实时系统还是分时操作系统?

    千次阅读 2021-06-18 00:12:05
    内核:负责管理各个任务,为每个任务分配CPU时间,并负责任务之间通讯。分为不可剥夺型内核于可剥夺型内核; 调度:内核的主要职责之一,决定轮到哪个任务运行。一般基于优先级调度法; (2)关于优先级的问题 任务...
  • RTOS之UCOS(四)---中断管理与定时器

    千次阅读 2019-06-13 08:56:27
    一、什么是中断 前面谈到任务切换时,不管是任务级上下文切换还是中断级...不管是操作系统任务切换,还是处理器与外设的I/O数据通信,甚至操作系统与用户操作的交互,都离不开中断系统的支持,那么什么是中断呢...
  • 【UCOSIII】UCOSIII系统内部任务

    千次阅读 2018-06-25 18:04:35
    之前讲到UCOSIII默认有5个系统任务: 空闲任务:UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建; 时钟节拍任务:此任务也是必须创建的任务; 统计任务:可选...
  • Linux下的任务管理器-top命令

    万次阅读 多人点赞 2012-07-11 00:04:40
    Windows下的任务管理器虽然不好用(个人更喜欢Process Explorer些),但也算方便,可以方便的查看进程,CPU,内存...也可以很容易的结束进程 没有图形化界面下的Linux,也有命令可以实现Windows的任务管理器功能,这...
  • 转贴 详解任务管理器

    千次阅读 2011-05-08 22:10:00
    详解任务管理器 樱木花盗 发表于 2010-12-1 16:05:36 ㈠、概述及菜单 任务管理器提供正在您的计算上运行的程序和进程的相关信息。也显示最常用的度量进程性能的单位。使用任务管理器可以监视计算机性能的...
  • 电池管理系统(BATTERY MANAGEMENT SYSTEM),俗称电池保姆或电池管家,是连接车载动力电池和电动汽车的重要纽带...从整车角度,电池管理系统(BMS)作用或任务可以详述为如下几点: 1、保护电芯和电池包不受到损害;
  • 网上教学管理系统的设计与实现

    万次阅读 多人点赞 2019-04-14 18:54:54
    网上教学管理系统的设计与实现 第1章 绪 论 1.1 背景 为了促进计算机专业学生工程实践能力的提升,使老师能够更好的管理学生,帮助学生提高学习成绩掌握更多的专业知识,增强师生之间的交流;解决老师...
  • 进程和计划任务管理(详细)

    千次阅读 多人点赞 2020-12-01 02:01:21
    文章目录一、程序和进程的关系二、查看进程信息ps方法一:ps aux方法二:ps -...●a:显示终端上的所有进程,包括其他用户的进程 ●u:表示列出进程的用户 ●x:显示所有终端的进程 (1)USER:进程的用户。 (2)PID
  • 文章目录首先我们了解一下程序和进程的关系:一、查看进程1、查看静态的...crontab周期性任务设置1、crontab的配置文件和目录(1) /etc/crontab 全局配置文件2、/etc/cron.*/ 系统默认设置3、/var/spool/cron/用户名
  • 3.任务管理机制

    千次阅读 2017-06-15 14:14:37
    任务用于监控输入、更新输出、计算、循环控制、显示、读按钮和键盘、与其它系统交流等。有些应用中可能只包含少数任务,有些应用中也可能包含上百个任务任务数多并不意味这设计有多好或者有多有效,这依赖于应用的...
  • 第一章 信息化基础知识 一、信息与信息化 1、信息论奠基者香农认为:信息就是能够用来消除不确定性的东西。 8种状态需要3位比特表示,5位比特则可表示64种状态 信息、物质材料、能源...6、信息系统生命周期可简化为:①
  • 设备管理之I/O系统

    千次阅读 2021-10-12 16:42:32
    在一个计算机系统中,除了需要直接用于I/O和存储信息的设备外,还需要有相应的设备控制。在大、中型计算机系统中,还需有I/O通道,由这些设备以及相应的总线构成了I/O系统。 I/O设备管理系统结构图 I/O设备的特点...
  • 5、了解什么是信号,利用信号量机制熟悉进程间软中断通信的基本原理, 6、熟悉消息传送的机理 ,共享存储机制 。 二、 实验环境 Ubuntu 20.10,gcc编译器 三、 实验内容 编写一段程序,使用系统调用fork( )创建两...
  • 在多任务实时系统中,一项工作的完成往往可以通过多个任务协调的方式共同来完成, 例如一个任务从传感器中接收数据并且将数据写到共享内存中,同时另一个任务周期性的从共享内存中读取数据并发送去显示(如图 两个...
  • CentOS7 运维 - 进程和计划任务管理程序和进程的关系查看进程信息ps查看静态的进程统计信息查看静态的进程统计信息僵尸进程动态查看进程排名信息top第一行是任务队列信息第二行为进程信息第三行为CPU的信息第四行为...
  • 第三章8086微处理器系统结构 8086 CPU结构 8086 CPU是Intel系列的16位微处理,有40个引脚。它的外部数据总线为16位,地址线为20根。因为可用20位地址,所以可寻址的地址空间达1MB。(代表了外围存储器的寻址能力)...
  • 操作系统实验5 设备管理

    千次阅读 多人点赞 2019-04-28 14:31:10
    【实验名称】设备管理 【实验目的】 ...设备管理不但要管理实际I/O操作的设备(如磁盘机、打印机),还要管理诸如设备控制、DMA控制中断控制、I/O处理机(通道)等支持设备。如何有...
  • 计划任务如何调试 1.crond调试 2.crond编写思路 1 Linux磁盘管理 1.磁盘的基本概念 1.什么是磁盘 绝大多数人对硬盘都不陌生,一块小小的硬盘里,就可以存储海量的照片音乐和电影,尤其是我们喜爱的各类动作片。但...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,650
精华内容 36,660
关键字:

任务管理器显示系统中断

友情链接: SDL_yuv_mmx.rar