windows中freeRTOS模拟器环境搭建

2023-05-16

windows中的freeRTOS使用

  FreeRTOS参考手册中的模拟程序都是基于windows版本的模拟器。因此为了学习FreeRTOS,需要在Windows中搭建一下模拟器的运行环境。网络上的一般都是直接跑一下FreeRTOS源码中的WSVC中的Demo。就没有下文了,怎么加入自己的代码到模拟器,怎么删除模拟器中已经存在的监测任务,完全没有介绍。所以我在这里总结一下怎么在FreeRTOS源码基础上搭建一个自己的模拟器环境。我试了可以有以下2种方法:

  1. 也是以FreeRTOS源码中的MSVC项目为基础,用Visual studio开发环境搭建,这种方法最是简单。
  2. 使用mingw32的mingw32-make.exe编译,但这种方法要对Makefile有所了解。

方法1:Visual studio开发环境搭建

思路

  FreeRTOS提供的源码文件中有三个Windows平台可用的Demo。一个用于mingw32,一个用于MSVC。其中MSVC默认使用Visual studio开发环境。因此简单起见就用Visual studio。可以用Visual studio提供的MSVC编译环境编译出程序后,需要考虑的就是移除实例代码中默认的程序,加入自己需要学习、测试的代码。MSVC的Demo中有不少的任务,这里我就不做介绍了,我也是踩过不少坑后才知道其中一部份。本来下载它的模拟器下来就是准备从简单的任务开始跑起,结果发现简单任务还不方便加入,好不容易加入了,还有很多调试信息输出。不得已还要研究它的编译过程,麻烦。闲话不多说进入正题,MSVC搭建环境有以下几个步骤:

  1. 下载Visual studio
  2. 安装Visual studio
  3. 下载FreeRTOS源码
  4. 编译FreeRTOS源码Demo
  5. 更改FreeRTOS源码Demo,加入自己的测试程序

下载Visual studio

  这个步骤简单,有很多地方可以下载。我习惯用腾讯软件,普通下载直接下载,软件也没什么广告插件。

安装Visual studio

  这个步骤也没有什么说的,就是选择将要安装组件时要选上。
在这里插入图片描述

下载FreeRTOS源码

  下载git-bash并安装,将git命令加入到系统path。不会自己可以搜索下。

git clone https://gitee.com/rogerbowu/FreeRTOS.git
cd FreeRTOS/FreeRTOS/Source
git clone https://gitee.com/pai3_1415926/FreeRTOS-Kernel.git
mv FreeRTOS-Kernel/* ..
rm -rf FreeRTOS-Kernel

编译FreeRTOS源码Demo

  1. 进入FreeRTOS源码文件中的FreeRTOS/FreeRTOS/Demo/WIN32-MSVC/
  2. 双击打开WIN32.sln。应该会用刚安装好的visual studio打开一个项目
  3. 点击绿色三角形运行,应该会出现一个cmd的会选窗口,显示一些系统的追踪信息
    用Visual studio运行程序在这里插入图片描述

更改FreeRTOS源码Demo,加入自己的测试程序

  选择Visual studio右侧文件浏览器中的RTOSDemo前面的三角形展开,再点击Demo App Source,选择打开main.c
在这里插入图片描述

  更改main.c

// 在头文件后面加一行
extern void simulator_run();
// 后面这个宏要设置为1,不然运行过程会被一个信号打断
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY    1

// 找到main函数,改成下面的样子。主要就是注释部分代码,加入simulator_run()的调用
int main( void )
{
   // 前面这两个函数调用是必须要的,不要模拟器就会报错
    /* This demo uses heap_5.c, so start by defining some heap regions.  heap_5
     * is only used for test and example reasons.  Heap_4 is more appropriate.  See
     * http://www.freertos.org/a00111.html for an explanation. */
    prvInitialiseHeap();

    /* Initialise the trace recorder.  Use of the trace recorder is optional.
     * See http://www.FreeRTOS.org/trace for more information. */

    // 这个是系统追踪初始化
    configASSERT( xTraceInitialize() == TRC_SUCCESS );

    /* Start the trace recording - the recording is written to a file if
     * configASSERT() is called. */
    // 这里的提示信息就注释了
    /*printf(
        "Trace started.\r\n"
        "The trace will be dumped to the file \"%s\" whenever a call to configASSERT()\r\n"
        "fails or the \'%c\' key is pressed.\r\n"
        "Note that the trace output uses the ring buffer mode, meaning that the output trace\r\n"
        "will only be the most recent data able to fit within the trace recorder buffer.\r\n",
        mainTRACE_FILE_NAME, mainOUTPUT_TRACE_KEY );*/

    configASSERT( xTraceEnable(TRC_START) == TRC_SUCCESS );

    /* Set interrupt handler for keyboard input. */
    vPortSetInterruptHandler( mainINTERRUPT_NUMBER_KEYBOARD, prvKeyboardInterruptHandler );

    /* Start keyboard input handling thread. */
    xWindowsKeyboardInputThreadHandle = CreateThread(
        NULL,                          /* Pointer to thread security attributes. */
        0,                             /* Initial thread stack size, in bytes. */
        prvWindowsKeyboardInputThread, /* Pointer to thread function. */
        NULL,                          /* Argument for new thread. */
        0,                             /* Creation flags. */
        NULL);

    /* Use the cores that are not used by the FreeRTOS tasks for the Windows thread. */
    SetThreadAffinityMask( xWindowsKeyboardInputThreadHandle, ~0x01u );

    // 这里是用一个宏确定用那个实例程序,这里我们用自己的程序。就不用源码自带的了,都注释了
    /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
     * of this file. */
    /*#if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )
        {
            main_blinky();
        }
    #else
        {
            main_full();
        }
    #endif*/ /* if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 ) */

    // 加入我们自己的函数调用
    simulator_run();

    return 0;
}

  上面对main.c文件的更改主要就是增加了一个外部调用函数原型的声明extern void simulator_run();。后面我们需要在自己的实例中实现这个函数。这里main函数已经调用了这个函数,因此我们自己写的函数就不能是main函数了,而是声明那个函数原型。
