ChibiOS简介3/5

news2024/9/21 4:25:08

ChibiOS简介3/5

  • 1. 源由
  • 2. ChibiOS基础知识3/5
    • 2.7 Chapter 7 - RT Time and Intervals
      • 2.7.1 Basic concepts
      • 2.7.2 APIs
    • 2.8 Chapter 8 - RT Virtual Timers
      • 2.8.1 Basic concepts
      • 2.8.2 Tickless Mode
      • 2.8.3 APIs
    • 2.9 Chapter 9 - RT Scheduler
      • 2.9.1 Basic concepts
      • 2.9.2 System Class
      • 2.9.3 Ready List
    • 2.10 Chapter 10 - RT Threading
      • 2.10.1 Basic concepts
      • 2.10.2 APIs
    • 2.11 Chapter 11 - RT Counter Semaphores
      • 2.11.1 Basic concepts
      • 2.11.2 APIs
    • 2.12 Chapter 12 - RT Mutexes, Condition Variables and Monitors
      • 2.12.1 Basic concepts
      • 2.12.2 APIs
  • 3. 参考资料

1. 源由

作为后续研读Ardupilot的ChibiOS的垫脚石,先了解下ChibiOS系统。


Ardupilot ChibiOS项目: https://github.com/ArduPilot/ChibiOS

Artery(AT32) porting项目: //Artery官网没有相关porting动作,不过开源github有相关项目。

  • https://github.com/dron0gus/artery
  • https://github.com/dron0gus/ChibiOS

2. ChibiOS基础知识3/5

2.7 Chapter 7 - RT Time and Intervals

2.7.1 Basic concepts

Handling of time is a fundamental mechanism in ChibiOS/RT, it is quite important to understand some basic concepts:

  • System Tick, The system tick is the atomic unit of time in ChibiOS/RT, time is measured in ticks. The system tick increases the system time counter.
  • System Time, System time is a counter of type systime_t increased by the System Tick, when the counter reaches its maximum value then it returns to zero, this does not affect functionality, the counter is meant to be able to wrap. The type systime_t is used for absolute time, specific instants in the system time domain.
  • Time Intervals, A time interval is a time period measured in system ticks.
  • Time units, A time units are used to define intervals using standard time units rather than system ticks. Time units have their own types: time_secs_t, time_msecs_t and time_usecs_t.
  • Time Period, It is a couple of systime_t representing the “start time” and the “end time” of an absolute time period.
  • System Time Counter, The system time is kept by a global counter of type systime_t which is incremented by the system tick.
  • Tick-less mode, The system time is an HW counter within some system timer, no interrupts are required in order to increase the counter.
  • High Resolution mode.

2.7.2 APIs

  • System Time Access API
函数名描述
chVTGetSystemTime()返回当前系统时间。
chVTGetSystemTimeX()返回当前系统时间(X-Class变体)。该函数可以在任何上下文中调用,但在字长小于systime_t大小的体系结构上其原子性不能保证。
chVTTimeElapsedSinceX()返回自指定系统时间以来的间隔。
chVTIsSystemTimeWithin()如果当前系统时间在指定的时间段内,则返回true。
chVTIsSystemTimeWithinX()如果当前系统时间在指定的时间段内,则返回true(X-Class变体)。
  • Time Utilities API
函数名功能描述
chTimeAddX()将时间间隔添加到系统时间,并返回新的系统时间。
chTimeDiffX()返回两个系统时间之间的时间间隔。
chTimeIsInRangeX()如果指定的系统时间在指定的时间段内,则返回true。
chTimeS2I()安全地将时间间隔从秒转换为滴答数。
chTimeMS2I()安全地将时间间隔从毫秒转换为滴答数。
chTimeUS2I()安全地将时间间隔从微秒转换为滴答数。
chTimeI2S()安全地将时间间隔从滴答数转换为秒。
chTimeI2MS()安全地将时间间隔从滴答数转换为毫秒。
chTimeI2US()安全地将时间间隔从滴答数转换为微秒。
TIME_S2I()不安全但更快的方式将时间间隔从秒转换为滴答数。
TIME_MS2I()不安全但更快的方式将时间间隔从毫秒转换为滴答数。
TIME_US2I()不安全但更快的方式将时间间隔从微秒转换为滴答数。
TIME_I2S()不安全但更快的方式将时间间隔从滴答数转换为秒。
TIME_I2MS()不安全但更快的方式将时间间隔从滴答数转换为毫秒。
TIME_I2US()不安全但更快的方式将时间间隔从滴答数转换为微秒。

