xsemaphoretake返回_freeRTOS学习笔记

2023-05-16

林大侠

2018.08.09

第一节 Task管理

(一)Task管理常用API

创建Task API

static BaseType_t xTaskCreate(TaskFunction_t pvTaskCode,

const char *constpcName,

const uint32_t usStackDepth,

void *constpvParameters,

UBaseType_t uxPriority,

TaskHandle_t *constpvCreatedTask)

功能

创建一个新任务,并将其添加到准备运行的任务列表中

参数描述

pvTaskCode: 指向任务实现函数的指针。

constpcName :任务名称,只是单纯的用于描述任务方便记忆,不会被freeRTOS使用。

usStackDepth:栈深度,这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。

比如说,如果是32位宽的栈 空间,传 入的usStackDepth值为100,则将会分配400 字节的栈空间(100 * 4bytes)。栈深度 乘以栈宽度的结果千万不能超过一个size_t 类型变量所能表达的最大值。

constpvParameters: 任务的传参。可以为NULL。

uxPriority: 任务优先级。最小优先级为0,最高优先级没有上限,但一般用户会自定义一个上线。

根据使用情况,数值尽量 设置小一点。

constpvCreatedTask:任务句柄。可以使用该句柄对任务进行引用,比如删除任务和改变任务优先级等。可以为NULL。

返回值

pdPASS : 任务创建成功。

其它值 :任务创建失败,可以根据返回的错误值在 projdefs.h文件中找到错误原因。

删除Task API

void vTaskDelete(TaskHandle_t xTaskToDelete)

功能

从RTOS实时内核管理中删除任务。删除的任务将从所有就绪、阻塞、暂停和事件列表中删除

参数描述

xTaskToDelete:创建任务时传出的句柄。如果传入参数为NULl,将会删除正在调用的任务。

返回值

NULL

开始调度Task API

void vTaskStartScheduler()

功能

开始执行任务调度

参数描述

NULL

返回值

NULL

Task延时阻塞API

void vTaskDelay(const TickType_t xTicksToDelay)

功能

从调用 vTaskDelay()开始阻塞任务,直到指定的滴答计数次数。

参数描述

xTicksToDelay:阻塞时间(ticks 时钟数)。一般使用参数 ms/ portTICK_RATE_MS来阻塞以毫秒为单位的时间。

ms为需要阻塞单位为毫秒的数值。

返回值

NULL

将Task阻塞到指定时间API

void vTaskDelayUntil(TickType_t *constpxPreviousWakeTime, const TickType_t xTimeIncrement)

功能

将任务阻塞到指定的时间。利用此API可以实现任务周期性调用。

参数描述

constpxPreviousWakeTime:指向一个变量的指针,该变量保存了任务最后一次解除阻塞的时间。

变量在首次使用之前必须用当前时间初始化。在此之后,变量将在vTaskDelayUntil中自动更新。

xTimeIncrement:周期时间。任务将在*pxPreviousWakeTime + xTimeIncrement时被解除阻塞。

使用相同的xTimeIncrement参数值调用vTaskDelayUntil将导致任务以固定的接口周期执行。

返回值

NULL

获取Task优先级API

UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask)

功能

获取已经创建的任务的优先级

参数描述

xTask: 创建任务时传出的句柄。当传入参数为NULL,则返回当前运行任务的优先级。

返回值

需要获取任务的优先级。

设置Task优先级API

void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority)

功能

设置指定任务的优先级

参数描述

xTask:需要设置任务的句柄。

uxNewPriority:需要改变成的优先级。

返回值

NULL

获取Task状态API

eTaskStateeTaskGetState(TaskHandle_t xTask)

功能

获取想要获取任务的状态。

参数描述

xTask:需要获取任务状态的句柄。

返回值

任务当前的状态。

挂起TaskAPI

void vTaskSuspend(TaskHandle_t xTaskToSuspend)

功能

把指定的任务挂起

参数描述

xTaskToSuspend:需要挂起任务的句柄。

返回值

NULL

取消Task挂起API

void vTaskResume(TaskHandle_t xTaskToResume)

功能

让需要被调用 vTaskSuspend() 函数挂起的任务回到可以运行的状态。

参数描述

-xTaskToResume:需要重新回到可运行状态的任务的句柄。

返回值

NULL