下面就再加入一个自己的实例函数。Demo App Source源码分类上点击鼠标右键,选择"添加",新建项。选择C++文件,名称可以输入一个first.c(可以是C文件,不用非是Cpp文件),最后选择一个电脑上的任意位置。

#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"

#define mainDELAY_LOOP_COUNT 100000

void vPrintString(char * pcString) {
    printf("%s", pcString);
    fflush(stdout);
}
void task1(void* pvParameters) {
    const char* pcTaskName = "Task1 is running\r\n";
    volatile uint32_t ul;   /*  volatile 防止编译器优化掉,不进行循环*/

    /* 大多数任务,都以这样的内联循环运行*/
    for (;;) {
        /* 打印任务名字 */
        vPrintString(pcTaskName);

        /* 延迟 */
        for (ul = 0; ul < mainDELAY_LOOP_COUNT; ul++)
        {
            /* 这个循环只是延迟实现,啥都不干。后面的例子会用delay或sleep函数替代*/
        }
    }
}

void task2(void* pvParameters) {
    const char* pcTaskName = "Task2 is running\r\n";
    volatile uint32_t ul;   /*  volatile 防止编译器优化掉,不进行循环*/

    /* 大多数任务,都以这样的内联循环运行*/
    for (;;) {
        /* 打印任务名字 */
        vPrintString(pcTaskName);

        /* 延迟 */
        for (ul = 0; ul < mainDELAY_LOOP_COUNT; ul++)
        {
            /* 这个循环只是延迟实现,啥都不干。后面的例子会用delay或sleep函数替代*/
        }
    }
}
// 主函数开始调度器之前创建任务

int simulator_run(void) {
    /* 创建2个任务。真正的程序应当检测xTaskCreate()函数的返回值,确保函数成功执行。*/
    xTaskCreate(task1, "Task1", 1000, NULL, 1, NULL);
    xTaskCreate(task2, "Task2", 1000, NULL, 1, NULL);

    /* 开启调度器 */
    vTaskStartScheduler();

    /* 如果一切顺利,主函数就不会运行到接下来的循环。如果主函数运行到这个循环,就说明没有足够的堆用于创建空闲任务。第二章提供了更加详细的堆管理信息。*/
    for (;;);
}

  再次点击绿色三角形运行,运行结果如下图表示成功。如果还要想加入新的实例程序,就实现void simulator_run()函数就可以了。这个文件也可以保存在任何你自己的项目目录中。
在这里插入图片描述