2.8 Chapter 8 - RT Virtual Timers

2.8.1 Basic concepts

  • RT Virtual Timers, Virtual Timers are an unique ChibiOS/RT feature. It is a software system able to provide an “unlimited” number of one-shot timers with the same resolution of the system tick.
  • One Shot Timers, Virtual timers are one-shot timers that can be started, stopped prematurely or trigger a callback after their programmed time is expired.
  • Callbacks, Timers callbacks are always invoked from ISR context, this means that the API that can be utilized from a timer callback is subject to the same restrictions applicable to ISRs. By re-arming a virtual timer from the callback it is possible to implement periodic or aperiodic timers as well.

2.8.2 Tickless Mode

  • Common RTOS kernels are triggered by a periodic interrupt, called system tick, driving the internal timings-relate mechanisms. In ChibiOS/RT the system tick is handled efficiently however it can still limits the system in several ways:
  1. CPU usage is increased by the frequent IRQ servicing, the problem gets worse at higher frequencies.
  2. The system tick limits the resolution of the virtual timers and of the system time because a too high frequency would negatively affect the system performance.
  3. The system jitter is worsened by the continuous interruptions.
  4. Frequent interrupts can prevent the system from entering deeper sleep modes. This affects negatively the system power usage.
  • ChibiOS/RT implements a unique tickless mode in its virtual timers subsystem. When the tickless mode is activated the system timer is no more generating periodic interrupts but is programmed to generate an interrupt only when the system has some scheduled activity to execute, usually a virtual timer expiration. This approach has several positive aspects:
  1. Lower power consumption thanks to the use of deeper sleep modes not continuously interrupted by a system tick.
  2. Better overall jitter in ISR servicing.
  3. Higher resolution for system time and virtual timers because the timer frequency is no more constrained.
  • There are some things to consider:
  1. A new ChibiOS/RT port is more complex if the tickless mode has to be implemented.
  2. A special timer must be present in HW and dedicated to the tickless mode. It must be an up-counter with a comparator register. A 16 bits counter is sufficient however a 32 bits counter is recommended.
  3. The behavior of the system time within critical sections is slightly different, in tick mode the system time is not incremented, in tickless mode the time is always incremented because the timer counter register is used and it is not affected by the critical section.
  4. Slightly larger kernel image.

2.8.3 APIs

  • Virtual Timers API
函数名描述
virtual_timer_t虚拟定时器对象的类型。
chVTObjectInit()初始化虚拟定时器对象 virtual_timer_t
chVTSet()启动或重新启动虚拟定时器。
chVTSetI()启动或重新启动虚拟定时器(I-Class变体)。
chVTReset()停止,如果虚拟定时器处于活动状态。
chVTResetI()停止,如果虚拟定时器处于活动状态(I-Class变体)。
chVTIsArmedI()如果定时器已启用,则返回true。
chVTDoSetI()启动虚拟定时器,定时器必须尚未启用。稍微比 chVTSetI() 快一点。
chVTDoResetI()停止虚拟定时器,定时器必须已经启用。稍微比 chVTResetI() 快一点。

2.9 Chapter 9 - RT Scheduler