挂起调度器API

void vTaskSuspendAll(void)

功能

停止上下文切换,而不用关中断。

参数描述

NULL

返回值

NULL

取消挂起调度器API

BaseType_t xTaskResumeAll(void)

功能

在调用 vTaskSuspendAll() 后调用,以恢复调度器

参数描述

NULL

返回值

pdTRUE:成功

pdFALSE:失败

(二)Task使用流程

新建一个Task

定义一个任务句柄 TaskHandle_t xTask。

创建一个任务执行函数,函数的返回值类型必须为 void,形参为 void *data。

在任务执行函数内配置任务阻塞时间。

调用 xTaskCreate() API创建一个新任务,分配好栈深度,设置好优先级。

调用 vTaskStartScheduler() API,开始任务调度。

修改Task优先级

调用 vTaskPrioritySet()API

删除Task

1.调用 vTaskDelete()API

第二节 队列管理

基于FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权

限的小程序。这些独立的任务之间很可能会通过相互通信以提供有用的系统功能。

FreeRTOS 中所有的通信与同步机制都是基于队列实现的。

(一)队列管理常用的API

创建一个新队列的宏

xQueueCreate(uxQueueLength, uxItemSize)

功能

创建一个新队列,为后面队列的引用提供句柄

参数描述

uxQueueLength:队列深度。

uxItemSize:队列中数据单元的长度,以字节为单位。

返回值

队列创建成功,则返回队列句柄;队列创建失败,返回 NULL。

删除一个队列的函数

void vQueueDelete(QueueHandle_t xQueue)

功能

删除队列——释放分配给存储放在队列上的项的所有内存。

参数描述

xQueue:要删除的队列的句柄。

返回值

NULL

向队列写入数据

向队列写入数据(写到队列尾部)

xQueueSend(xQueue, pvItemToQueue, xTicksToWait)

向队列头部写入数据

xQueueSendToFront(xQueue, pvItemToQueue, xTicksToWait)

向队列尾部写入数据(等同于 xQueueSend(xQueue, pvItemToQueue, xTicksToWait) )

xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait)

以上三个API都不能用于中断中,中断中要使用以下中断安全的API

向队列写入数据( xQueueSend(xQueue, pvItemToQueue, xTicksToWait) 的中断安全API)

xQueueSendFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)

向队头写入数据(xQueueSendToFront(xQueue, pvItemToQueue, xTicksToWait) 的中断安全API)

xQueueSendToFrontFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)

向队尾写入数据(xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait) 的中断安全API )

xQueueSendToBackFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)

参数描述

xQueue:需要写入数据的队列的句柄。

pvItemToQueue:需要写入的数据的指针。

xTicksToWait:队列阻塞超时时间。

pxHigherPriorityTaskWoken:优先级状态输出指针。对某个队列而言,可能有不止一个任务处于

阻塞态在等待其数据有效。调用 xQueueSendToFrontFromISR()或xQueueSendToBackFromISR()

会使得队列数据变为有效,所以会让其中一个等待任务切出阻塞态。如果调用这两个API函数使得一个任务

解除阻塞,并且这个任务的优先级高于当前任务(也就是被中断的任务),那么API会在函数内部将

*pxHigherPriorityTaskWoken 设为pdTRUE。

如果这两个API 函数将此值设为pdTRUE,则在中断退

出前应当进行一次上下文切换。这样才能保证中断直接

返回到就绪态任务中优先级最高的任务中。

返回值

pdTRUE:成功

errQUEUE_FULL:失败

读取队列中的数据

读取队列中的数据但不删除队列中的内容,也不会改变队列中的数据存储顺序

xQueuePeek(xQueue, pvBuffer, xTicksToWait)

读取队列中的数据,并且读取完后把数据从队列中删除

xQueueReceive(xQueue, pvBuffer, xTicksToWait)

以上两个API不能用于中断中,中断要使用以下中断安全的API

中断中读取队列中断数据,并把数据从队列中删除

xQueueReceiveFromISR(xQueue, pvBuffer, pxHigherPriorityTaskWoken)

中断中读取队列数据,但不删除队列中的数据,也不会改变队列中数据的顺序

xQueuePeekFromISR(xQueue, pvBuffer, pxHigherPriorityTaskWoken)

参数描述

xQueue:需要读取队列的句柄