方法2:用mingw32-make.exe按照Makefile编译

  如果你不想用MSVC,或你对mingw32更加熟悉。您可以用下面的方法搭建freeRTOS模拟器环境。和上面使用Visual studio大部分都一样,只是编译环境不同。Visual studio是采用MSVC的编译工具,新加入代码文件也会自动加入到项目中。使用mingw32提供的mingw32-make.exe等编译工具需要自己动手更改Makefile文件,相对而言更复杂,也更困难。但可以让你更多的了解程序编译过程。下面就是具体步骤:

  1. 下载mingw32安装包
  2. 安装mingw32组件包
  3. 下载FreeRTOS源码
  4. 编译FreeRTOS源码Demo
  5. 更改FreeRTOS源码Demo
  6. 加入自己的代码

下载mingw32安装包

  也是可以在腾讯软件下载。

安装mingw32组件包

  不同包选择方法不同,安装后确定有gcc,g++,make就可以了,这三个程序都在安装目录的bin目录下。make前面可能有个mingw32或其它前缀。可以链接成make命令。下载会花不少时间。
  安装好后将bin目录加入到系统的环境变量path中。打开一个cmd窗口,确定已经安装好。

gcc --version
gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
g++ version
g++.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mingw32-make --version
GNU Make 4.2.1
Built for x86_64-w64-mingw32
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

下载FreeRTOS源码

  同上

编译FreeRTOS源码Demo

  打开FreeRTOS源码文件中的FreeRTOS/Demo/WIN32-MingW/目录编译mingw32-make.exe
  编译完成后会在当前目录的build目录下生成一个RTOSDemo.exe可执行文件。双击打开这个文件,出现如下的运行图片表示成功。
在这里插入图片描述

更改FreeRTOS源码Demo

  因为思路一样,所以也是更改main.c文件为如下样子。

// 在头文件后面加一行
extern void simulator_run();
// 后面这个宏要设置为1,不然运行过程会被一个信号打断
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY    1

// 找到main函数,改成下面的样子。主要就是注释部分代码,加入simulator_run()的调用
int main( void )
{
   // 前面这两个函数调用是必须要的,不要模拟器就会报错
    /* This demo uses heap_5.c, so start by defining some heap regions.  heap_5
     * is only used for test and example reasons.  Heap_4 is more appropriate.  See
     * http://www.freertos.org/a00111.html for an explanation. */
    prvInitialiseHeap();

    /* Initialise the trace recorder.  Use of the trace recorder is optional.
     * See http://www.FreeRTOS.org/trace for more information. */

    // 这个是系统追踪初始化
    configASSERT( xTraceInitialize() == TRC_SUCCESS );

    /* Start the trace recording - the recording is written to a file if
     * configASSERT() is called. */
    // 这里的提示信息就注释了
    /*printf(
        "Trace started.\r\n"
        "The trace will be dumped to the file \"%s\" whenever a call to configASSERT()\r\n"
        "fails or the \'%c\' key is pressed.\r\n"
        "Note that the trace output uses the ring buffer mode, meaning that the output trace\r\n"
        "will only be the most recent data able to fit within the trace recorder buffer.\r\n",
        mainTRACE_FILE_NAME, mainOUTPUT_TRACE_KEY );*/

    configASSERT( xTraceEnable(TRC_START) == TRC_SUCCESS );

    /* Set interrupt handler for keyboard input. */
    vPortSetInterruptHandler( mainINTERRUPT_NUMBER_KEYBOARD, prvKeyboardInterruptHandler );

    /* Start keyboard input handling thread. */
    xWindowsKeyboardInputThreadHandle = CreateThread(
        NULL,                          /* Pointer to thread security attributes. */
        0,                             /* Initial thread stack size, in bytes. */
        prvWindowsKeyboardInputThread, /* Pointer to thread function. */
        NULL,                          /* Argument for new thread. */
        0,                             /* Creation flags. */
        NULL);

    /* Use the cores that are not used by the FreeRTOS tasks for the Windows thread. */
    SetThreadAffinityMask( xWindowsKeyboardInputThreadHandle, ~0x01u );

    // 这里是用一个宏确定用那个实例程序,这里我们用自己的程序。就不用源码自带的了,都注释了
    /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
     * of this file. */
    /*#if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )
        {
            main_blinky();
        }
    #else
        {
            main_full();
        }
    #endif*/ /* if ( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 ) */

    // 加入我们自己的函数调用
    simulator_run();

    return 0;
}

  还需要更改一下Makefile,让它做为一个子编译脚本,主Makefile会传递几个变量过来,包括编译中间文件与可执行程序存放目录,实现simulator_run()的源文件和自定义头文件目录,编译产生文件名称等。