2.9.1 Basic concepts

  • RT Scheduler, ChibiOS/RT implements a strictly priority-based scheduling strategy, the module responsible for threads scheduling is called the scheduler. In this module are also defined the data structures used globally by the RTOS.
  • Scheduler Module, The ChibiOS/RT scheduler is the module responsible for threads scheduling, it also exports a low level API that is used by the other modules in order to implement synchronization primitives of any kind.

2.9.2 System Class

  • The System Class, ChibiOS/RT is designed to be upgrade-able to a multi-core capable RTOS. Because of this all the internal data structures are encapsulated into a single system class. In a single core implementation there is a single system object. When multi core MCUs will become common multiple system instances will be possible.
    在这里插入图片描述

2.9.3 Ready List

  • The ready list is probably the most important data structure in ChibiOS/RT. It is a closed bidirectional priority-ordered list of threads representing the threads eligible for execution.

在这里插入图片描述- Idle thread has the lowest priority level in the system (one), and is executed only when no other thread is ready for execution. The purpose of the idle thread is to define what the system does when there is nothing to do, usually it is an empty loop or a loop containing a single, architecture-dependent, “Wait for Interrupt” instruction that stops the CPU until a interrupt is detected. Stopping the CPU can reduce during idle times can reduce the system power consumption. One important details is that the idle thread can only be in the READY or CURRENT states, it is not allowed to go in any of the sleeping states nor to terminate. The idle thread is automatically created on system initialization and lasts until the system is shut down.

2.10 Chapter 10 - RT Threading

2.10.1 Basic concepts

  • RT Threading, The threading module is responsible for operations related to static threads. One important concept is the current thread, some functions inherently operate or the thread executing the function. The services of the threading module are:
  1. Declaration.
  2. Life Cycle.
  3. Delays.
  4. Threads References.
  5. Threads Queues.
  6. Thread Time.
  7. Priority Management.
  8. Round Robin.

2.10.2 APIs

  • Threads Declaration API
FunctionDescription
THD_WORKING_AREA()Statically allocates a working area for a thread.
THD_FUNCTION()Declares a thread function hiding eventual compiler-specific keywords.
  • Threads Management API
FunctionDescription
chThdGetSelfX()Returns a pointer to the current thread.
chThdCreateStatic()Creates and starts a static thread.
chThdCreateI()Creates a thread without starting it.
chThdStart()Starts a thread previously created using chThdCreateI().
chThdStartI()Starts a thread previously created using chThdCreateI().
chThdExit()Terminates the current thread returning a message.
chThdExitS()Terminates the current thread returning a message.
chThdWait()Waits for the specified thread to terminate then returns its exit message. The thread can be again created if necessary.
chThdTerminate()Sets the termination flag in the destination thread. The thread is not deleted but just asked to exit. The termination is cooperative.
chThdShouldTerminateX()Returns true if the current thread has the termination flag set.
chThdTerminatedX()Returns true if the specified thread is terminated.
  • Delays API

Thread delays are characterized by:

  1. The achievable resolution depends on the system tick frequency, if the frequency is 1000Hz then the delays resolution is 1mS.
  2. The time spent into a delays is used to run other threads, there is not busy waiting involved.
FunctionDescription
chThdSleep()Inserts a delay specified as number of system ticks, the delay is approximated to the next tick boundary.
chThdSleepSeconds()Inserts a delay specified in seconds, the delay is approximated to the next tick boundary.
chThdSleepMilliseconds()Inserts a delay specified in milliseconds. Note that the real resolution depends on system tick, the delay is approximated to the next tick boundary.
chThdSleepMicroseconds()Inserts a delay specified in microseconds. Note that the real resolution depends on system tick, the delay is approximated to the next tick boundary.
chThdSleepUntil()Sleeps until the system time counter reaches the specified value.
chThdSleepUntilWindowed()Special case of chThdSleepUntil() where a time window is specified.
  • Threads References API

There are two possible operations:

  1. Suspend, makes a NULL reference point to a thread.
  2. Resume, wakes up a waiting thread resetting the reference to NULL again.
