STM32F4X UCOSIII 事件集

news2024/12/26 10:54:12

STM32F4X UCOSIII 事件集

  • 事件的应用场景
  • UCOSIII事件工作机制
  • UCOSIII事件操作函数
    • 事件创建函数
    • 事件删除函数
    • 事件发送函数
    • 事件接收函数
  • UCOSIII事件例程

事件在RTOS中也是一种任务间同步的机制,事件不能传递数据。跟信号量不同的是,事件可以实现一对多,多对多的同步,也就是一个事件可以唤醒多个任务,一个任务也可以等待多个事件,也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。

事件的应用场景

  • 场景1:P1需要坐公交车去某地,只有A公交可以去目的地,此时P1必须等到A公交到达后才可以出发。
  • 场景2:P1需要坐公交车去某地,有A公交和B公交可以去目的地,此时P1只需等到A公交或者B公交到达后才可以出发。
  • 场景3:P1约定和P2一起去某地,可以乘坐A公交和B公交去目的地,此时P1必须等待P2和公交到达才可以出发

在上述的几个场景中,我们可以将P1当做任务1,乘坐公交为事件1,同伴P2为事件2。则场景1为特定事件唤醒任务,场景2为任意事件唤醒任务,场景3为多个事件同时发生唤醒任务。

UCOSIII事件工作机制

在UCOSIII中每一个事件对象都定义了一个32位的事件标志位,也就是说每一个事件对象最多可以产生32个事件。当事件标志位为1时,则代表该事件发生,当事件标志位为0时,则代表该事件没有发生。下图就是一个事件对象里面的事件表示位,bit1/4/6/31被置1,则代表事件1、事件4、事件6和事件31发生。
在这里插入图片描述
假设现在有两个任务,任务1的唤醒条件是事件3或者事件5中的任意一个被置位,而任务2的唤醒条件是事件3和事件5同时发生。当事件3发生时,任务1会被唤醒,此时因为事件5还没发生,所以任务2没有被唤醒。当任务5发生时,任务2才会被唤醒。当任务接收到事件后,可以选择清除或者不清除事件标志位,当选择清除事件标志位后,改事件标志位就会被清0,如果选择不清除事件标志位,则该事件会一直存在。
在这里插入图片描述

UCOSIII事件操作函数

事件创建函数

/*
*p_grp:事件类型对象
*p_name:事件对象名字
*flags:初始化的事件标志位,通常为0
*p_err:错误代码
*/
void  OSFlagCreate (OS_FLAG_GRP  *p_grp,
                    CPU_CHAR     *p_name,
                    OS_FLAGS      flags,
                    OS_ERR       *p_err)

事件删除函数

/*
*p_grp:事件类型对象
*opt:用户选项
*p_err:错误代码
*/
OS_OBJ_QTY  OSFlagDel (OS_FLAG_GRP  *p_grp,
                       OS_OPT        opt,
                       OS_ERR       *p_err)

opt可以选择OS_OPT_DEL_NO_PENDOS_OPT_DEL_ALWAYS

  • OS_OPT_DEL_NO_PEND:删除事件,如果该事件上有挂起的任务,则等待挂起的任务恢复才删除
  • OS_OPT_DEL_ALWAYS:不管该事件上是否有挂起的任务,直接删除事件

事件发送函数

/*
*p_grp:事件类型对象
*flags:需要发送的事件
*opt:用户选项
*p_err:错误代码
返回值:返回事件标志位的值
*/
OS_FLAGS  OSFlagPost (OS_FLAG_GRP  *p_grp,
                      OS_FLAGS      flags,
                      OS_OPT        opt,
                      OS_ERR       *p_err)

opt可以选择OS_OPT_POST_FLAG_SET、OS_OPT_POST_FLAG_CLR和OS_OPT_POST_NO_SCHED

  • OS_OPT_POST_FLAG_SET:设置事件为置1触发
  • OS_OPT_POST_FLAG_CLR:设置事件为清0触发
  • OS_OPT_POST_NO_SCHED:发生事件后不调度

事件接收函数

/*
*p_grp:事件类型对象
*flags:需要接收的事件
*timeout:超时等待时间
*opt:用户选项
*p_ts:时间戳
*p_err:错误代码
返回值:返回接收到的事件标志位的值
*/
OS_FLAGS  OSFlagPend (OS_FLAG_GRP  *p_grp,
                      OS_FLAGS      flags,
                      OS_TICK       timeout,
                      OS_OPT        opt,
                      CPU_TS       *p_ts,
                      OS_ERR       *p_err)

