提供网站建设公司哪家好/宁波seo在线优化方案

提供网站建设公司哪家好,宁波seo在线优化方案,做网站首先要干什么,彩票的网站怎么做的在FreeRTOS中,数字优先级越小,逻辑优先级也越小;在任务创建时,会根据任务的优先级将任务插入就绪列表不同的位置。 List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就绪列表是一个数组,数组中存储的是就绪任务TCB(…

        在FreeRTOS中,数字优先级越小,逻辑优先级也越小;在任务创建时,会根据任务的优先级将任务插入就绪列表不同的位置。

        List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就绪列表是一个数组,数组中存储的是就绪任务TCB(任务控制块通过自己的钩子<TCB中的xStateListItem节点>挂上了List_t)。

        创建任务时,a. 会根据任务的优先级将任务插入就绪列表数组的不同的位置;

       b.  相同优先级的任务插入就绪列表数组中的同一条链表中。

        要想任务支持优先级,即只要实现在任务切换(taskYIELD)时,让pxCurrentTCB指向最高优先级的就绪任务的TCB既可以。

重要数据

0.  全局TCB指针

/* 当前正在运行的任务的任务控制块指针,默认初始化为NULL */
TCB_t * volatile pxCurrentTCB = NULL;

要想让任务支持优先级,即只要实现任务切换(portYIELD)时,让pxCurrentTCB指向最高优先级的就绪任务的TCB即可。

1. 静态变量:uxTopReadyPriority

位置:在task.c文件中定义;静态变量;

static volatile UBaseType_t uxTopReadyPriority         = tskIDLE_PRIORITY;

表示创建的任务的最高优先级,默认初始化为0,即空闲任务的优先级。

数值越大,优先级越高;

2. 修改任务控制块:增加一变量

        增加了一个变量:UBaseType_t            uxPriority;

描述任务块的优先级。

typedef struct tskTaskControlBlock
{volatile StackType_t    *pxTopOfStack;    /* 栈顶 */ListItem_t			    xStateListItem;   /* 任务节点 */StackType_t             *pxStack;         /* 任务栈起始地址 *//* 任务名称,字符串形式 */char                    pcTaskName[ configMAX_TASK_NAME_LEN ];TickType_t xTicksToDelay;UBaseType_t			uxPriority;    
} tskTCB;
typedef tskTCB TCB_t;

3. 全局任务数

static volatile UBaseType_t uxCurrentNumberOfTasks     = ( UBaseType_t ) 0U;

static UBaseType_t uxTaskNumber                     = ( UBaseType_t ) 0U;

此处有一个疑问:这个变量做什么用?

        查找当前最高优先级的就绪任务,给uxTopReadyPriority 赋值,给pxCurrentTCB赋值,有两种方法。

两种方法

        查找最高优先级的就绪任务有两种方法,具体由宏configUSE_PORT_OPTIMISED_TASK_SELECTION控制,定义为0选择通用方法,定义为1选择根据处理器优化的方法,该宏默认在portmacro.h文件中定义为1,即使用优化过的方法。

#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#endif

      该功能主要是通过四个宏来实现:

        taskRECORD_READY_PRIORITY( uxPriority )   :记录就绪最高优先级的就绪任务uxTopReadyPriority 赋值;

        taskSELECT_HIGHEST_PRIORITY_TASK():在任务列表中寻找就绪最高优先级的就绪任务,获取优先级最高的就绪任务的TCB,然后更新到pxCurrentTCB;

        taskRESET_READY_PRIORITY( uxPriority )

        portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority )

通用方法

        在通用方法中实现了上面的宏1、宏2;宏3~4为空。

两个宏定义

taskRECORD_READY_PRIORITY( uxPriority )   

位置:在task.c文件中定义;

实现记录当前运行任务的优先级,直接得到优先级的序号,并更新到静态变量 uxTopReadyPriority 中;

	#define taskRECORD_READY_PRIORITY( uxPriority )														\{																									\if( ( uxPriority ) > uxTopReadyPriority )														\{																								\uxTopReadyPriority = ( uxPriority );														\}																								\} /* taskRECORD_READY_PRIORITY */
taskSELECT_HIGHEST_PRIORITY_TASK()