pvBuffer:接收数据缓冲区的指针

pxHigherPriorityTaskWoken:任务优先级状态输出指针。如果值为 pdTRUE,需要在中断中进行上下文切换。

返回值

pdTRUE:成功

errQUEUE_FULL:失败

清空队列中的数据

xQueueReset(xQueue)

参数描述

xQueue:队列的句柄。

返回值

-永远都是返回 pdPASS

(二)队列使用流程

声明一个xQueueHandle类型变量,用于存放队列句柄。

调用 xQueueCreate(uxQueueLength, uxItemSize)创建一个新队列。

根据需要调用队列的读、写、复位等API。

第三节 信号量操作

(一)常用的信号量操作API

创建二值信号量

xSemaphoreCreateBinary()

功能

创建一个二值的信号量

参数描述

NULL

返回值

创建成功返回一个 SemaphoreHandle_t类型的信号量句柄,如果创建失败则返回 NULL

创建计数信号量

xSemaphoreCreateCounting(uxMaxCount, uxInitialCount)

功能

创建一个多值信号量

参数说明

uxMaxCount:信号量的深度。

uxInitialCount:信号量的初始值

返回值

创建创建成功返回一个句柄,如果创建失败则返回NULL

创建互斥信号量

xSemaphoreCreateMutex()

功能

创建一个互斥信号量

参数描述

NULL

返回值

创建成功返回一个句柄,如果创建失败则返回NULL

Take 信号量

非中断安全

xSemaphoreTake(xSemaphore, xBlockTime)

中断安全

xSemaphoreTakeFromISR(xSemaphore, pxHigherPriorityTaskWoken)

功能

信号量值 -1

参数

xSemaphore:信号量句柄

xBlockTime:阻塞时间

pxHigherPriorityTaskWoken:任务优先级状态的一个输出,如果值为 pdTRUE,

需要在中断中进行上下文切换。

返回值

成功pdTRUE ,信号量无效 pdFALSE

Give 信号量

非中断安全

xSemaphoreGive(xSemaphore)

中断安全

xSemaphoreGiveFromISR(xSemaphore, pxHigherPriorityTaskWoken)

功能

信号量值 +1

参数

xSemaphore:信号量句柄

pxHigherPriorityTaskWoken:任务优先级状态的一个输出,如果值为 pdTRUE,

需要在中断中进行上下文切换。

删除信号量

vSemaphoreDelete(xSemaphore)

参数描述

xSemaphore:需要删除信号量的句柄

获取信号量的当前值

uxSemaphoreGetCount(xSemaphore)

参数描述

xSemaphore:信号量句柄

返回值

如果信号量是计数信号量,那么uxSemaphoreGetCount()将返回其当前计数值。

如果信号量是二进制信号量,那么如果信号量可用, uxSemaphoreGetCount()返回1,如果信号量不可用,返回0。

获取互斥锁持有者

xSemaphoreGetMutexHolder(xSemaphore)

参数描述

信号量句柄

返回值

如果xMutex确实是互斥型信号量,返回当前的互斥锁持有者。

如果xMutex不是互斥型信号量,或者互斥型信号量可用(不是由任务持有),返回NULL。

(二)信号量的运用

延迟中断处理中,使用二值信号量进行同步。使用步骤

定义一个 SemaphoreHandle_t类型的变量,用于存放信号量句柄。

使用 xSemaphoreCreateBinary() 宏创建一个二值信号量。

在中断处理函数中使用 xSemaphoreGiveFromISR(xSemaphore, pxHigherPriorityTaskWoken),每来

一次中断,使二值信号量生效,解除延时处理任务的阻塞状态。

在中断延时处理任务中使用 xSemaphoreTake(xSemaphore, xBlockTime),阻塞时间设置为无限大,

当有中断触发时,信号量就会生效,xSemaphoreTake会得到一个值,使当前阻塞接触,同时使信号量失效,

下次再运行任务时会回到阻塞状态。

多值信号量的使用

多值信号量可以用来同步多个中断,每来一个中断,使用一次

xSemaphoreGiveFromISR(xSemaphore, pxHigherPriorityTaskWoken)

让信号量的值+1,在延时处理任务中使用 xSemaphoreTake(xSemaphore, xBlockTime)使信号量值-1。

互斥信号量的使用

