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模拟器环境搭建 的相关文章

  • 什么是标准 unicode 字体?

    以下操作系统的标准 unicode 字体是什么 视窗XP 视窗Vista Window 7 按照标准 我的意思是它们存在于操作系统的全新安装中 无需将它们作为附加包安装 我一直在寻找同样的东西 看起来所有 Win 操作系统中只有一种字体 L
  • 在 Windows 上将 Word2vec 与 Tensorflow 结合使用

    In 本教程文件 https github com tensorflow models blob master tutorials embedding word2vec py L45通过 Tensorflow 找到以下行 第 45 行 来加
  • 没有设备的设备驱动程序?

    我正在创建一个需要使用一些内核级模块的应用程序 为此我将应用程序分为 2 个 一个用户级程序和一个内核级程序 在阅读了有关设备驱动程序并浏览一些教程后 我有点困惑 是否可以存在没有任何特定设备与之关联的设备驱动程序 除了设备驱动程序 内核代
  • Windows 中内存分配的限制+我计算得是否正确?

    我正在编写一个需要大量内存的程序 大型图形分析 目前我的程序中有两个主要的数据结构 占用了大部分内存 这些都是 n n 类型的矩阵int 和长度为 n 的数组 类型Node 在本例中 节点是一个包含两个 int 的结构体 sizeof No
  • 阴影空间示例

    EDIT 我接受了下面的答案 并添加了我自己的代码的最终修订版 希望它向人们展示影子空间分配的实际示例 而不是更多的文字 编辑 2 我还设法在 YouTube 视频 所有内容 的注释中找到了一个调用约定 PDF 的链接 其中有一些关于 Li
  • 如何用if条件编写ini文件

    我想编写一个带有 if else 条件的 ini 文件 我用 python 中的 ConfigParser 解析它 如何在ini文件中使用if和else语句 如果我明白你在问什么 您可能想要做的是这样的 在 INI 文件中设置条件值 sec
  • 正确配置JDK环境变量后仍然找不到java命令

    我在 Windows 虚拟机启动时安装 JDK 使用 cloudinit 用户数据将 PowerShell 脚本传输到 Windows 计算机 然后运行该脚本来安装 JDK softwares Get ItemProperty HKLM S
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 仅将 Firesharp 用于 Windows 桌面推送通知

    我想在 Windows 桌面应用程序中使用 Firesharp 该应用程序只会接收来自 Firebase 的通知 并且不会有任何类型的数据库交互 Firebase Cloud Messaging FCM 是 Firebase 唯一使用的东西
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • 如何在 PowerShell 中比较本地文件与 FTP 服务器上的文件的年龄并下载远程复制是否较新

    我正在编写一个 PowerShell 脚本 以帮助我为工作设置新电脑 希望这不仅仅是我一个人会使用 所以我正在尝试考虑所有事情 我在 FTP 服务器上保存了离线安装程序 java flash reader 等 如果本地副本尚未保存在创建的
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足
  • 你知道 Windows 上有类似的 wc(unix 字数统计命令)程序吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 快速搜索给了我陶巴瓦厕所 http www tawbaware com wc htm 但它不接受 std
  • 如何在 Visual C++ 中宣传 Bonjour 服务

    我试图弄清楚这是否可能 但是通过 Visual C 宣传 Bonjour 服务的最简单方法是什么 您可以使用DNS服务发现客户 dns sd Windows Bonjour 安装程序把它放进去C Windows system32 dns s
  • 64 位大型 malloc

    malloc 失败的原因是什么 尤其是在 64 位中 我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM 该机器有 12GB RAM 和 32GB 交换空间 是的 malloc 是极端的 但是为什么它会成为一个问题呢 这是在带
  • 在 WSL Ubuntu 20.04 上安装 npm 后,我收到消息“/usr/bin/env: ‘bash\r’: No such file or directory”

    运行时我看到以下消息npm install or npm来自终端的命令 执行中node按预期工作 gt npm install usr bin env bash r No such file or directory 2023 年 7 月更
  • 在 C# 中使用反射列出枚举中的值

    我正在尝试使用反射来列出一个 Visual Studio 解决方案内的各个项目中的一些类的公共成员和方法 我尝试访问的所有类都是 C 的 并且它们都是从 C 类访问的 我用来进行这些调用的代码如下 public void PopulateE
  • 在 wampserver 2.2 上安装 php_imagick.dll PHP 扩展

    我使用的是 32 位操作系统的 Windows 7 我安装了 ImageMagick 6 8 7 Q16Link https www imagemagick org script download php windows我能够从命令行 转换
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005

随机推荐

  • 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