位置:在task.c文件中定义;

	#define taskSELECT_HIGHEST_PRIORITY_TASK()															\{																									\UBaseType_t uxTopPriority = uxTopReadyPriority;														\\/* 寻找包含就绪任务的最高优先级的队列 */                                                          \while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) )							\{																								\--uxTopPriority;																			\}																								\\/* 获取优先级最高的就绪任务的TCB,然后更新到pxCurrentTCB */							            \listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) );			\/* 更新uxTopReadyPriority */                                                                    \uxTopReadyPriority = uxTopPriority;																\} /* taskSELECT_HIGHEST_PRIORITY_TASK */

1)用于寻找优先级最高的就绪任务、更新静态变量 uxTopReadyPriority;调用宏:listLIST_IS_EMPTY( pxList )

/* 判断链表是否为空 */
#define listLIST_IS_EMPTY( pxList )	( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) )

此处有一个疑问:链表中的变量计数器(uxNumberOfItems)用来做什么用?

/* 链表结构体定义 */
typedef struct xLIST
{
    UBaseType_t uxNumberOfItems;    /* 链表节点计数器 */
    ListItem_t *  pxIndex;            /* 链表节点索引指针 */
    MiniListItem_t xListEnd;        /* 链表最后一个节点 */
} List_t;
 

现在可以回答这个问题了,也就是这列链表中节点的个数,当任务的优先级一样的话,是插到就绪任务链表数组的同一位置的,所以同一优先级就绪任务需要计数:uxNumberOfItems
a. 将节点从链表中删除:

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) 函数会减1;

b. 将节点插入到链表的尾部 :void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) 函数中加1;

2)更新全局变量pxCurrentTCB;调用宏:listGET_OWNER_OF_NEXT_ENTRY(..)

/* 获取链表节点的OWNER,即TCB */
#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )										\
{																							\List_t * const pxConstList = ( pxList );											    \/* 节点索引指向链表第一个节点调整节点索引指针,指向下一个节点,如果当前链表有N个节点,当第N次调用该函数时,pxInedex则指向第N个节点 */\( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;							\/* 当前链表为空 */                                                                       \if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) )	\{																						\( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;						\}																						\/* 获取节点的OWNER,即TCB */                                                             \( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;											 \
}

/* 节点结构体定义 */
struct xLIST_ITEM
{
    TickType_t xItemValue;             /* 辅助值,用于帮助节点做顺序排列 */            
    struct xLIST_ITEM *  pxNext;       /* 指向链表下一个节点 */        
    struct xLIST_ITEM *  pxPrevious;   /* 指向链表前一个节点 */    
    void * pvOwner;                       /* 指向拥有该节点的内核对象,通常是TCB */
    void *  pvContainer;               /* 指向该节点所在的链表 */
};
typedef struct xLIST_ITEM ListItem_t;  /* 节点数据类型重定义 */

3)继续更新静态变量 uxTopReadyPriority;

优化方法

        Cortex-M 内核有一个计算前导零的指令:CLZ。用于计算一个变量从高位开始第一次出现1的位前面的0的个数。

        __clz( ( uxReadyPriorities ):

a. uxReadyPriorities 为32位,每一个位号对应一个任务的优先级,1就绪,反之为0;

b. 32个优先级的任务: ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) )表示最高就绪任务的等级;

#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) )

两个宏定义

taskRECORD_READY_PRIORITY( uxPriority )

位置:在task.c文件中定义;

#define taskRECORD_READY_PRIORITY( uxPriority )	portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority )

里头又涉及到两个宏:portRECORD_READY_PRIORITY   和 portRESET_READY_PRIORITY

位置:在portmacro.h文件中定义;

a. portRECORD_READY_PRIORITY 完成功能:任务就绪就把uxReadyPriorities相应的位置1;得到能够反应就绪的32位的变量uxReadyPriorities;

b.portRESET_READY_PRIORITY 功能相反;

#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1/* 根据优先级设置/清除优先级位图中相应的位 */#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )#define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )/*-----------------------------------------------------------*/#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) )#endif /* taskRECORD_READY_PRIORITY */
taskSELECT_HIGHEST_PRIORITY_TASK()

位置:在portmacro.h文件中定义;

就是利用前面提到的计算前导零的指令:CLZ 实现,算出就绪最高优先级任务的的级别出来;

#define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) )