# 在BUILD_DIR那一行行首加一个#,表示注释掉。具体编译输出目录由主Makefile指定
# BUILD_DIR := ./build
# 向下再注释掉执行文件名称行
# EXE := $(BUILD_DIR)/RTOSDemo.exe
# 向下翻到最后一页,找到生成可执行文件行。复制一下,其中一行注释了。另外一行结尾加入我们实现simulator_run()和自己项目文件中间文件(也就是各种.o文件)
# 主Makefile传递了一个PROJECT_EXE代替原Makefile中的EXE
# $(EXE) : $(MAIN_OBJS) $(FREERTOS_KERNEL_OBJS) $(FREERTOS_DEMOS_OBJS) $(FREERTOS_PLUS_TRACE_OBJS)
$(PROJECT_EXE) : $(MAIN_OBJS) $(FREERTOS_KERNEL_OBJS) $(FREERTOS_DEMOS_OBJS) $(FREERTOS_PLUS_TRACE_OBJS) $(PROJECT_OBJ)

# 最后是在# Clean rule前加入生成我们自己添加外部文件的编译规则,生成*.o文件,用于最终链接成可执行文件
# project demo objects rules
$(PROJECT_OBJ): %.o: $(PROJECT_DEMO_C) $(FREERTOS_PLUS_TRACE_INCLUDES) $(FREERTOS_KERNEL_INCLUDE_DIRS) $(FREERTOS_DEMOS_INCLUDE_DIRS) $(MAIN_INCLUDES)
  mkdir -p $(@D)
  $(CC) $(CFLAGS) $(PROJECT_DEMO_INC) $(FREERTOS_PLUS_TRACE_INCLUDE_DIRS) $(FREERTOS_KERNEL_INCLUDE_DIRS) $(FREERTOS_DEMOS_INCLUDE_DIRS) $(MAIN_INCLUDE_DIRS) -o $@ $(PROJECT_DEMO_C)

# Clean rule

加入自己的代码

  以上步骤还好,最复杂的地方就是如何在外部加入一个自己的代码到这个项目中。
  在任意位置新建一个目录,再在里面新建一个inc和src目录。inc存放自己的头文件,src存放源代码。
  再新建一个Makefile文件,这个Makefile文件中一定要根据自己FreeRTOS源码位置,设定好FREERTOS_SRC变量,不然会找不到。

# 如果你的模拟器和FreeRTOS源码目录位于同一个目录,就不用更改这个目录
# 如果你的模拟器和FreeRTOS源码位于不同的目录,需要设定这个变量为FreeRTOS源码目录
FREERTOS_SRC := $(abspath ../FreeRTOS)
FREERTOS_SIMULATOR_SRC := $(FREERTOS_SRC)/FreeRTOS/Demo/WIN32-MingW

PROJECT_NAME := just_a_test.exe
PROJECT_PATH := $(abspath .)
BUILD_DIR := $(PROJECT_PATH)/build

export BUILD_DIR

# 项目编译中间件存放目录
PROJECT_BUILD_DIR := $(BUILD_DIR)/Project
# 项目源码文件
PROJECT_DEMO_C := $(wildcard $(PROJECT_PATH)/src/*.c)
PROJECT_DEMO_C_NAMES := $(notdir $(PROJECT_DEMO_C))
# 项目头文件搜索目录
PROJECT_DEMO_INC := -I $(abspath ./inc)
# 项目源文件编译中间文件*.o
PROJECT_OBJ := $(PROJECT_DEMO_C_NAMES:%.c=$(PROJECT_BUILD_DIR)/%.O)
# 目标文件
PROJECT_EXE := $(BUILD_DIR)/$(PROJECT_NAME)

export PROJECT_DEMO_C
export PROJECT_DEMO_INC
export PROJECT_OBJ
export PROJECT_EXE

all:
  $(MAKE) -C $(FREERTOS_SIMULATOR_SRC)

# 只清除当前目录生成的.o和可执行文件
clean:
  rm $(PROJECT_OBJ)
  rm $(PROJECT_EXE)
# 清除所有编译产生的.o文件
distclean:
  $(MAKE) -C $(FREERTOS_SIMULATOR_SRC) clean

  src目录下建立一个用于实现simulator_run()函数的文件:

#include <stdio.h>
#include "FreeRTOS.h"
#include "task.h"

#define mainDELAY_LOOP_COUNT 100000

void vPrintString(char * pcString) {
    printf("%s", pcString);
    fflush(stdout);
}
void task1(void* pvParameters) {
    const char* pcTaskName = "Task1 is running\r\n";
    volatile uint32_t ul;   /*  volatile 防止编译器优化掉,不进行循环*/

    /* 大多数任务,都以这样的内联循环运行*/
    for (;;) {
        /* 打印任务名字 */
        vPrintString(pcTaskName);

        /* 延迟 */
        for (ul = 0; ul < mainDELAY_LOOP_COUNT; ul++)
        {
            /* 这个循环只是延迟实现,啥都不干。后面的例子会用delay或sleep函数替代*/
        }
    }
}