opt可以选择OS_OPT_PEND_FLAG_CLR_ALL、OS_OPT_PEND_FLAG_CLR_ANY、OS_OPT_PEND_FLAG_SET_ALL、OS_OPT_PEND_FLAG_SET_ANY、OS_OPT_PEND_FLAG_CONSUME、OS_OPT_PEND_NON_BLOCKING和OS_OPT_PEND_BLOCKING

  • OS_OPT_PEND_FLAG_CLR_ALL:等待事件中所有位被清除
  • OS_OPT_PEND_FLAG_CLR_ANY:等待事件中任意的位被清除
  • OS_OPT_PEND_FLAG_SET_ALL:等待事件中所有位被置1
  • OS_OPT_PEND_FLAG_SET_ANY:等待事件中任意的位被置1
  • OS_OPT_PEND_FLAG_CONSUME:任务被唤醒后是否将标志位清除
  • OS_OPT_PEND_BLOCKING:阻塞等待事件,除非事件发生,否则任务不会恢复
  • OS_OPT_PEND_NON_BLOCKING:不阻塞等待事件,如果任务等待时间超过设定的超时时间,任务会恢复并返回一个错误代码

UCOSIII事件例程

/*
*********************************************************************************************************
*                                              EXAMPLE CODE
*
*                             (c) Copyright 2013; Micrium, Inc.; Weston, FL
*
*                   All rights reserved.  Protected by international copyright laws.
*                   Knowledge of the source code may not be used to write a similar
*                   product.  This file may only be used in accordance with a license
*                   and should not be redistributed in any way.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                            EXAMPLE CODE
*
*                                       IAR Development Kits
*                                              on the
*
*                                    STM32F429II-SK KICKSTART KIT
*
* Filename      : app.c
* Version       : V1.00
* Programmer(s) : YS
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include  <includes.h>

/*
*********************************************************************************************************
*                                            LOCAL DEFINES
*********************************************************************************************************
*/


/*
*********************************************************************************************************
*                                       LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
#define EVENT1_FLAG (1 << 0) // 事件1标志位
#define EVENT2_FLAG (1 << 1) // 事件2标志位
#define EVENT3_FLAG (1 << 2) // 事件3标志位
#define EVENT4_FLAG (1 << 3) // 事件4标志位 
/* ----------------- APPLICATION GLOBALS -------------- */
static  OS_TCB   AppTaskStartTCB;
static  CPU_STK  AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];

#define APPTASK1NAME    "App Task1"
#define APP_TASK1_PRIO          3   
#define APP_TASK1_STK_SIZE 1024
static OS_TCB AppTask1TCB;
static void  AppTask1  (void *p_arg);
static CPU_STK AppTask1Stk[APP_TASK1_STK_SIZE];

#define APPTASK2NAME    "App Task2"
#define APP_TASK2_PRIO          4   
#define APP_TASK2_STK_SIZE 1024
static OS_TCB AppTask2TCB;
static void  AppTask2  (void *p_arg);
static CPU_STK AppTask2Stk[APP_TASK2_STK_SIZE];

#define APPTASK3NAME    "App Task3"
#define APP_TASK3_PRIO          4   
#define APP_TASK3_STK_SIZE 1024
static OS_TCB AppTask3TCB;
static void  AppTask3  (void *p_arg);
static CPU_STK AppTask3Stk[APP_TASK3_STK_SIZE];
static OS_FLAG_GRP grp;
/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void  AppTaskStart          (void     *p_arg);


/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Arguments   : none
*
* Returns     : none
*********************************************************************************************************
*/

int main(void)
{

    OS_ERR  err;


    OSInit(&err);                                               /* Init uC/OS-III.                                      */
   
    OSTaskCreate((OS_TCB       *)&AppTaskStartTCB,              /* Create the start task                                */
                 (CPU_CHAR     *)"App Task Start",
                 (OS_TASK_PTR   )AppTaskStart,
                 (void         *)0u,
                 (OS_PRIO       )APP_CFG_TASK_START_PRIO,
                 (CPU_STK      *)&AppTaskStartStk[0u],
                 (CPU_STK_SIZE  )AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE / 10u],
                 (CPU_STK_SIZE  )APP_CFG_TASK_START_STK_SIZE,
                 (OS_MSG_QTY    )0u,
                 (OS_TICK       )0u,
                 (void         *)0u,
                 (OS_OPT        )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                 (OS_ERR       *)&err);

    OSStart(&err);                                              /* Start multitasking (i.e. give control to uC/OS-III). */


}


/*
*********************************************************************************************************
*                                          STARTUP TASK
*
* Description : This is an example of a startup task.  As mentioned in the book's text, you MUST
*               initialize the ticker only once multitasking has started.
*
* Arguments   : p_arg   is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Returns     : none
*
* Notes       : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
*                  used.  The compiler should not generate any code for this statement.
*********************************************************************************************************
*/

