FreeRTOS学习-中断管理

2023-05-16

1. 简介

中断管理是一个操作系统中最核心的功能之一。在FreeRTOS中,中断总是可以打断task(尽管是最高优先级的task),而task永远不可能打断中断ISR(interrupt service routine)。本文先介绍了FreeRTOS中的中断管理,然后介绍了中断处理函数中如何使用FreeRTOS的API,最后介绍了中断处理函数与任务之间的同步方法——信号量。

2. 中断处理流程

2.1. 中断系统的初始化

在FreeRTOS中,中断向量表的定义在Port层完成,在GCC ARMv7中,其基本形式如下:

.extern FreeRTOS_IRQ_Handler
.extern FreeRTOS_SWI_Handler

.section .vectors
_vector_table:
_freerots_vector_table:
    B       _boot
    B       Undefined
    LDR     PC, _swi
    B       PrefetchAbortHandler
    B       DataAbortHandler
    NOP
    LDR     PC, _irq
    B       FIQHandler

_irq:   .word   FreeRTOS_IRQ_Handler
_swi:   .word   FreeRTOS_SWI_Handler

其中,.vectors段在链接脚本中与.text段关联,并且被放置在.text的首位。

portmacro.h中定义了extern void vPortInstallFreeRTOSVectorTable( void )函数用于装载该中断向量(由Port层实现)。在ARMv7中并不一定需要装载,因为可以默认从0x00000000访问。对于ARMv8,则需要在开启调度器的时候装载中断向量表的地址。

此外,中断控制器的初始化也需要在Port层完成。而中断所使用的栈则是在_boot中完成。

2.2. 中断处理

这里我们不讨论硬件级别的行为,只考虑OS需要完成的软件行为。并且,我们以ARMv7为例,中断仅限于IRQ异常的处理。

当中断发生时,CPU会跳转到异常向量表中IRQ的异常向量处,执行一个跳转指令跳转到FreeRTOS_IRQ_Handler

FreeRTOS_IRQ_Handler中,进行OS级别的中断处理:

  1. 调整返回地址:LR -= 4

  2. 将IRQ的LR和SPSR压入IRQ栈

  3. 切换到SVC模式:此时依然处于中断屏蔽状态

  4. 将寄存器上下文压栈:PUSH {R0-R4, R12}

  5. 增加中断嵌套层数:使用了R3存储ulPortInterruptNesting的地址,R1存储中断嵌套层数的原始值

  6. 读取GIC的CPU接口中的IAR,获取中断ID:表示CPU正在处理该中断

  7. 确保栈地址是4字节对齐:使用R2记录调整量

  8. 保存顶级中断响应函数的上下文:PUSH {R0-R4, LR},这里把R4也压栈是为了让栈满足32位地址对齐。

  9. 调用FreeRTOS_ApplicationIRQHandler:该函数主要完成下列操作

    {
        读取中断ID,调用GIC驱动中注册的对应的响应函数。
    }
    
  10. 恢复顶级中断响应函数的上下文:POP {R0-R4, LR}

  11. 恢复栈地址

  12. 屏蔽中断:CPSID i

  13. 通过EOIR通知GIC中断处理完成

  14. 恢复中断嵌套层数

  15. 如果中断嵌套层数不为0,那么直接跳转到不进行任务切换的中断退出,否则继续向下执行

  16. ulPortYieldRequired == pdTRUE,表明退出中断前需要进行一次任务切换:R1记录ulPortYieldRequired的地址。

不进行任务切换的中断退出:

  1. 恢复被中断的现场:POP {R0-R4, R12}
  2. 切换到IRQ模式
  3. 恢复LR和SPSR
  4. 从中断返回:MOVS PC, LR