void task2(void* pvParameters) {
    const char* pcTaskName = "Task2 is running\r\n";
    volatile uint32_t ul;   /*  volatile 防止编译器优化掉,不进行循环*/

    /* 大多数任务,都以这样的内联循环运行*/
    for (;;) {
        /* 打印任务名字 */
        vPrintString(pcTaskName);

        /* 延迟 */
        for (ul = 0; ul < mainDELAY_LOOP_COUNT; ul++)
        {
            /* 这个循环只是延迟实现,啥都不干。后面的例子会用delay或sleep函数替代*/
        }
    }
}
// 主函数开始调度器之前创建任务

int simulator_run(void) {
    /* 创建2个任务。真正的程序应当检测xTaskCreate()函数的返回值,确保函数成功执行。*/
    xTaskCreate(task1, "Task1", 1000, NULL, 1, NULL);
    xTaskCreate(task2, "Task2", 1000, NULL, 1, NULL);

    /* 开启调度器 */
    vTaskStartScheduler();

    /* 如果一切顺利,主函数就不会运行到接下来的循环。如果主函数运行到这个循环,就说明没有足够的堆用于创建空闲任务。第二章提供了更加详细的堆管理信息。*/
    for (;;);
}

  终于可以编译了,进入新建目录中。输入mingw32-make.exe编译。如果一切顺利在当前目录的build目录下就会生成一个可执行文件,双击执行就可以看到2个任务正常运行了。
  最后说说为什么非要使用Windows版本的模拟器。因为FreeRTOS提供的手册就是Windows版本的,linux版本的我也已经移植完成了一个,而且很小,完全可以脱离FreeRTOS源码运行,但遗憾的是linux版本模拟器API没有生成中断的接口,学习到中断的章节就没有办法了。要不就只有上MCU直接运行了。所以没办法只能研究下Window版本的模拟器了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows中freeRTOS模拟器环境搭建 的相关文章

  • 从 EC2 W2008 实例创建 AMI - 为什么从来没有获得密码?

    我正在尝试做什么 我正在尝试克隆 EC2视窗2008通过管理控制台实例 该实例基于 Windows Server2008 i386 Base v104 ami 92ba43fb 但上面安装了许多应用程序 我想为新实例保留这些应用程序 发生了
  • SC创建binpath错误

    我正在尝试在 PowerShell 中运行以下命令 sc create StrongSwan binpath C Users Kanishk Desktop Strong Strong stronswan strongswan 5 6 3
  • 如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?

    我想编写一个执行以下操作的批处理文件 Check if a service is running 如果正在运行 请退出批处理 如果没有运行 启动该服务 到目前为止 我在谷歌上搜索的代码示例被证明不起作用 所以我决定不发布它们 启动服务是通过
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 在远程桌面上使用 Powershell 获取 Windows DisplayLanguage

    我正在尝试通过 powershell 获取 Windows 显示语言设置远程计算机 我尝试了 Get WinUserLanguageList 但这会返回所有语言的列表 Get WinSystemLocale 和 Get Culture 也不
  • 如何使用Python在没有窗口的情况下在屏幕上显示文本

    问题 我需要在没有窗口的情况下直接将文本写入屏幕 文本需要显示在所有其他窗口和全屏应用程序之上 并且不应以任何方式单击或交互 Example The text doesn t need to have a transparent backg
  • 已安装全局 NPM 包但未找到命令

    我已经全局安装了两个 npm 包 下载 https www npmjs com package download and 谜虚拟盒 https www npmjs com package enigmavirtualbox通过命令行 npm
  • 如何在 PowerShell 中比较本地文件与 FTP 服务器上的文件的年龄并下载远程复制是否较新

    我正在编写一个 PowerShell 脚本 以帮助我为工作设置新电脑 希望这不仅仅是我一个人会使用 所以我正在尝试考虑所有事情 我在 FTP 服务器上保存了离线安装程序 java flash reader 等 如果本地副本尚未保存在创建的
  • Windows“findstr”命令:排除包含特定字符串的结果

    到命令findstr str1 我想添加一些内容来排除包含该字符串的结果str2 在Linux中 这样做的方法是添加 grep v str2 to grep str1 当然 是否有一个等效的标志 v在 Windows 中 是否有一个等效的标
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 64 位大型 malloc

    malloc 失败的原因是什么 尤其是在 64 位中 我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM 该机器有 12GB RAM 和 32GB 交换空间 是的 malloc 是极端的 但是为什么它会成为一个问题呢 这是在带
  • subprocess.Popen('start') 失败

    在 python 中运行此命令将导致 WindowsError 指出找不到指定的文件 FAILS import subprocess subprocess Popen start notepad exe 在命令窗口中 它可以工作 start
  • windows关闭tomcat后保持端口锁定

    我遇到了一个问题 该问题发生在不同站点的 3 台不同服务器上 问题是 当我关闭 Windows 服务器上的 Tomcat 7 和 8 5 版本 服务并尝试重新启动该服务后 该服务将无法启动 因为 tomcat 认为端口仍在使用中 以下是错误
  • Windows 和 python 3.2 的 Pylint 安装问题

    当我尝试使用 pip 在 Windows 上安装 pylint 时 我遇到了这个问题 我真的不知道它来自哪里 C Python33 Scripts gt pip exe install pylint Downloading unpackin
  • 使用 BitmapEncoder 生成时如何使 GIF 循环重复

    我能够使用 BitmapEncoder C WinRT 创建动画 gif 但是 我一直无法弄清楚如何让GIF循环回来并从头开始 没有尝试太多 因为我不确定要尝试什么 搜索了更多要在 GIF 上设置的属性 但找不到任何相关内容 好吧 终于能弄
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • 如何使用 PowerShell 扩展 ZIP 存档(UTF-8 文件名)

    我的 zip 存档有一个文件 P re No l txt 该 zip 可以通过 Windows 文件资源管理器 7 Zip 或我尝试过的任何其他工具很好地扩展 但我不知道如何从 PowerShell 中做到这一点 显然我已经尝试过展开 存档
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解