FunctionDescription
chThdSuspendS()Suspends the invoking thread on a reference variable.
chThdSuspendTimeoutS()Suspends the invoking thread on a reference variable with a timeout specification.
chThdResume()Resumes a suspended thread.
chThdResumeI()Resumes a suspended thread (I-Class variant).
chThdResumeS()Resumes a suspended thread (S-Class variant).
  • Threads Queues API

Thread queues are a special kind of FIFO object, the following operations are defined:

  1. Enqueue, a thread enqueues itself and goes to sleep.
  2. Dequeue Next, wakes up the next thread in the queue if any.
  3. Dequeue All, wakes up all threads in the queue.
FunctionDescription
chThdQueueObjectInit()Initializes a thread queue object.
chThdQueueIsEmptyI()Returns true if the queue is empty.
chThdEnqueueTimeoutS()Enqueues the calling thread in the queue.
chThdDoDequeueNextI()Dequeues the next thread in the queue, the queue is assumed to contain at least one element.
chThdDequeueNextI()Dequeues the next thread in the queue, if any.
chThdDequeueAllI()Dequeues all thread in the queue, if any.
  • Priority Management API
FunctionDescription
chThdGetPriorityX()Returns the priority of the current thread.
chThdSetPriority()Changes the thread priority level, returns the old priority.
  • Round Robin API

Round robin scheduling can work in two distinct ways:

  1. Preemptive Round Robin. This mode is activated by setting CH_CFG_TIME_QUANTUM to a value greater than zero. In this mode the thread using the CPU is preempted by its peers after its time slot has been used.
  2. Cooperative Round Robin. This mode is activated by setting CH_CFG_TIME_QUANTUM to zero. In this mode the switch between threads at the same priority level is always cooperative. Cooperative mode is preferable because the kernel becomes slightly more efficient because it does not have to handle time slots.
FunctionDescription
chThdYield()The current thread relinquishes its time slice to the next thread in the round robin chain.

2.11 Chapter 11 - RT Counter Semaphores

2.11.1 Basic concepts

Counting semaphores have an internal signed counter variable, the value of the variable is the semaphore internal state. The meaning of the counter is:

  • N < 0. The semaphore is taken and there are -N threads queued.
  • N == 0. The semaphore is taken but there are no threads queued.
  • N > 0. The semaphore is not taken and can be taken N times.

在这里插入图片描述

ChibiOS/RT implements an extended version of the Dijkstra semaphores, there are several enhancements over the initial definition:

  • Reset Operation. In addition to the classic Wait and Signal operations a new Reset operation has been added. This operation is able to reset a semaphore counter to any non-negative value, all waiting threads are dequeued, if any.
  • Timeouts. The Wait operation has an optional timeout parameter, a queued thread is able to be dequeued if a Signal or Reset is not performed within the specified time interval.
  • Message. The Wait operation returns a message code indicating the way the thread has been signaled:

MSG_OK. The thread has taken the resource normally.
MSG_RESET. The thread was queued and a Reset operation has been performed on the semaphore. This is the default message, a variant of the reset operation can send any message code.
MSG_TIMEOUT. The thread was queued and a timeout occurred.

  • Atomic Signal and Wait. A Signal operation is performed on a semaphore and a Wait operation is performed on another semaphore atomically.

2.11.2 APIs