static  void  AppTaskStart (void *p_arg)
{
    CPU_INT32U  cpu_clk_freq;
    CPU_INT32U  cnts;
    OS_ERR      err;


   (void)p_arg;

    BSP_Init();                      
    CPU_Init();                                                 /* Initialize the uC/CPU services                       */

    cpu_clk_freq = BSP_CPU_ClkFreq();                           /* Determine SysTick reference freq.                    */
    cnts         = cpu_clk_freq                                 /* Determine nbr SysTick increments                     */
                 / (CPU_INT32U)OSCfg_TickRate_Hz;

    OS_CPU_SysTickInit(cnts);                                   /* Init uC/OS periodic time src (SysTick).              */

    Mem_Init();                                                 /* Initialize memory managment module                   */
    Math_Init();                                                /* Initialize mathematical module                       */


#if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_IntDisMeasMaxCurReset();
#endif


#if (APP_CFG_SERIAL_EN == DEF_ENABLED)
    App_SerialInit();                                           /* Initialize Serial communication for application ...  */
#endif
	

	OSTaskCreate((OS_TCB     *)&AppTask1TCB,  // 线程TCB              
			 (CPU_CHAR   *)APPTASK1NAME, // 线程名字
			 (OS_TASK_PTR ) AppTask1, // 线程入口函数
			 (void       *) "TASK1", // 线程参数
			 (OS_PRIO     ) APP_TASK1_PRIO, // 线程优先级
			 (CPU_STK    *)&AppTask1Stk[0], // 线程栈起始地址
			 (CPU_STK_SIZE) APP_TASK1_STK_SIZE / 10, // 栈深度的限制位置
			 (CPU_STK_SIZE) APP_TASK1_STK_SIZE, // 栈大小
			 (OS_MSG_QTY  ) 5u, // 最大的消息个数
			 (OS_TICK     ) 0u, // 时间片
			 (void       *) 0, // 向用户提供的内存位置的指针
			 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), // 线程特定选项
			 (OS_ERR     *)&err); // 错误标志
	if(OS_ERR_NONE == err)
		printf("%s Create Success\r\n",APPTASK1NAME);
	else
		printf("%s Create Error\r\n",APPTASK1NAME);
	
			 
	OSTaskCreate((OS_TCB     *)&AppTask2TCB,  // 线程TCB              
			 (CPU_CHAR   *)APPTASK2NAME, // 线程名字
			 (OS_TASK_PTR ) AppTask2, // 线程入口函数
			 (void       *) "TASK2", // 线程参数
			 (OS_PRIO     ) APP_TASK2_PRIO, // 线程优先级
			 (CPU_STK    *)&AppTask2Stk[0], // 线程栈起始地址
			 (CPU_STK_SIZE) APP_TASK2_STK_SIZE / 10, // 栈深度的限制位置
			 (CPU_STK_SIZE) APP_TASK2_STK_SIZE, // 栈大小
			 (OS_MSG_QTY  ) 5u, // 最大的消息个数
			 (OS_TICK     ) 0u, // 时间片
			 (void       *) 0, // 向用户提供的内存位置的指针
			 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), // 线程特定选项
			 (OS_ERR     *)&err); // 错误标志
	if(OS_ERR_NONE == err)
		printf("%s Create Success\r\n",APPTASK2NAME);
	else
		printf("%s Create Error\r\n",APPTASK2NAME);
	
	OSTaskCreate((OS_TCB     *)&AppTask3TCB,  // 线程TCB              
			 (CPU_CHAR   *)APPTASK3NAME, // 线程名字
			 (OS_TASK_PTR ) AppTask3, // 线程入口函数
			 (void       *) "TASK3", // 线程参数
			 (OS_PRIO     ) APP_TASK3_PRIO, // 线程优先级
			 (CPU_STK    *)&AppTask3Stk[0], // 线程栈起始地址
			 (CPU_STK_SIZE) APP_TASK3_STK_SIZE / 10, // 栈深度的限制位置
			 (CPU_STK_SIZE) APP_TASK3_STK_SIZE, // 栈大小
			 (OS_MSG_QTY  ) 5u, // 最大的消息个数
			 (OS_TICK     ) 0u, // 时间片
			 (void       *) 0, // 向用户提供的内存位置的指针
			 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), // 线程特定选项
			 (OS_ERR     *)&err); // 错误标志
	if(OS_ERR_NONE == err)
		printf("%s Create Success\r\n",APPTASK3NAME);
	else
		printf("%s Create Error\r\n",APPTASK3NAME);
			 
	OSFlagCreate(&grp,"flag",0,&err);
	if(OS_ERR_NONE == err)
		printf("Flag Create Success\r\n");
	else
		printf("Flag Create Error\r\n");
	
	OSTaskDel ( & AppTaskStartTCB, & err );		 

}