随机推荐

  • v-rep仿真之键盘控制机械臂末端移动

    v rep仿真之键盘控制机械臂末端移动 键盘控制机械臂末端移动原理为 xff0c 设置机械臂逆运动学target xff0c 机械臂末端跟随target运动 xff0c 然后通过改变target的值 xff0c 从而达到控制机械臂末端移动的
  • urx驱动ur3和onrobot rg2

    urx驱动ur3和onrobot rg2 注意 xff1a 非常重要的一点 xff0c urx是可以在Python2和Python3都支持的 xff0c 随着时间改变 xff0c 如果有的读者发现Python2中不能使用 xff0c 报错m
  • ros-melodic安装解决sudo rosdep init问题

    ros melodic安装解决sudo rosdep init问题 解决办法1 去网站查看raw githubusercontent com的真实IP span class token function sudo span span cla
  • 上电浪涌电流

    上电浪涌电流 电机启动或者停转都会形成浪涌电流 xff0c 例如启动的浪涌最大 xff0c 毕竟电机启动静态电阻非常小 xff0c 上电等同短路 xff0c 其电机为感性负载 xff0c 由较大的无功电流 xff0c 对电网造成波动非常大
  • 电机功率计算公式

    电机功率计算公式 电动机输入功率 单相电机为P 61 UI xff0c 三相电机P 61 UIcos0 8 输出功率 xff08 驱动功率 xff09 P 61 FV F为力 牛顿 V xff1a 速度 m S xff09 换算到电机则有
  • C++ 中 map 字典与 set 集合的使用

    在 C 43 43 中 xff0c map 是关联容器 的一种 xff0c 关联容器将值 与键 关联到一起 xff0c 并使用键来查找值 这与 python 中的字典 类型类似 xff0c 也是用来存储键 值对 xff08 key valu
  • win11 安装 WSL2 在非 C 盘及配置(图形界面+代理)

    WSL 安装及配置 直接安装 WSL2 在非 C 盘启用 WSL 功能前提条件设置默认安装 WSL2安装在非 C 盘 图形界面先决条件更新 WSL 以支持 GUI 配置 WSL2 使用 Windows 网络代理 直接安装 WSL2 在非 C
  • CVTE嵌入式实习生与秋招

    目录 前言一 实习笔试二 实习面试三 实习工作内容四 公司看法 前言 今年暑假去CVTE实习了一个多月最后经过转正答辩 xff0c 获得了offer xff0c 现就我的实习经历和对公司的一些认知分享一下 xff08 仅代表个人观点 xff
  • 视频编解码行业及发展方向简述

    目录 一 视频行业1 视频是一个方兴未艾的大产业2 视频行业潜在商机大 人才缺口大3 了解华为海思的HI3518E方案 二 海思方案项目用到的硬件平台介绍1 本专栏文章使用的开发板配置2 处理器为什么选HI3518E 三 本专栏文章规划和核
  • 全面认识海思SDK及嵌入式层开发(1)

    目录 一 全面认识和检测配套开发套装1 套装配件介绍2 检测开发板3 注意 二 视频设备开发的技术流1 视频从产生到被消费的整个流程2 视频行业的商业角度分段3 几个疑问点 一 全面认识和检测配套开发套装 购买方式 xff1a 淘宝搜索 g
  • 嵌入式linux开发环境搭建(VMware16.0.0+Ubuntu16.04.3_X64)

    目录 一 安装VMware1 VMware介绍2 安装VMware16 0 0 二 安装ubuntu16 04 3 LTS1 Ubuntu介绍2 下载安装包iso3 安装 四 新安装Ubuntu的基本设置1 开机和关机等2 虚拟机基本设置3
  • 全面认识海思SDK及嵌入式层开发(2)

    目录 一 HI3518E方案系统整体架构介绍1 硬件上2 软件上 二 海思SDK的整体介绍三 海思SDK包的学习和实验1 2篇相关文档2 SDK包复制到linux原生目录中并解压3 SDK包操作的脚本程序研究4 SDK中源码包部分的配置编译
  • 计算机视觉之相机模型

    目录 一 相机模型1 相机与图像2 坐标系3 世界坐标系到摄像机坐标系4 摄像机坐标系到图像物理坐标系5 图像物理坐标系到图像像素坐标系6 摄像机坐标系到图像像素坐标系7 世界坐标系到图像像素坐标系 二 镜头畸变1 相机成像原理2 镜头畸变
  • vscode安装插件失败,完美解决

    vscode安装插件一直失败 xff0c 解决方案如下 访问vscode插件官网https marketplace visualstudio com vscode xff0c 搜索你要的插件点击插件详情 Version History 下载
  • ROS的topic通信机制

    1 通信步骤如图 xff1a 2 步骤介绍 第 xff08 0 xff09 步 xff1a talker gt master 发布者talker向mater注册 xff1a 包括节点的信息 需要发布的话题名等 xff0c 然后节点管理器RO
  • 关于快速幂和矩阵快速幂

    快速幂 xff1a 可参考该链接百科快速幂也可以参考这个博客快速幂博客 给出快速幂的题目和代码 xff1a 快速幂 取余计算 include lt iostream gt include lt string h gt using names
  • C/C++ 文件操作基础

    目录 1 文件分类 2 文件的打开与关闭 3 顺序读写文件 4 随机读写文件 5 其他与文件相关的操作 最近看 GNU Radio 源码看到了文件操作的部分 xff0c 因此记录下学习 C 43 43 C 操作文件的过程 本文的文件操作是
  • npm的装包原理

    原文 xff1a npm安装包原理 前言 xff1a 提起npm xff0c 大家第一个想到的应该就是 npm install 了 xff0c 但是 npm install 之后生成的 node modules大家有观察过吗 xff1f p
  • 02基于freertos实现串口通讯

    文章目录 一 操作步骤1 任务创建API2 步骤 二 代码 一 操作步骤 1 任务创建API 动态创建任务xTaskCreate 静态创建任务xTaskCreateStatic 任务句柄 xff1a 任务句柄就是一个指针 xff0c 指向任
  • windows中freeRTOS模拟器环境搭建

    windows中的freeRTOS使用 FreeRTOS参考手册中的模拟程序都是基于windows版本的模拟器 因此为了学习FreeRTOS xff0c 需要在Windows中搭建一下模拟器的运行环境 网络上的一般都是直接跑一下FreeRT