FunctionDescription
semaphore_tType of a counter semaphore object.
SEMAPHORE_DECL()Semaphore static initializer.
chSemObjectInit()Initializes a semaphore object of type semaphore_t.
chSemWait()Performs a Wait operation on the semaphore.
chSemWaitS()Performs a Wait operation on the semaphore (S-Class variant).
chSemWaitTimeout()Performs a Wait operation on the semaphore with timeout specification.
chSemWaitTimeoutS()Performs a Wait operation on the semaphore with timeout specification (S-Class variant).
chSemSignal()Performs a Signal operation on the semaphore.
chSemSignalI()Performs a Signal operation on the semaphore (I-Class variant).
chSemReset()Performs a Reset operation on the semaphore.
chSemResetI()Performs a Reset operation on the semaphore (I-Class variant).
chSemResetWithMessage()Performs a Reset operation on the semaphore sending a custom message.
chSemResetWithMessageI()Performs a Reset operation on the semaphore sending a custom message (I-Class variant).
chSemResetI()Performs a Reset operation on the semaphore (I-Class variant).
chSemAddCounterI()Adds a constant to the semaphore counter, threads are dequeued as required (I-Class variant).
chSemSignalWait()Atomically performs a Signal on a semaphore and a Wait on another semaphore.
chSemGetCounterI()Returns the current value of the semaphore counter (I-Class variant).
chSemFastWaitI()Faster version of Wait usable in those conditions where the counter is known to be greater than zero, it is a pure decrement (I-Class variant).
chSemFastSignalI()Faster version of Signal usable in those conditions where the counter is known to be non-negative, it is a pure increment (I-Class variant).

2.12 Chapter 12 - RT Mutexes, Condition Variables and Monitors

2.12.1 Basic concepts

  • Mutexes are the mechanism meant to implement mutual exclusion in the most general way. There is often confusion between Mutexes and Semaphores, both are apparently able to solve the same problem but there are important differences:
  1. Mutexes have an owner attribute, semaphores do not have owners. Because of this mutexes can only be unlocked by the same thread that locked them. This is not required for semaphores that can be unlocked by any thread or even ISRs.
  2. Mutexes can implement protocols to handle Priority Inversion, knowing the owner is required in order to be able to implement Priority Inheritance or Priority Ceiling algorithms. ChibiOS/RT mutexes implement the Priority Inheritance algorithm with no restrictions on the number of threads or the number of nested mutual exclusion zones.
  3. Mutexes can be implemented to be recursive mutexes, this means that the same thread can lock the same mutex repeatedly and then has to unlock it for the same number of times. In ChibiOS/RT mutexes can be made recursive by activating a configuration option.

在这里插入图片描述
在这里插入图片描述

  • Condition variables are an additional construct working with mutexes in order to form Monitor constructs much similar, in behaviour, to the Java synchronized constructs.

A condition variable is basically a queue of threads, the function chCondWait() performs atomically the following steps;

  1. Releases the last acquired mutex.
  2. Puts the current thread in the condition variable queue.

When the queued thread is kicked out of the queue using chCondSignal() or chCondBroadcast() then it:

  1. Re-acquires the mutex previously released.
  2. Returns from chCondWait().

在这里插入图片描述

2.12.2 APIs

  • Mutexes API
FunctionDescription
mutex_tType of a mutex object.
MUTEX_DECL()Mutexes static initializer.
chMtxObjectInit()Initializes a mutex object of type mutex_t.
chMtxLock()Locks the specified mutex.
chMtxLockS()Locks the specified mutex (S-Class variant).
chMtxTryLock()Tries to lock a mutex, exits without waiting.
chMtxTryLockS()Tries to lock a mutex, exits without waiting (S-Class variant).
chMtxUnlock()Unlocks the next owned mutex in reverse lock order.
chMtxUnlockS()Unlocks the next owned mutex in reverse lock order (S-Class variant).
chMtxUnlockAll()Unlocks all mutexes owned by invoking thread.
  • Condition Variables API
FunctionDescription
condition_variable_tType of a condition variable object.
CONDVAR_DECL()Condition variables static initializer.
chCondObjectInit()Initializes a condition variable object of type condition_variable_t.
chCondSignal()Signals a condition variable.
chCondSignalI()Signals a condition variable (I-Class variant).
chCondBroadcast()Broadcasts a condition variable.
chCondBroadcastI()Broadcasts a condition variable (I-Class variant).
chCondWait()Releases latest owned mutex and enters condition variable wait queue.
chCondWaitS()Releases latest owned mutex and enters condition variable wait queue (S-Class variant).
chCondWaitTimeout()Releases latest owned mutex and enters condition variable wait queue with timeout specification.
chCondWaitTimeoutS()Releases latest owned mutex and enters condition variable wait queue with timeout specification (S-Class variant).

3. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】Ardupilot开源飞控之ChibiOS简介
【3】 ChibiOS官方文档

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

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

相关文章

两线制无源 4-20mA 回路供电隔离变送器

两线制无源 4-20mA 回路供电隔离变送器 一入一出两线制无源 4-20mA 回路供电隔离变送器 概述&#xff1a;JSD TAW-1001D-100L-F 系列隔离变送器是 4-20mA 两线制回路供电的电流隔离变送配电器,该隔离变送器采用电磁隔离技术,并通过输入端馈电方式,给输入端两线制仪器仪表设备供…

数据库 02-03补充 聚合函数--一般聚合分组和having

聚合函数&#xff1a; 01.一般的聚合函数&#xff1a; 举个例子&#xff1a; 一般聚合函数是用于单个元祖&#xff0c;就是返回一个数值。 02.分组聚合&#xff1a;可以返回多个元祖 举个例子&#xff1a; 分组的注意&#xff1a; 主要的是根据分组的话&#xff0c;一个…

【git push ERROR: commit id: missing Change-Id in message footer】

使用 gerrit 后&#xff0c;提交代码会出现如下截图问题&#xff1a; 临时解决&#xff1a; step1: 把上面红色的那条gitidir复制下来执行下&#xff1a; step2:执行下面的命令会添加change_id git commit --amendstep3: 然后推送代码到服务器上 git push origin HEAD:refs/fo…

万界星空科技电子装配行业MES解决方案

电子电器装配属于劳动密集型、科技含量较高的行业&#xff0c;产品零部件种类繁多&#xff0c;生产组装困难&#xff0c;生产过程存在盲点&#xff0c;同时也决定了生产流水线多且对自动化水平要求较高。 万界星空科技提供的电子行业MES解决方案&#xff0c;提供从仓储管理、生…

排序算法:【选择排序]

一、选择排序——时间复杂度 定义&#xff1a;第一趟排序&#xff0c;从整个序列中找到最小的数&#xff0c;把它放到序列的第一个位置上&#xff0c;第二趟排序&#xff0c;再从无序区找到最小的数&#xff0c;把它放到序列的第二个位置上&#xff0c;以此类推。 也就是说&am…

STM32 CAN多节点组网项目实操 挖坑与填坑记录

摘要 CAN线性组网项目开发过程中遇到的数据丢包问题&#xff0c;并尝试解决的记录和推测分析。 关键词 CAN串联多节点通讯、CAN10节点通讯、CAN数据丢包、STM32 CAN 背景/项目介绍 概述&#xff1a; 开发了一个多节点线性组网采集数据的项目。 系统包含1个供电和数据网关板还有…

如何利用Guava优化Java网络编程

第1章&#xff1a;引言 大家好&#xff01;今天小黑要和咱们聊聊一个很酷的话题&#xff1a;如何利用Google的Guava库来优化Java网络编程。网络编程&#xff0c;这玩意儿听起来就高大上&#xff0c;不是吗&#xff1f;但实际上&#xff0c;它充满了各种挑战。从处理复杂的数据…

【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations &#xff0c;其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所有城…

OpenHarmony创新赛人气投票活动,最佳人气作品由你来定!

12月1日至12月15日 十大入围作品线上投票激战正酣 最佳人气作品&#xff0c;由你来定&#xff01; 投票链接&#xff1a;OpenHarmony创新赛人气作品投票正式开启——最佳人气作品&#xff0c;由你来定&#xff01; - 文章 OpenHarmony开发者论坛

uniCloud(一) 新建项目、初始化服务空间、云对象访问测试