static void  AppTask1  (void *p_arg)
{
    OS_ERR      err;
	static CPU_INT32U i = 0;
	while(DEF_TRUE)
	{
		
		OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); // 1s运行一次
		OSFlagPost(&grp,EVENT1_FLAG | EVENT2_FLAG,OS_OPT_POST_FLAG_SET,&err); // 将事件1和事件2设置为置1触发
	
		
		
		OSTimeDly ( 1000, OS_OPT_TIME_DLY, & err ); // 1s运行一次
		if(i % 2 == 0)
			OSFlagPost(&grp,EVENT3_FLAG,OS_OPT_POST_FLAG_CLR,&err); // 将事件3设置为清0触发
		else
			OSFlagPost(&grp,EVENT4_FLAG,OS_OPT_POST_FLAG_CLR,&err); // 将事件4设置为清0触发
		i++;

		
		
	}
	
}
static void  AppTask2  (void *p_arg)
{
    OS_ERR      err;
	OS_FLAGS flag;
	while(DEF_TRUE)
	{
		flag = OSFlagPend(&grp,EVENT1_FLAG | EVENT2_FLAG,0,OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING,0,&err); // 同时接收事件1和事件2
		if(OS_ERR_NONE == err)
			printf("%s Flag Recv Success flag = %d\r\n",__func__,flag); // 接收成功打印出接收到事件值
		else
			printf("%s Flag Recv Error\r\n",__func__);
		
	}
	
}
static void  AppTask3  (void *p_arg)
{
    OS_ERR      err;
	OS_FLAGS flag;
	while(DEF_TRUE)
	{
		flag = OSFlagPend(&grp,EVENT3_FLAG | EVENT4_FLAG ,0,OS_OPT_PEND_FLAG_CLR_ANY | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING,0,&err); // 接收事件3或者事件4
		if(OS_ERR_NONE == err)
			printf("%s Flag Recv Success  flag = %d\r\n",__func__,flag); // 接收成功打印出接收到事件值
		else
			printf("%s Flag Recv Error\r\n",__func__);
	}
	
}

在这里插入图片描述

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

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

相关文章

C++11之基础篇

C11 C11简介统一的列表初始化&#xff5b;&#xff5d;初始化std::initializer_list 声明autodecltypenullptr范围for循环 STL中一些变化arrayforward_listunderored_map&#xff0c;underored_set C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;…

HEC-RAS 1D/2D水动力与水环境模拟教程

详情点击公众号技术科研吧链接&#xff1a;HEC-RAS 1D/2D水动力与水环境模拟教程 前言 水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而&#xff0c;一方面水动力和水环境模型的使用非常复杂&#xff0c…

买卖股票的最佳时机 IV

买卖股票的最佳时机 IV 力扣链接&#xff1a;188. 买卖股票的最佳时机 IV 题目描述 给你一个整数数组 prices 和一个整数 k &#xff0c;其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说&a…

动态面板案例分析

动态面板模型分析 如果在面板模型中&#xff0c;解释变量包括被解释变量的滞后值&#xff0c;此时则称之为“动态面板模型”&#xff0c;其目的是处理内生性问题。动态面板模型发展分为3个阶段&#xff0c;第1阶段是由Arellano and Bond(1991)提出的差分GMM(difference GMM)&a…

MidJourney | 教你如何做出好看的插画

企业插画主要基于关键词Corporate Flat Illustration&#xff08;企业平面插画&#xff09;构成&#xff0c;再结合常用的设计风格&#xff0c;比如孟菲斯风格&#xff0c;线条艺术&#xff0c;梦幻色调等关键词辅助&#xff0c;然后根据你产品需求&#xff0c;融合插画色彩等组…

文章采集,根据标题全网采集文章

无论您是一名学生、研究人员、内容创作者还是企业家&#xff0c;都需要从互联网上搜集文章来获取有价值的信息。然而&#xff0c;如何高效地进行文章采集并找到符合您需求的内容呢&#xff1f; 在日常生活和工作中&#xff0c;我们经常需要查找和整理各种文章和信息。这可能包括…

基于PHP的短视频SEO矩阵系统源码开发