进行任务切换的中断退出:任务切换部分可参看任务切换小节

  1. 清除ulPortYieldRequired标志
  2. 恢复被中断的现场:POP {R0-R4, R12}
  3. 切换到IRQ
  4. 恢复LR和SPSR
  5. 保存切出任务的上下文(portSAVE_CONTEXT
  6. 执行任务切换(vTaskSwitchContext()
  7. 恢复切入任务的上下文(portRESTORE_CONTEXT

2.3. 对浮点的支持

在ARM CA9中,支持NEON和VFP硬件浮点。如果开启了NEON和VFP硬件支持,GCC通常会使用向量化编译优化memcpy()memset()等类似函数的实现(而FreeRTOS的队列的实现基于memcpy())。这便意味着对其调用则可能破坏对应的浮点寄存器,对于中断处理函数而言,这通常是不符合预期的。因为默认情况下,中断处理过程中不会保护浮点上下文,因此如果ISR中使用了这类函数,那么它可能会影响在任务中执行的浮点运算的结果。

为了解决该问题,FreeRTOS提供了FPU-Safe版本的中断处理实现,即在中断处理中增加浮点上下文的保护。这种实现的缺点很明显,就是会降低中断处理的性能(因为浮点寄存器的保护和增加内存访问的时间)。

此外,还有另外一种解决方式,则是在临界区内使用硬件浮点运算。那就不存在中断打断的问题了。

2.4. 中断嵌套

对于支持中断嵌套的Port,需要在FreeRTOSConfig.h中定义如下宏定义;

描述
configMAX_SYSCALL_INTERRUPT_PRIORITYconfigMAX_API_CALL_INTERRUPT_PRIORITY定义了可调用FreeRTOS的API的最高中断优先级,其中configMAX_SYSCALL_INTERRUPT_PRIORITY用于旧版本的FreeRTOS Port中
configKERNEL_INTERRUPT_PRIORITYTick中断的优先级,必须设置为最低的中断优先级,这个宏在不同Port中名字不一样

只有优先级大于configMAX_SYSCALL_INTERRUPT_PRIORITY(数值上可能是低于它)的中断,才允许中断当前的中断处理。并且,要求这些中断响应函数不能调用FreeRTOS的API。

3. 在ISR中使用FreeRTOS API

3.1. 中断安全API

在FreeRTOS中,某些系统调用提供了任务上下文和中断上下文的调用版本。对于带有FromISR后缀的API则是中断上下文的版本。

引入这种两种上下文分离的API的优势:使得任务上下文和中断上下文的调用都更加高效,因为

  • 不需要判断调用者所处上下文。
  • API的参数可能不是共享的,即有的参数对于任务上下文来说是无用的,有的参数则对于中断上下文而言是无用的。
  • 每个Port都需要实现中断上下文的判断。

使用分离的API的劣势通常是在使用三方代码时,有的时候必须同时在任务上下文和中断上下文中调用FreeRTOS的API,解决方案通常是:

  • 可以将中断处理推迟到任务中处理。
  • 实现调用上下文的判断,根据所处上下文来调用合适的API。

3.2. xHigherPriorityTaskWoken参数

在中断处理中,如果调用了某些API使得比被中断的任务更高优先级的任务被唤醒了,那么在退出中断之前,可以触发一次调度。而是否具有更高优先级的任务被唤醒的标志就是xHigherPriorityTaskWoken。它通常用于在FromISR后缀的函数中作为输出参数。如果xHigherPriorityTaskWoken == pdTRUE,表示有比被中断的task更高优先级的task被唤醒,需要进行上下文切换。当然,程序员也可以选择不进行切换。

为什么不能直接在API里面触发调度呢,有以下一些原因:

  • 避免不必要的任务切换:例如Uart Shell,不必要为每一个字符都进行一次调度;
  • 控制程序的执行:中断总是随机的,但有时会有任务不能被中断切换的需求(此时需要挂起调度器);
  • 更高的可移植性:可以在所有平台中使用;

当然如果不想使用这个参数,被唤醒的任务也会在下一次调度时进行被选中执行。

3.3. portYIELD_FROM_ISR()和portEND_SWITCHING_ISR()宏

两者完全相同,用于发出一个上下文切换请求。是taskYIELD()的中断安全版本。

3.4. portASSERT_IF_INTERRUPT_PRIORITY_INVALID()宏

对于某些支持中断嵌套的FreeRTOS port,FreeRTOS引入了Maximum System Call (或Maximum API Call)中断优先级的概念。在进入临界区时,所有不大于该优先级的中断都会被屏蔽;反之,所有高于该优先级的中断不会被屏蔽,但在他们的中断处理函数中,不能调用FreeRTOS的API。

portASSERT_IF_INTERRUPT_PRIORITY_INVALID()宏就是为了检测当前中断优先级是否有效。

4. 延迟的中断处理

这部分的设计思路与Linux中的中断处理的上、下半部类似。这是为了尽可能减少ISR的处理逻辑,将耗时的任务放在任务上下文进行处理。

基本思路是通过FreeRTOS的同步机制,在任务上下文等待某些指定事件,这些事件由中断产生;当事件发生时,激活任务执行对应的处理。

在FreeRTOS中,同步机制包括队列、事件组、信号量和IPC等。这里只介绍信号量。

4.1. 集中式延迟中断处理

在软件定时器管理文章中的PendFunction章节提到了延迟函数调用,因此,可以使用这个功能来实现集中式的延迟中断处理。

需要注意的是,在中断上下文中,应该使用ISR安全的APIxTimerPendFunctionCallFromISR()

使用RTOS Timer Task的优势:

  • 更低的资源使用
  • 简单

劣势:

  • 灵活性有限:优先级是固定的
  • 更低的确定性:因为会先处理已在队列中的请求。

5. 信号量

信号量是用于任务和任务之间,任务与中断处理之间的同步机制。它不能传递消息,只实现同步功能。如果需要传递消息,可通过队列实现。

但实际上,在FreeRTOS中,信号量是基于队列实现的,所以总的来说,他们的性能相差不大。

信号量可分为二值信号量和计数信号量,实质上,二值信号量是一种特殊的计数信号量。他们的区别在于创建的流程不同,其他接口完全一致。

下面则分别来看看它们的具体设计和实现。

由于FreeRTOSv9中,队列和信号量的实现大部分耦合在同一个函数中了,而FreeRTOSv10将这部分功能解耦,更易于理解和维护,因此这里基于FreeRTOSv10的实现进行介绍。

5.1. 二值信号量

5.1.1. 创建二值信号量

函数原型:configSUPPORT_DYNAMIC_ALLOCATION == 1

#define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, senSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )

创建一个二值信号量,并返回该信号量的句柄。此时返回的信号量数值为0。详细的实现过程可以参看队列管理文章中的创建队列小节。

FreeRTOS还提供了静态创建的版本,这里不再赘述。

5.1.2. 获取信号量

函数原型:

#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )

xSemphore获取一个信号量,当且仅当该信号量可用时。可设置等待的时间xBlockTime。如果在指定时间内获取成功,则返回pdTRUE;否则返回pdFALSE

这里只关注信号量的部分。其中与互斥锁相关的实现将在后续介绍共享资源管理的文章中给出。获取信号量的具体实现如下:

获取信号量

5.1.3. 归还信号量

函数原型:

#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

归还信号量xSemaphore。如果成功归还,则返回pdTRUE;如果该信号量之前从未被获取,则返回pdFALSE

具体的实现可参看队列管理文章中的入队操作。

需要注意的是,该接口只用于任务上下文。对于中断上下文,需要使用以下接口:

#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) )

其实现与xQueueGenericSendFromISR()类似,只是其消息长度为0,下面看见其具体的实现:

{
    初始化`pxQueue = ( Queue_t * ) xQueue`。

    参数校验:Assert `pxQueue != NULL`,`pxQueue->uxItemSize == 0`,`!( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->pxMutexHolder != NULL ) )`。

    校验中断优先级(`portASSERT_IF_INTERRUPT_PRIORITY_INVALID()`)。

    进入临界区,并保存当前的中断优先级屏蔽状态(`uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR()`)。
    获取队列当前的消息数量(`uxMessagesWaiting = pxQueue->uxMessagesWaiting`)。

    如果队列的消息未满(`uxMessagesWaiting < pxQueue->uxLength`):
    {
        获取当前的队列计数写锁(`cTxLock = pxQueue->cTxLock`)。

        由于这里不需要考虑互斥锁的情况,所以不需要考虑优先级继承的情况,只是单存的增加队列的消息计数(`pxQueue->uxMessagesWaiting = uxMessagesWaiting + 1`)。

        如果队列处于计数写锁为加锁状态(`cTxLock == queueUNLOCKED`):
        {
            (仅开启USE_QUEUE_SETS):
            {
                如果队列处于某个队列组中(`pxQueue->pxQueueSetContainer != NULL`):
                {
                    将消息通知到队列组,如果高优先级的任务被唤醒(`prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) != pdFALSE`),设置更高优先级任务唤醒标志(`*pxHigherPriorityTaskWoken = pdTRUE`)。
                }
                否则,即队列不在任何队列组中:
                {
                    如果有任务等待该队列的消息(`listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE`):
                    {
                        将任务从事件任务队列中唤醒,且唤醒了更高优先级的任务(`xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) )`),设置更高优先级任务唤醒标志(`*pxHigherPriorityTaskWoken = pdTRUE`)。
                    }
                }
            }
        }
        否则,即队列处于加锁状态:
        {
            将队列写计数锁增1(`pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 )`)。
        }

        设置返回值`xReturn = pdPASS`。
    }
    否则,即队列消息已满:
    {
        设置返回值`xReturn = errQUEUE_NULL`。
    }

    退出临界区,并恢复中断优先级屏蔽状态(`portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus )`)。

    返回`xReturn`。
}

5.1.4. 获取信号量数值

函数原型:

#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )

返回信号量当前的可用数量。

详细实现可参看队列管理文章中的查询队列状态小节。

5.1.5. 删除信号量

函数原型:

#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) )

具体实现可参看队列管理文章中的删除队列小节。

5.2. 计数信号量

计数信号量的主要作用:

  • 计算事件的发生次数,每发生一次事件则计数增1,而获取事件时减1。使用时,通常初始化为0
  • 资源管理:计数值表示资源的数量,当资源被分配时计数减1,归还时增1。使用时,通常初始化为资源的数量

5.2.1. 创建计数信号量

函数原型:需要开启configUSE_COUNTING_SEMAPHORES = 1

#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )

该函数实际上调用的是xQueuCreateCountingSemaphore()接口,其中uxMaxCount表示计数信号量的最大值,uxInitialCount是初始值。如果创建成功,则返回信号量的句柄。

下面来看看其具体实现:

{
    参数校验:Assert `uxMaxCount != 0`, `uxInitialCount <= uxMaxCount`。

    创建队列(`xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queuQUEUE_TYPE_COUNTING_SEMAPHORE )`)。

    如果创建成功(`xHandle != NULL`):
    {
        初始化队列消息数量(`( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount`)。
    }

    返回`xHandle`。
}

可以看到,最终还是通过xQueueGenericCreate()创建了一个队列。

5.3. 信号量的实现细节

5.3.1. 信号量的接口

5.3.1.1. 信号量的句柄

句柄定义:

typedef QueueHandle_t SemaphoreHandle_t;

可以看到,信号量的句柄实际上就是队列的句柄。

5.3.2. 信号量的内涵

5.3.2.1. 信号量的私有宏

定义了信号量的消息长度和队列长度:

#define semBINARY_SEMAPHORE_QUEUE_LENGTH    ( ( uint8_t ) 1U )
#define semSEMAPHORE_QUEUE_ITEM_LENGTH      ( ( uint8_t ) 0U )
#define semGIVE_BLOCK_TIME                  ( ( TickType_t ) 0U )

6. 在ISR中使用队列

在队列管理文章中提到,中断上下文中也可以使用队列功能,但需要注意的是,需要调用ISR安全的接口,例如xQueueSendToFrontFromISR()xQueueSendToBackFromISR()

通常不建议在ISR中传输频繁抵达的数据,取而代之的是可以采用如下方法:

  • 使用DMA
  • 使用线程安全的buffer作为中转
  • 在ISR中进行数据处理,然后将处理后的数据通过队列传给task
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习-中断管理 的相关文章

  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • FreeRTOS内核配置说明---FreeRTOS Kernel V10.2.1

    FreeRTOS内核是高度可定制的 使用配置文件FreeRTOSConfig h进行定制 每个FreeRTOS应用都必须包含这个头文件 用户根据实际应用来裁剪定制FreeRTOS内核 这个配置文件是针对用户程序的 而非内核 因此配置文件一般
  • FreeRTOS config开始的宏

    FreeRTOSConfig h系统配置文件中可以自定义 FreeRTOS h中定义默认值 configAPPLICATION ALLOCATED HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的 将宏configAPPLIC
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • 【FreeRTOS】任务通知的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • 浅谈机场综合布线运维工作中的难点问题

    随着系统规模越来越大 体系越来越复杂 信息系统的作用越来越明显 运维保障的要求越来越高 xff0c 综合布线维护工作面临的问题也愈加凸显 以下以国内某大型机场在综合布线运维工作中面临的实际问题为例 xff0c 给大家分享综合布线运维利器 耐
  • 关于集成商转型

    前言 xff1a 集成商转型是一个老生常谈的话题 xff0c 集成服务一直以来就随着IT行业趋势而发展 xff0c IT行业从最初的硬件主导到硬件软件化 xff0c 再到软件服务化 xff0c 大趋势或将发展至服务产品化 xff0c 行业趋
  • centos系统开启vncserver

    yum y install tigervnc server 这个是安装命令 安装好以后输入vncserver就能开启 第一次开启会让设置密码 这个密码是用户vncclient 连接的时候需要输入的密码 vncserver kill 1 这个
  • 升降横移式立体车库设计机械设计毕业设计全套资料

    资源下载 下载地址如下1502 xff1a https docs qq com doc DTlRSd01BZXNpRUxl 本文选用了社会需求大 xff0c 最常见的一种立体车库 升降横移式立体停车库 介绍和分析了升降横移式立体停车库的结构
  • 在NVIDIA Jetson 平台上运行Deepstream速度慢的常见解决办法

    NVIDIA发布了最新的Deepstream 4 0 光说不练假把式 xff0c 光练不说傻把式 xff0c 不少用户发现在Jetson嵌入式平台上运行Deepstream会遭遇到速度变慢 xff0c 今天汇总几个常见解决方案 xff1a
  • Ubuntu18.04 安装ROS Melodic(官方版) 之不使用科学方法

    此前记录了官方安装流程 xff0c 参见Ubuntu18 04 安装ROS Melodic 官方版 xff0c 但是受限于无法访问raw githubusercontent com xff0c 需科学方法才能成功安装 xff0c 带来诸多不
  • 分层存储Stratis和管理快照

    分层存储Stratis Stratis称为卷管理文件系统 xff0c 以管理物理存储设备池的服务形式运行 xff0c 透明的为所创建的文件系统创建和管理卷 相较于Lvm操作简化了 xff0c Stratis可以动态管理卷层 xff0c 不需
  • 报错:AttributeError: NoneType object has no attribute device

    今天搞个测试 xff0c 测试是在horovod下进行的 问题就出在加载权重 xff08 参数 xff09 文件的地方 xff0c 加载权重命令load weights前要先build一下 xff0c 结果就build出这么一个错误 xff
  • ARM安装python模块

    ARM机器安装python模块绝对不不不不可以直接pip xff01 xff01 xff01 这里演示的是CentOS xff0c 其他linux系统类似 Step1 安装必备 yum install epel release yum in
  • k8s源码编译运行

    本文参考视频 xff1a https www bilibili com video BV1WK41137JA from 61 search amp seid 61 10758236638727752345 0 一定要用root用户 sudo
  • 腾讯vCUDA(gpu-manager)部署

    官网 xff1a https github com tkestack gpu manager 先夸赞一下腾讯的开源精神 xff0c 再吐槽一下 xff0c 官方README写的真是过于随意了 踩了一堆坑 xff0c 终于部署并测试成功了 下
  • 127.0.0.1:xxxx端口映射到物理机IP

    一个应用的Dashboard访问地址是127 0 0 1 8265 xff0c 但是我没有权限使用物理机的浏览器查看 xff0c 只能远程命令行访问机器 xff0c 该机器IP是10 18 127 2 xff0c 所以需要用如下命令映射一下
  • Debian解决Error opening terminal: xterm错误

    在Debian中n中无交互界面安装oneAPI遇见了Error opening terminal xterm报错 使用如下命令亲测可以解决 xff1a mkdir p usr share terminfo x cd usr share te
  • Nsight Compute(NCU) Scheduler Statistics 数据解读

    本文内容主要参考YT上的这个视频 xff1a https www youtube com watch v 61 nYSdsJE2zMs Warp硬件架构介绍 以Volta架构为例 xff0c 每个SM有4个Warp Scheduler xf
  • 【分享】那些免魔法的chatGPT,GPT最佳实践

    ChatGPT 问世 xff0c 犹如平地惊雷般 xff0c 在技术圈中引起了广泛讨论 作为全球最大的开发者社区 xff0c GitHub 平台也在近期诞生了多个 ChatGPT 相关的开源项目 xff0c 其数量之多 xff0c 可谓是见
  • tf.layers.dropout用法

    dropout xff1a 一种防止神经网络过拟合的手段 随机的拿掉网络中的部分神经元 xff0c 从而减小对W权重的依赖 xff0c 以达到减小过拟合的效果 注意 xff1a dropout只能用在训练中 xff0c 测试的时候不能dro
  • matplotlib中cla() clf() close()用途

    cla Clear axis即清除当前图形中的当前活动轴 其他轴不受影响 clf Clear figure清除所有轴 xff0c 但是窗口打开 xff0c 这样它可以被重复使用 close Close a figure window
  • 2020计算机视觉领域顶级会议时间表

    CVPR IEEE Conference on Computer Vision and Pattern Recognition Location United States Date June 2020 Deadline TBD about
  • 【论文翻译】-- GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition

    本文是复旦大学发表于 AAAI 2019 的工作 截至目前CASIA B正确率最高的网络 英文粘贴原文 xff0c google参与翻译但人工为主 有不对的地方欢迎评论 粉色部分为本人理解添加 xff0c 非原文内容 目录 摘要 1 介绍
  • FreeRTOS学习-中断管理

    1 简介 中断管理是一个操作系统中最核心的功能之一 在FreeRTOS中 xff0c 中断总是可以打断task xff08 尽管是最高优先级的task xff09 xff0c 而task永远不可能打断中断ISR xff08 interrup