一、新建一个带有unicloud 二、创建一个服务空间 1. 右键uniCloud&#xff0c;关联云服务空间 我当前没有服务空间&#xff0c;需要新建一个服务空间&#xff0c;之后将其关联。初始化服务空间需要的时间有点长 服务空间初始化成功后&#xff0c;刷新HBuilder&#xff0c;勾选…

vue3使用Mars3D写区块地图

效果图 引入相关文件 因为我也是第一次使用&#xff0c;所以我是把插件和源文件都引入了&#xff0c;能使用启动 源文件 下载地址&#xff1a; http://mars3d.cn/download.html 放入位置 在index.html中引入 <!--引入cesium基础lib--><link href"/static/C…

互联网加竞赛 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

【Docker】从零开始:18.使用Dockerfile构造自己的KingbaseES数据库镜像

【Docker】从零开始&#xff1a;17.使用Dockerfile构造自己的数据库镜像 新建一个自定义目录并创建Dockerfile文件上传需要的文件到自定义目录下注意docker-circle-init.sh文件内容password 内容 开始打包注意打包完成后执行 尝试用工具连接数据库 kingbase.tar.gz 包过大我就上…

阻抗控制实现更快更精准(跟踪精度,较小且稳定的接触力)

阻抗控制是一种模拟人类肌肉阻抗特性的控制方法&#xff0c;可以实现更快更精准的机器人运动控制&#xff0c;同时具有较小的接触力和稳定的跟踪精度。 Kd 10; Bd 5 ; Md 2; 1e5/(0.0005*s^25*s1) 5e4/(0.1*s^21*s1) 1e4/(0.1*s^21*s1) 增益较小时容易跟踪性能不足&#xf…

机房末端配电中机柜PDU是如何工作的?

鉴于IDC数据中心7*24小时的运营要求以及对电源效率的日益关注&#xff0c;机柜PDU&#xff08;Power Distribution Unit&#xff0c;电源分配单元&#xff09;已成为数据中心基础设施的重要组成部分。在很多初次接触机柜PDU的人看来&#xff0c;其作用看上去类似于简单的插线板…

用心研发好产品:健康品牌podeey是如何做到的?

在分析消费者健康需求的同时&#xff0c;美国podeey能量生命有限公司&#xff08;PODEEY Biotechnology LLC.&#xff09;不断提升自主研发实力&#xff0c;并且一直注重汇集全球前沿的研发力量&#xff0c;与贵州宏臻菌业达成战略合作&#xff0c;始终致力于以科学技术为核心&…

微信小程序js数组对象根据某个字段排序

一、排序栗子 注: 属性字段需要进行转换,如String类型或者Number类型 //升序排序 首元素(element1)在前 降序则(element1)元素在后 data data.sort((element1, element2) >element1.属性 - element2.属性 ); 二、代码 Page({/*** 页面的初始数据*/data: {user:…

Axure RP 9 入门教程

1. Axure简介 Axure 是一个交互式原型设计工具&#xff0c;可以帮助用户创建复杂的交互式应用程序和网站。Axure 能够让用户快速构建出具有高度可交互性的原型&#xff0c;可以在团队中进行协作、分享和测试。 使用 Axure 可以设计出各种不同类型的原型&#xff0c;包括网站、移…

windows下安装git中文版客户端

下载git Windows客户端 git客户端下载地址&#xff1a;Git - Downloads 我这里下载的是Git-2.14.0-64-bit.exe版本 下载TortoiseGit TortoiseGit客户端下载地址&#xff1a;Download – TortoiseGit – Windows Shell Interface to Git TortoiseGit客户端要下载两个&#…

C++学习笔记(十一)------has_a和use_a关系

文章目录 前言 一、has_a关系 1.1 has_a概念 1.2 has_a中构造和析构的顺序 1.3 has_a对象的内存情况 二、use_a关系&#xff08;友元关系&#xff09; 1.友元函数&#xff1a; 2.友元类 3 使用多文件编程的方式重新编辑上述代码 总结 前言 随着技术的革新&#xff0c;出现各种各…