随着短视频市场的爆发式增长&#xff0c;越来越多的企业开始寻求在短视频领域建立自己的品牌形象&#xff0c;增加用户粘性和获取更多流量。为此&#xff0c;一套高效的短视频SEO矩阵系统源码显得尤为重要。本文将介绍基于PHP语言的短视频SEO矩阵系统源码开发&#xff0c;帮助读…

死锁详细解读

目录 死锁&#xff08;1&#xff09; 一、死锁的定义 二、产生死锁的原因 三、产生死锁的四个必要条件 四、解决死锁的方法 死锁&#xff08;2&#xff09; 第三节 死锁避免 一、死锁避免的概念 二、安全状态与安全序列 三、银行家算法 第四节、死锁的检测与解除 …

怎样找到NPM里面开源库下载地址

场景 最近帮忙找一个开源库地址。这里以vue/language-core为例子。 解决 https://registry.npmmirror.com/vue/language-core/1.8.13这里就是如下格式&#xff1a; https://registry.npmmirror.com/{包名}/{版本号}打开这个页面后&#xff0c;得到开源库下载地址&#xff0c…

【GIT问题解决】---- 在【.gitignore】中添加了忽略文件或文件夹后不生效

1. 出现问题 在已经提交过的 GIT 管理的项目中&#xff0c;在 .gitignore 文件中新增一些忽略的文件或者文件夹&#xff0c;或者直接新建 .gitignore 文件之后&#xff0c;新增的内容不生效。 2. 实例截图 3. 实例描述 lifecycle.js 文件已新增到 .gitignore 文件中&#xf…

RapidSSL的便宜单域名https证书

RapidSSL是Geotrust https证书品牌中的一款入门级https证书品牌&#xff0c;目前属于Digicert的子品牌。它是一款提供高性价比和广泛适用范围的https证书&#xff0c;无论是个人还是企业用户都可以轻松申请并快速验证。今天就随SSL盾小编了解RapidSSL旗下的单域名https证书。 …

【HCIE】04.网络安全技术

端口隔离 在同一VLAN中可以隔离二层与三层通信&#xff0c;让同VLAN内的设备可以通信或者不可以通信。 定义一个端口隔离组&#xff0c;在一个组内无法互访&#xff0c;不在一个组里面可以进行互访 port-isolate enable group1 //使能端口隔离功能 port-isolate mdoe all //全…

Windows系统部署WebDAV服务结合内网穿透实现公网访问,轻松共享文件与资源

windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】 文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. cpolar内网穿透3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访…

ES9,ES10

文章目录 ES9新特性对象的剩余参数与扩展运算符正则表达式命名捕获组Promise.finally()异步遍历器 ES10新特性Object.fromEntriestrimStart() and trimEnd()Symbol 对象的 description 属性可选的 catch ES9新特性 对象的剩余参数与扩展运算符 对象的剩余参数 let obj {nam…

【Android】线程下载资源保证资源到位采用了 OkHttp的三方网络下载 文件缓存策略

背景 使用 SVGA的三方的url播放方式会比较慢&#xff0c;至少延迟3s以上才会出现svga效果&#xff0c;所以改变策略&#xff1a;将线上的svga全部下载到本地进行播放&#xff0c;那么就得将采用网络缓存的方式实现效果。 实现 那么就得实现以下几点&#xff1a; 初次下载缓…

文件内容显示

一.浏览普通文件 .1. 文件内容查看 1.1.1. cat 命令 作用&#xff1a;查看文件内容&#xff0c;适合数据量较少 格式&#xff1a;cat -参数 文件名 参数&#xff1a; -n&#xff1a;显示行号&#xff0c;加上 -b&#xff1a;文件中所有非空行增加行号&#xff0c;编号从1开始…

Leetcode | 304. 二维区域和检索 - 矩阵不可变

304. 二维区域和检索 - 矩阵不可变 文章目录 [304. 二维区域和检索 - 矩阵不可变](https://leetcode.cn/problems/range-sum-query-2d-immutable/)题目官方题解&#xff1a;二维前缀和 题目 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形…

DA3 网站的第10位用户信息读取

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID …

绘图系统五:数据产生

文章目录 AxisFrame组件源码模式序列化导入数据获取文件信息导入文本导入二进制数据 &#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制 &#x1f4c8;四 定制绘图风格源码地址 Python打造动态绘图系统 AxisFrame组件 AxisFrame是存…

热电偶的工作原理

当有两种不同的导体或半导体A和B组成一个回路&#xff0c;其两端相互连接时&#xff0c;只要两结点处的温度不同&#xff0c;一端温度为T&#xff0c;称为工作端或热端&#xff0c;另一端温度为T0 &#xff0c;称为自由端&#xff08;也称参考端&#xff09;或冷端&#xff0c;…