从而实现宏:taskSELECT_HIGHEST_PRIORITY_TASK。

	#define taskSELECT_HIGHEST_PRIORITY_TASK()														    \{																								    \UBaseType_t uxTopPriority;																		    \\/* 寻找最高优先级 */								                            \portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority );								    \/* 获取优先级最高的就绪任务的TCB,然后更新到pxCurrentTCB */                                       \listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) );		    \} /* taskSELECT_HIGHEST_PRIORITY_TASK() */

有关任务操作重要函数

1. 修改:TaskHandle_t xTaskCreateStatic(...)

1)内部增加了将任务添加到就绪列表的功能:prvAddNewTaskToReadyList;

2)在原本的prvInitialiseNewTask中增加了设置优先级的功能;

prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters,uxPriority, &xReturn, pxNewTCB);

原来的函数,初始化与任务相关的列表,如就绪列表;

static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )

是一个带参宏,位置:在task.c文件中定义;

static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
{/* 进入临界段 */taskENTER_CRITICAL();{/* 全局任务计时器加一操作 */uxCurrentNumberOfTasks++;/* 如果pxCurrentTCB为空,则将pxCurrentTCB指向新创建的任务 */if( pxCurrentTCB == NULL ){pxCurrentTCB = pxNewTCB;/* 如果是第一次创建任务,则需要初始化任务相关的列表 */if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ){/* 初始化任务相关的列表 */prvInitialiseTaskLists();}}else /* 如果pxCurrentTCB不为空,则根据任务的优先级将pxCurrentTCB指向最高优先级任务的TCB */{if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ){pxCurrentTCB = pxNewTCB;}}uxTaskNumber++;/* 将任务添加到就绪列表 */prvAddTaskToReadyList( pxNewTCB );}/* 退出临界段 */taskEXIT_CRITICAL();
}

完成如下功能:

a. 初始化任务链表(若是第一次):prvInitialiseTaskLists;

b. 把任务加到就绪列表:prvAddTaskToReadyList;

 这个是通过前面的宏 (查找优先级)+ 列表插入函数实现(根据优先级将任务插入就绪列表pxReadyTasksLists[])

prvAddTaskToReadyList( pxNewTCB );

* 将任务添加到就绪列表 */                                    
#define prvAddTaskToReadyList( pxTCB )                                                                   \
    taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority );                                                   \
    vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); 

完成
a. 任务控制块的钩子(过自己的钩子<TCB中的xStateListItem节点>挂上了List_t)。);

b. 任务控制块的容纳者是链表数组的某一个;

c.该链表拥有的任务(控制块)的数量加一;

2. vTaskStartScheduler()维持不变

完成如下功能:

1)创建空闲任务;

2)启动任务调度器xPortStartScheduler;

3.修改:void vTaskDelay( const TickType_t xTicksToDelay )

位置:在task.c文件中定义;

void vTaskDelay( const TickType_t xTicksToDelay )
{TCB_t *pxTCB = NULL;/* 获取当前任务的TCB */pxTCB = pxCurrentTCB;/* 设置延时时间 */pxTCB->xTicksToDelay = xTicksToDelay;/* 将任务从就绪列表移除 *///uxListRemove( &( pxTCB->xStateListItem ) );taskRESET_READY_PRIORITY( pxTCB->uxPriority );/* 任务切换 */taskYIELD();
}

此处的修改注意,以前是从任务列表中移除:uxListRemove( &( pxTCB->xStateListItem ) );

现在是通过函数(宏):taskRESET_READY_PRIORITY( pxTCB->uxPriority ) ;实现复位变量uxReadyPriorities相对于的位;

然后是调用任务切换taskYIELD,触发中断:vTaskSwitchContext;

4. 修改:void vTaskSwitchContext( void )

任务切换,即寻找优先级最高的就绪任务;

利用宏自动寻找优先级最高的就绪任务的TCB,然后更新到全局变量任务控制块指针pxCurrentTCB中;

/* 任务切换,即寻找优先级最高的就绪任务 */
void vTaskSwitchContext( void )
{/* 获取优先级最高的就绪任务的TCB,然后更新到pxCurrentTCB */taskSELECT_HIGHEST_PRIORITY_TASK();
}

5. 修改:void xTaskIncrementTick( void )

位置:在task.c文件中定义;

由定时中断xPortSysTickHandler调用;完成如下功能:

a. 实现全局变量xTickCount 计数操作;