互斥信号量用于多个任务共享资源使用。使用步骤如下:

定义一个 SemaphoreHandle_t类型的变量,用于存放信号量句柄。

使用 xSemaphoreCreateMutex()创建一个互斥信号量。

使用共享资源之前使用xSemaphoreTake获取令牌。

使用完共享资源之后,使用 xSemaphoreGive(xSemaphore)把令牌还回去。一定要还回去。

第四节 内存管理

(一)概述

每当任务,队列或是信号量被创建时,内核需要进行动态内存分配。虽然可以调用

标准的malloc()与free()库函数,但必须承担以下若干问题:

这两个函数在小型嵌入式系统中可能不可用。

这两个函数的具体实现可能会相对较大,会占用较多宝贵的代码空间。

这两个函数通常不具备线程安全特性。

这两个函数具有不确定性。每次调用时的时间开销都可能不同。

这两个函数会产生内存碎片。

这两个函数会使得链接器配置得复杂。

不同的嵌入式系统具有不同的内存配置和时间要求。所以单一的内存分配算法只可

能适合部分应用程序。因此,FreeRTOS 将内存分配作为可移植层面(相对于基本的内

核代码部分而言)。这使得不同的应用程序可以提供适合自身的具体实现。

当内核请求内存时,其调用pvPortMalloc()而不是直接调用malloc();当释放内存

时,调用vPortFree()而不是直接调用free()。pvPortMalloc()具有与malloc()相同的函

数原型;vPortFree()也具有与free()相同的函数原型。

FreeRTOS 自带有三种pvPortMalloc()与vPortFree()实现范例。

这三种方式都会在本节描述。FreeRTOS 的用户可以选用其中一种,也可以采用自己的内存管理方式。

这三个范例对应三个源文件:heap_1.c,heap_2.c,heap_3.c

(二)内存分配案例

Heap_1.c

Heap_1.c 实现了一个非常基本的pvPortMalloc()版本,而且没有实现vPortFree()。

如果应用程序不需要删除任务,队列或者信号量,则具有使用heap_1 的潜质。Heap_1

总是具有确定性。

这种分配方案是将FreeRTOS 的内存堆空间看作一个简单的数组。当调用

pvPortMalloc()时,则将数组又简单地细分为更小的内存块。

数组的总大小(字节为单位)在FreeRTOSConfig.h 中由configTOTAL_HEAP_SIZE

定义。以这种方式定义一个巨型数组会让整个应用程序看起来耗费了许多内存——即使

是在数组没有进行任何实际分配之前。

需要为每个创建的任务在堆空间上分配一个任务控制块(TCB)和一个栈空间。

Heap_2.c

Heap_2.c 也是使用了一个由configTOTAL_HEAP_SIZE 定义大小的简单数组。不

同于heap_1 的是,heap_2 采用了一个最佳匹配算法来分配内存,并且支持内存释放。

由于声明了一个静态数组,所以会让整个应用程序看起来耗费了许多内存——即使是在

数组没有进行任何实际分配之前。

最佳匹配算法保证pvPortMalloc()会使用最接近请求大小的空闲内存块。比如,考

虑以下情形:

堆空间中包含了三个空闲内存块,分别为5 字节,25 字节和100 字节大小。

pvPortMalloc()被调用以请求分配20 字节大小的内存空间。

匹配请求字节数的最小空闲内存块是具有25字节大小的内存块——所以pvPortMalloc()

会将这个25 字节块再分为一个20 字节块和一个5 字节块3,然后返回一个指向20 字

节块的指针。剩下的5 字节块则保留下来,留待以后调用pvPortMalloc()时使用。

Heap_2.c 并不会把相邻的空闲块合并成一个更大的内存块,所以会产生内存碎片

——如果分配和释放的总是相同大小的内存块,则内存碎片就不会成为一个问题。

Heap_2.c 适合用于那些重复创建与删除具有相同栈空间任务的应用程序。

Heap_2.c 虽然不具备确定性,但是比大多数标准库实现的malloc()与free()更有效率。

Heap_3.c

Heap_3.c 简单地调用了标准库函数malloc()和free(),但是通过暂时挂起调度器使

得函数调用备线程安全特性。其实现代码参如下。

此时的内存堆空间大小不受configTOTAL_HEAP_SIZE 影响,而是由链接器配置