此处有一个疑问:xTickCount 的加1为何这么麻烦,通过xConstTickCount常量来实现啊

    const TickType_t xConstTickCount = xTickCount + 1;
    xTickCount = xConstTickCount;

可能的原因 这种写法可能是出于以下原因之一: 1. 调试方便:使用局部变量 xConstTickCount 可以方便地在调试时观察 xTickCount 自增后的值。 2. 代码风格:某些开发者可能倾向于通过局部变量来分离计算和赋值逻辑,以提高代码的可读性。 3. 历史遗留:这段代码可能是从更复杂的逻辑简化而来的,原本 xConstTickCount 可能有其他用途,但后来简化成了当前的形式。

b. 扫描所有的就绪列表的时间是否到了,到了记录:taskRECORD_READY_PRIORITY( pxTCB->uxPriority );

c. 扫描结束进行任务切换portYIELD,触发中断;

void xTaskIncrementTick( void )
{TCB_t *pxTCB = NULL;BaseType_t i = 0;/* 更新系统时基计数器xTickCount,xTickCount是一个在port.c中定义的全局变量 */const TickType_t xConstTickCount = xTickCount + 1;xTickCount = xConstTickCount;/* 扫描就绪列表中所有线程的xTicksToDelay,如果不为0,则减1 */for(i=0; i<configMAX_PRIORITIES; i++){pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &pxReadyTasksLists[i] ) );if(pxTCB->xTicksToDelay > 0){pxTCB->xTicksToDelay --;}}/* 任务切换 */portYIELD();
}

6. 任务切换函数 portYIELD() 与taskYIELD

        功能:设置 PendSV 的中断挂起位,产生上下文切换。

#define taskYIELD()                           portYIELD()

#define portYIELD()																\
{																				\/* 设置 PendSV 的中断挂起位,产生上下文切换 */								\portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;								\\/* Barriers are normally not required but do ensure the code is completely	\within the specified behaviour for the architecture. */						\__dsb( portSY_FULL_READ_WRITE );											\__isb( portSY_FULL_READ_WRITE );											\
}

主函数及其调试

重要文件

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

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

相关文章

生成信息提取的大型语言模型综述

摘要 信息提取&#xff08;IE&#xff09;旨在从简单的自然语言文本中提取结构知识。最近&#xff0c;生成型大型语言模型&#xff08;LLMs&#xff09;在文本理解和生成方面表现出了显著的能力。因此&#xff0c;已经提出了许多基于生成范式将LLM集成到IE任务中的工作。为了对…

简单谈谈很火的MCP( Model Context Protocol,模型上下文协议)

MCP( Model Context Protocol&#xff0c;模型上下文协议)是由Anthropic推出的开放协议&#xff0c;并非独立的大模型&#xff0c;而是连接大模型与外部工具/数据源的标准化接口‌&#xff0c;旨在解决AI工具开发中接口不统一、跨模型共享困难等问题。‌ 一、工作原理 MCP 协…

界面控件Telerik和Kendo UI 2025 Q1亮点——AI集成与数据可视化

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

ollama迁移已下载的单个模型到服务器

ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的&#xff0c;部署和运行都很简单&#xff0c;是否高效就另说了。但最起码&#xff0c;他能充分利用用户的硬件设备&#xff0c;在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的&#xf…

WebGL图形编程实战【3】:矩阵操控 × 从二维到三维的跨越

上一篇文章&#xff1a;WebGL图形编程实战【2】&#xff1a;动态着色 纹理贴图技术揭秘 仓库地址&#xff1a;github…、gitee… 矩阵操控 矩阵变换 回到前面关于平移缩放、旋转的例子当中&#xff0c;我们是通过改变传递进去的xy的值来改变的。 在进行基础变换的时候&…

并发编程--共享内存SHM

共享内存SHM 文章目录 共享内存SHM1. 基本概念2. 函数接口2.1 创建或打开SHM对象2.2 映射 / 解除映射SHM对象2.3 其余操作2.4示例代码 1. 基本概念 共享内存&#xff0c;顾名思义&#xff0c;就是通过不同进程共享一段相同的内存来达到通信的目的&#xff0c;由于SHM对象不再交…

Redis中的数据类型与适用场景

目录 前言1. 字符串 (String)1.1 特点1.2 适用场景 2. 哈希 (Hash)2.1 特点2.2 适用场景 3. 列表 (List)3.1 特点3.2 适用场景 4. 集合 (Set)4.1 特点4.2 适用场景 5. 有序集合 (Sorted Set)5.1 特点5.2 适用场景 6. Redis 数据类型的选型建议结语 前言 Redis 作为一款高性能的…

科技赋能建筑业变革:中建海龙创新引领高质量发展新路径

在建筑工业化浪潮中&#xff0c;中建海龙科技有限公司&#xff08;以下简称“中建海龙”&#xff09;凭借深厚的技术积累与持续创新&#xff0c;成为推动行业转型升级的标杆企业。作为中国建筑国际集团旗下核心科技力量&#xff0c;中建海龙深耕模块化集成建筑&#xff08;MiC&…

Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发

vue 开发table 列表时&#xff0c;需要动态调整列字段的顺序和显示隐藏 实现效果如图所示&#xff1a; vue 组件代码 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…

故障扭曲棱镜反射照片效果ps特效滤镜样机 Distorted Mirror Poster Effect

只需单击几下即可执行令人着迷的高质量图像和摄影&#xff01;此照片效果包含智能对象图层&#xff0c;提供完全自定义、易用性和多功能性的工作流程。只需双击其缩略图打开所需的图层&#xff0c;删除占位符镜头&#xff0c;添加图形&#xff0c;保存它&#xff0c;然后观看 P…

CARLA常见技术问题集锦(一)地图与场景构建篇

编者荐语&#xff1a; 在自动驾驶技术加速落地的今天&#xff0c;CARLA 仿真引擎凭借其开源生态与高保真仿真能力&#xff0c;已成为全球开发者构建智能驾驶算法的核心工具之一。随着虚幻引擎 5.5 的全面升级&#xff0c;CARLA 0.10.0 版本实现了视觉革命&#xff1a;Lumen 全…

JavaWeb——事务管理、AOP

目录 一、事管理 1.开启事务管理日志 2.开启事务管理 3.传播行为 二、AOP 1.通知类型 2.通知顺序 3.切入点表达式 4.连接点 一、事务管理 1.开启事务管理日志 2.开启事务管理 3.传播行为 当一个事务方法被另一个事务方法调用时&#xff0c;这个事物方法应该如何进行事…

【蓝桥杯每日一题】3.28

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x "今天熬的夜&#xff0c;会变成明天奖状的闪光点&#xff01;" 目录 一、唯一的雪花 题目链接 题目描述 解题思路 解题代码 二、逛画展 题目链接 题目描述 解题思路 解题代…

进程间通信——信号量

进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…

Linux内核2-TFTP与NFS环境搭建

Uboot&#xff1a;引导程序 初始化硬件设备&#xff0c;初始化c语言环境&#xff0c;为内核加载做准备 zImage:内核文件 rootfs:文件系统&#xff0c;为用户提供一个与硬件设备数据交互的系统 1.TFTP和NFS功能 TFTP:简单文件传输协议网络配置 pc可以下载 2.minicom bootargs…

Crypto Architecture Kit简介

HarmonyOS 5.0.3(15) 版本的配套文档&#xff0c;该版本API能力级别为API 15 Release 文章目录 约束与限制能力范围基本概念与相关Kit的关系 Crypto Architecture Kit屏蔽了第三方密码学算法库实现差异的算法框架&#xff0c;提供加解密、签名验签、消息验证码、哈希、安全随机…

交流电机类型及其控制技术

交流电机可分为同步电机和异步电机两大种类&#xff0c;如果电机转子的转速与定子旋转磁场的转速相等&#xff0c;转子与定子旋转磁场在空间同步地旋转&#xff0c;这种电机就称为同步电机。如果电机转子的转速不等于定子旋转磁场的转速&#xff0c;转子与定子旋转磁场在空间旋…

fluent_UDF学习笔记

UDF源代码路径 D:\Program Files\ANSYS Inc\v231\fluent\fluent23.1.0\src关于颗粒反弹速度的计算 /* 通过面法向单位向量计算速度的法向向量、切向向量&#xff0c;再通过法向、切向恢复系数重新计算反弹速度*//* Compute normal velocity.将颗粒速度向面法线方向投影&#x…

第十六届蓝桥杯模拟二(串口通信)

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

06-ADC

ADC简介 Analog-Digital Converter 模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC&#xff0c;1us转换时间&#xff1b;输入电压范围&#xff1a;0-3.3V&#xff0c;转换结果…