决定。

void *pvPortMalloc( size_t xWantedSize )

{

void *pvReturn;

vTaskSuspendAll();

{

pvReturn = malloc( xWantedSize );

}

xTaskResumeAll();

return pvReturn;

}

void vPortFree( void *pv )

{

if( pv != NULL )

{

vTaskSuspendAll();

{

free( pv );

}

xTaskResumeAll();

}

}

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

xsemaphoretake返回_freeRTOS学习笔记 的相关文章

  • 301. Remove Invalid Parentheses

    Remove the minimum number of invalid parentheses in order to make the input string valid Return all possible results Not
  • matlab练习程序(图像水平/竖直移动)

    cl delta x 61 67 要求为整数 xff0c 水平移动的偏移量 xff0c 正为向右 xff0c 负为向左 delta y 61 89 要求为整数 xff0c 竖直移动的偏移量 xff0c 正为向下 xff0c 负为向上 img
  • 第二章 M文件程序设计(matlab)

    Contents 第二章 M文件程序设计M文件一 程序控制结构1 顺序结构1 数据的输入input2 数据的输出disp 输出字符串或者矩阵3 程序的暂停 pause Ctrl 43 C 延迟的秒数 2 选择结构1 IF语句2 switch
  • 无人机二次开发硬件清单

    四旋翼系统 3D Robotics IRIS 43 飞控 功能组件 eBumper4 声呐避障模块 组合功能 DJI Matrice100 43 Guidance 43 Onboard SDK
  • npm install报错解决方法ls-remote -h -t git://github.com/adobe-webplatform/eve.git

    npm install 时报错 xff0c 使用ssh 和 https 重新克隆代码都不行 xff0c 以下是解决办法 npm ERR usr local bin git ls remote h t git github com adobe
  • reStructuredText文件语法简单学习

    reStructuredText 是一种扩展名为 rst的纯文本文件 xff0c 通过特定的解释器 xff0c 能够将文本中的内容输出为特定的格式 1 章节标题 章节头部由下线 xff08 也可有上线 xff09 和包含标点的标题组合创建
  • [Hadoop 周边] 浅谈大数据(hadoop)和移动开发(Android、IOS)开发前景【转】

    原文链接 xff1a http www d1net com bigdata news 345893 html 先简单的做个自我介绍 xff0c 我是云6期的 xff0c 黑马相比其它培训机构的好偶就不在这里说 xff0c 想比大家都比我清楚
  • 无代理防毒:虚拟化与安全的深度融合

    当今 xff0c 用户对虚拟化和云计算平台的需求正在呈现爆发趋势 然而 xff0c 虚拟化技术其实是一把双刃剑 xff0c 它具有更高效率地利用计算 存储资源等优势 xff0c 但这些优势都依赖于虚拟化系统资源高度集中的特性 xff0c 但
  • 计算机专业找工作注意什么

    为什么80 的码农都做不了架构师 xff1f gt gt gt http www java sh Sharing qzjq 1722 html 几年前市场对计算机专业人才的需求非常大 xff0c 计算机专业红得发紫 xff0c 毕业生是 皇
  • 解析Linux C/C++开发的难度到底在哪

    解析Linux C C 43 43 开发的难度到底在哪 经常被问到的问题 如何学习C 43 43 如何学习Linux 如何开始 xff1f 其实这个问题对于不同的人答案往往不尽相同 xff0c 每个人所处的环境就不同 一个普遍的现象是有一些
  • 在局域网内实现https安全访问

    在局域网内实现https安全访问 准备原料 服务器 resin xff08 当然也可以是tomcat xff0c 这里以resin为例 xff09 安装jdk 域名 xff08 随便写一个就行 xff0c 因为是内网使用 xff0c 不会被
  • GWAS | 全基因组关联分析 | PLINK | 实战 | 统计遗传学

    参考 xff1a PLINK File format reference vcftools plink的主要功能 xff1a 数据处理 xff0c 质量控制的基本统计 xff0c 群体分层分析 xff0c 单位点的基本关联分析 xff0c
  • 七周七语言——Prolog(二)

    1 递归 首先来看一个知识库 xff1a father zeb john boy sr father john boy sr john boy jr ancestor X Y father X Y ancestor X Y father X
  • 上传图片到阿里云OSS和获取上传图片的外网url的步骤

    啥都不说 直接上代码 1 html lt form action 61 34 bcis api headImgUpload json 34 method 61 34 post 34 enctype 61 34 multipart form
  • 如何提取到网页上播放的视频

    1 在播放视频页面的空白处点击右键 xff0c 会弹出菜单 xff0c 在菜单中选择审查元素 2 弹出的页面如图所示 xff0c 我们点击第二个network 3 利用size这一栏点击一下他就会按照文件大小就可以查找到视频 xff0c 一
  • Nodejs如何调用Dll模块

    苏格团队作者 xff1a Tomey 一 为什么需要用node js调用dll xff1f 公司项目采用Electron xff08 electronjs org xff09 开发pc应用 xff0c 会涉及到与底层硬件设备的通信 xff0
  • PyShark入门(1):简介

    原文地址 xff1a http zodiacg net 2016 07 in 本系列文章译自thePacketGeek的系列文章 原创翻译 xff0c 转载请注明出处 文章作者以PyShark为基础开发了Cloud Pcap xff0c 一
  • 将元素添加到List集合的第一位

    2019独角兽企业重金招聘Python工程师标准 gt gt gt list add 1 object 看一下add方法的注释 Inserts the specified element at the specified position
  • KMS激活时,常见的错误及处理

    0x80072EFE 出现这种是错误因为服务器响应超时或与服务器连接已丢失 xff0c 网络连接的问题 解决方法 xff1a 暂时关闭防火墙和杀毒软件 xff0c 将网卡禁用再启用 xff0c 确保网络是通的 0x8007232B 过 30
  • 精彩网页

    新华网美国频道 xff1a http us xinhuanet com php加密网址 xff1a https www phpjiami com 转载于 https www cnblogs com net5x p 6570727 html

随机推荐

  • java集合类(二)List学习

    接上篇 java集合类 xff08 一 xff09 List接口继承了Collection接口和Iterable接口 xff0c 即同样含有Collection和 Iterable的特性 xff0c 还有方法 xff0c 其基本方法有 xf
  • 构建安全的数据访问-部署注意事项(九)

    部署注意事项 以安全方式设计和开发的数据访问组件如果不以安全的方式进行部署 xff0c 仍然容易受到攻击 常见的部署做法是使数据访问代码和数据库驻留在单独的服务器上 这些服务器通常由内部防火墙隔开 xff0c 这就引进了额外的部署注意事项
  • matlab练习程序(随机直线采样)

    我只是感觉好玩 xff0c 写了这样一段程序 原理就是先随机生成两个点 xff0c 然后根据这两个点画直线 xff0c 最后在直线上的像素保留 xff0c 没在直线上的像素丢弃就行了 最后生成了一幅含有很多空洞的图像 当然 xff0c 对含
  • 跳一跳j算法ava代码_麻将游戏算法深入解析及实现代码

    麻将游戏算法深入解析及实现代码 这两天为了工具箱的完善 xff0c 整理了这些年引擎开发的一些资料 xff0c 无意中发现06年写的一个麻将算法 xff0c 编译运行了一下 xff0c 还是有点意思的 xff0c 拿出来整理一下分享给大家
  • 使用SP Racing F3飞控&ROSflight软件包的无人机自主飞行系统

    搭建四旋翼系统 机架 xff1a XR215 Plus 328 分线板 xff1a XR215 Plus PDB 飞控 xff1a SP Racing F3 标准版 xff08 Acro xff09 86 电机 xff1a 银燕RS2205
  • PostMan使用手册

    Postman 使用手册系列教程 xff1a Postman软件安装 Postman使用手册1 导入导出和发送请求查看响应 Postman使用手册2 管理收藏 Postman使用手册3 环境变量 Postman使用手册4 API test
  • python 网站文件及数据库备份脚本

    初学python xff0c 试着写了一份python网站文件备份和数据库备份的脚本 xff0c 功能是写出来了 xff0c 但感觉还是不太适应 xff0c 写得不太好 xff0c 以后还要努力哈 xff01 backup py读取back
  • 八款值得尝试的精美的 Linux 发行版(2017 版)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在这篇文章中 xff0c 将会列出让一些令 Linux 用户印象最深刻且精美的 Linux 发行版 xff0c 包括对初学者友好和流行的发行版 1 elementary O
  • 大型网站架构系列:20本技术书籍推荐

    学习是技术人员成长的基础 xff0c 本次分享20本技术方面的书籍 xff0c 这些书不是每一本都是经典 xff0c 但是每一本都有其特点 以下20本大部分本人都看过 xff0c 因此推荐给大家 xff08 本次推荐的20本只是一个参考 x
  • 正确判断无人机指向故障 让电子罗盘远离磁干扰

    电子罗盘作为无人机产品的重要组成部件 xff0c 承载着为无人机引导绝对方位的功能 对于普通设计者而言 xff0c 经常会遇到电子罗盘校正困难 xff0c 校正需求过于频繁 xff0c 动态 高速运行时突发偏离 xff0c 以及无论怎么校正
  • 测试计划驱动开发模式 TPDD:一种比 TDD 更友好的开发模式

    相信大部分开发团队都在使用TDD xff0c 并且还有很多开发团队都 对外声明 在使用 TDD 开发模式 之所以说是 对外声明 xff0c 是因为很多开发团队虽然号称使用的是 TDD 开发模式 xff0c 实际开发过程中却无法满足 TDD
  • Android Button悬浮在SurfaceView上

    实现Button悬浮于与SurfaceView之上实现 注意 xff1a 你实现的SurfaceView和android中的Button EditView是同级的 xff0c 不能把一个包含在另一个里面 1 创建自己的SurfaceView
  • 异域linux内核漏洞,Ubuntu本地提权攻击漏洞复现(CVE-2017-16995)

    Ubuntu 16 04 4 kernel priv esc all credits to 64 bleidl vnik Tested on 4 4 0 116 generic 140 Ubuntu SMP Mon Feb 12 21 23
  • ROS 自定义消息类型

    引言 学习ROS的过程中 xff0c 在话题的发布与订阅之间 xff0c 我一直在思考 xff0c 我们能不能定义自己的话题名 xff0c 甚至在编写我们自己的ROS软件包时 xff0c 定义我们自己的消息类型 首先能不能定义自己的话题名
  • 计算机方便了我的工作作文,电脑给我们的生活带来了方便作文2篇

    电脑给我们的生活带来了方便作文2篇 在生活 工作和学习中 xff0c 大家都尝试过写作文吧 xff0c 借助作文人们可以反映客观事物 表达思想感情 传递知识信息 那么你有了解过作文吗 xff1f 下面是小编为大家收集的电脑给我们的生活带来了
  • python播放mp3文件 playsound_播放声音文件 函数playsound()

    播放声音文件 1 用途 xff1a 游戏里播放音乐 xff1b 自己动手给女友做音乐贺卡 图片 滚动的字母 温馨的音乐 2 可以使用PlaySound 函数播放声音文件 xff0c 该函数原型位于 include 中 因此要使用PlaySo
  • arduinouno组装无人机_Arduino UNO四自由度机械臂制作

    四自由度机械臂制作 准备材料 1 某宝上的四自由度机械臂拼装板 2 9克舵机 x 3 3 Arduino UNO 4 步进电机 x 1 5 外电源 及 导线 制作改进 拼装后发现原来的底盘旋转舵机出现头重脚轻 摇摇欲坠的感觉 决定改进 换装
  • android接收arduino字符串,【教程】Android手机通过OTG线连接Arduino,读写串口数据...

    因为自己对电子电路是半桶水 xff0c 复杂的单片机电路把我难倒了 xff0c 幸好Arduino的出现 xff0c 让一切都简化了不少 平时和朋友们就喜欢制作一些Arduino的小玩意儿来帮助生活和工作 因为朋友单位需要采购一些数据采集和
  • 计算机计算exp函数原理,exp函数表示什么意思(exp怎么按计算器)

    目的 用于 Exp 2 是e的平方 xff0c 指数函数是数学中的一个重要函数 应用于值e的函数写成 扩展数据 作为实变量x的函数 xff0c y 61 e的x次方的像总是正的 x轴以上 且递增的 从左到右 它从不接触x轴 xff0c 虽然
  • xsemaphoretake返回_freeRTOS学习笔记

    林大侠 2018 08 09 第一节 Task管理 一 Task管理常用API 创建Task API static BaseType t xTaskCreate TaskFunction t pvTaskCode const char co