【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger
【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger
- 一,文档简介
- 二,ADC SW HW 触发
- 2.1 软硬件平台
- 2.2 SW+ADC 软件触发
- 2.3 SW+BCTU+ADC 软件BCTU触发
- 2.4 PIT+TRIGMUX+ADC 硬件PIT TRIGUMX触发
- 2.5 EMIOS+BCTUHW+ADC硬件EMIOS BCTU触发
- 2.6 EMIOS+BCTUHW LIST+ADC硬件EMIOS BCTU触发LIST采集
一,文档简介
S32K344的ADC是一款分辨率高达14位的SAR ADC,拥有丰富的软件以及硬件触发方式,支持多样的外部触发源,并且引入BCTU使得触发资源可以外联到多通道的EMIOS以及TRIGMUX,增加了更多的ADC触发源。本文主要讲解如下几种方式的ADC软硬件触发情况,并且配套给出代码。

主要分为5部分:
(1) SW+ADC: 软件触发,通过添加定时器PIT,定时调用软件触发ADC完成通道采样,并且通过UART printf打印出采集值。
(2) SW+BCTU+ADC: 软件触发, 通过添加定时器PIT,定时调用软件触发BTCU, 完成ADC通道采样,并且通过UART printf打印出采集值。
(3) PIT+TRIGMUX+ADC: 硬件触发, 通过TRIGMUX连接PIT到ADC,通过PIT硬件触发ADC通道采样,并且在采样转换完成后打印转换值。
(4) EMIOS+BCTUHW+ADC: 硬件触发,通过EMIOS定时触发BCTU完成对应ADC单通道采样,由于采样速率较高,所以只是定时打印BCTU采样值。
(5) EMIOS+BCTUHWLIST+ADC: 硬件触发,通过EMIOS定时触发BCTU完成ADC列表通道采样,由于采样速率较高,所以定时打印BCTU 采样到的列表通道值。
二,ADC SW HW 触发
2.1 软硬件平台
软件: RTD400 LLD,S32DS3.5
硬件:S32K3X4EVB-T172
2.2 SW+ADC 软件触发
实际上,原始的RTD400自带的ADC demo已经有了ADC 软件以及BCTU的软件触发,本文是在该功能的基础上添加了PIT定时软件触发,并且通过UART printf打印出来,让检查ADC的测试值通过串口打印变的更加方便。
本文软件触发ADC的框图结构如下:

S32K344EVB板载有一个电位器,接到了ADC1_S10, PTA11:

所以,本节软件触发主要用于采集ADC1_S10。 UART 打印端口使用的是板载仿真器自带的串口:LPUART6_RX PTA15, LPUART6_TX PTA16,波特率为115200.
对于本文软件触发demo,主要配置涉及如下模块:
(1)Pins:

ADC1_s10, PTA11是当前要测试板载电位器电压,可调。
PTA29:连接板载D13红灯,用于测试PIT定时器中断进入闪烁,作为PIT的呼吸灯使用。
PTA16: UART6_TX, 用于发送采集到的ADC值。
(2)clocks
用于配置系统时钟,需要关注UART6时钟源为40Mhz,ADC1时钟源为160Mhz,PIT0时钟源为40Mhz
(3)Peripherals
涉及外设模块Siul2_Port,Siul2_Dio, Pit, Lpuart_Uart, Adc_Sar_Ip, IntCtrl_Ip.
Siul2_Port: 添加4个引脚ADC PTA11 MSCR 11, RED LED PTA29 MSCR 29,UART6_RX PTA15 MSCR 15, UART6_RX PTA16 MSCR 16.
Siul2_Dio:添加模块主要是为了让相关的API函数进来,便于控制GPIO引脚。
Pit: 用于生成1S的定时,主要配置如下:


Lpuart_Uart:

Adc_Sar_Ip:


这里需要注意的是ADC calibration prescale,以及Adc prescaler vale,需要满足如下条件,这点可以在S32K3RM上找到:

由于ADC1的时钟源是160MHz, 所以配置校准分频为4分频,转换分频为2分频。
IntCtrl_Ip:

旨在打开PIT, LPUART6的中断,并且注册对应的handler.
CT配置完成,生成代码,下一步,移步main函数,添加代码如下:
void AdcEndOfChainNotif1(void)
{notif_triggered1 = TRUE;data1 = Adc_Sar_Ip_GetConvData(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, 34);/* Checks the measured ADC data conversion */// while (ADC_TOLERANCE(data, ADC_BANDGAP));
}
void Pit0ch0Notification(void)
{toggleLed = 1U;Siul2_Dio_Ip_TogglePins(LED_Q172_PORT, (1<<LED_Q172_PIN));
}
int main(void)
{StatusType status;uint8 Index;Clock_Ip_StatusType clockStatus;/* Initialize and configure drivers */clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);while (clockStatus != CLOCK_IP_SUCCESS){clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);}Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);/* set PIT 0 interrupt */IntCtrl_Ip_Init(&IntCtrlConfig_0);
IntCtrl_Ip_EnableIrq(PIT0_IRQn);status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_1_BOARD_InitPeripherals);while (status != E_OK);IntCtrl_Ip_InstallHandler(ADC1_IRQn, Adc_Sar_1_Isr, NULL_PTR);IntCtrl_Ip_EnableIrq(ADC1_IRQn);for(Index = 0; Index <= 5; Index++){status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE);if(status == E_OK){break;}
}Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN | ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN);/* Initialize PIT instance 0 - Channel 0 */Pit_Ip_Init(PIT_INST_0, &PIT_0_InitConfig_PB_BOARD_InitPeripherals);/* Initialize channel 0 */Pit_Ip_InitChannel(PIT_INST_0, PIT_0_CH_0);/* Enable channel interrupt PIT_0 - CH_0 */Pit_Ip_EnableChannelInterrupt(PIT_INST_0, CH_0);/* Start channel CH_0 */Pit_Ip_StartChannel(PIT_INST_0, CH_0, PIT_PERIOD);Lpuart_Uart_Ip_Init(UART_LPUART_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_6_BOARD_INITPERIPHERALS);printf("S32K344 PIT TRIGMUX ADC demo RTD400.\r\n");while(1){
#if 1if( toggleLed == 1){toggleLed = 0;/* Start a SW triggered normal conversion on ADC_SAR */Adc_Sar_Ip_StartConversion(ADCHWUNIT_1_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL);/* Wait for the notification to be triggered and read the data */while (notif_triggered1 != TRUE);notif_triggered1 = FALSE;printf("ADC1_s10 ch34 data = %d .\r\n", data1);}
#endif}
}
测试结果打印如下:

本节内容配套代码:S32K344_PIT_SW_ADC_RTD400.zip
2.3 SW+BCTU+ADC 软件BCTU触发
基于SW+ADC触发,添加BCTU,并且使用BCTU软件触发完成ADC采样。框图结构如下:

本节功能是使用BCTU软件触发ADC0采样,采样通道并没有真实的使用外部的引脚输入,而是采集ADC0 的bandgap的值。软件触发通过PIT 1S周期调用软件触发函数,完成后打印ADC采样转换值到UART。
CT工具中,主要修改点为peripherals, adc_sar_lp中添加ADC0,并且配置为BCTU触发。


这里可以看到,图14中 adc ctu mode为:trigger mode.
添加Bctu_Ip模块,并且配置如下:

对应选择的BCTU的通道为48,该通道对应内部的bandgap模块。

典型值是1.2V,所以参考电压为5V,对应的14位ADC的bandgap期望值为:
(2^14)*1.2/5=3932周围。
完成CT配置生成代码后,在main.c里面添加如下代码:
void AdcEndOfChainNotif(void)
{notif_triggered = TRUE;data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_USED_CH);
}
void Pit0ch0Notification(void)
{toggleLed = 1U;Siul2_Dio_Ip_TogglePins(LED_Q172_PORT, (1<<LED_Q172_PIN));
}void BctuWatermarkNotif(void)
{uint8 idx;notif_triggered = TRUE;for (idx = 0u; idx < BCTU_FIFO_WATERMARK; idx++){data_bctu = Bctu_Ip_GetFifoData(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_FIFO_IDX);}
}int main(void)
{StatusType status;uint8 Index;Clock_Ip_StatusType clockStatus;/* Initialize and configure drivers */clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);while (clockStatus != CLOCK_IP_SUCCESS){clockStatus = Clock_Ip_Init(&Clock_Ip_aClockConfig[0]);}Siul2_Port_Ip_Init(NUM_OF_CONFIGURED_PINS_PortContainer_0_BOARD_InitPeripherals, g_pin_mux_InitConfigArr_PortContainer_0_BOARD_InitPeripherals);Bctu_Ip_Init(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &BctuHwUnit_0_BOARD_INITPERIPHERALS);status = (StatusType) Adc_Sar_Ip_Init(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, &AdcHwUnit_0_BOARD_InitPeripherals);
while (status != E_OK);/* set PIT 0 interrupt */IntCtrl_Ip_Init(&IntCtrlConfig_0);IntCtrl_Ip_EnableIrq(PIT0_IRQn);/* Install and enable interrupt handlers */IntCtrl_Ip_InstallHandler(ADC0_IRQn, Adc_Sar_0_Isr, NULL_PTR);IntCtrl_Ip_InstallHandler(BCTU_IRQn, Bctu_0_Isr, NULL_PTR);IntCtrl_Ip_EnableIrq(ADC0_IRQn);IntCtrl_Ip_EnableIrq(BCTU_IRQn);/* Call Calibration function multiple times, to mitigate instability of board source */for(Index = 0; Index <= 5; Index++){status = (StatusType) Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE);if(status == E_OK){break;}
}Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN | ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN);/* Start a SW triggered conversion on BCTU using a single trigger */Bctu_Ip_SetGlobalTriggerEn(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, TRUE);
Bctu_Ip_EnableNotifications(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_IP_NOTIF_FIFO1);/* Initialize PIT instance 0 - Channel 0 */Pit_Ip_Init(PIT_INST_0, &PIT_0_InitConfig_PB_BOARD_InitPeripherals);/* Initialize channel 0 */Pit_Ip_InitChannel(PIT_INST_0, PIT_0_CH_0);/* Enable channel interrupt PIT_0 - CH_0 */Pit_Ip_EnableChannelInterrupt(PIT_INST_0, CH_0);/* Start channel CH_0 */Pit_Ip_StartChannel(PIT_INST_0, CH_0, PIT_PERIOD);Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);//Lpuart_Uart_Ip_Init(UART_LPUART_INTERNAL_CHANNEL, &Lpuart_Uart_Ip_xHwConfigPB_6_BOARD_INITPERIPHERALS);printf("S32K344 PIT TRIGMUX ADC demo RTD400.\r\n");while(1){if( toggleLed == 1){toggleLed = 0;Bctu_Ip_SwTriggerConversion(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_SINGLE_TRIG_IDX);while (notif_triggered != TRUE);notif_triggered = FALSE;printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu);}}
}
测结果如下:

和典型期望值接近,说明已经成功运行。
配套代码:S32K344_PIT_TRIGMUX_BCTUSW_ADC_printf_RTD400.zip
2.4 PIT+TRIGMUX+ADC 硬件PIT TRIGUMX触发
本节为硬件触发,使用PIT结合TRIGMUX直接触发ADC1 通道34即ADC1_S10采样,触发结构框图如下:

同样在之前代码的基础上,需要在CT的peripherals中额外添加模块Trgmux_Ip,其余配置不变。

这里选择了Trigmux的输入为PIT0_CH0, 输出为ADC1.
代码也简单很多,在main里面添加如下代码:
Trgmux_Ip_Init(&Trgmux_Ip_xTrgmuxInitPB);//while(1){if(notif_triggered1 == TRUE){notif_triggered1 = FALSE;printf("ADC1_s10 ch34 data = %d .\r\n", data1);}}
While(1)中,可以看到,已经没有软件触发的调用,直接判别ADC1转换完成的标志,然后打印数据,测试结果如下:

可以看到,随着外部电位器的改变,采样得到的ADC1_S10的值也在改变。
本节代码:S32K344_PIT_TRIGMUX_ADC_printf_RTD400.zip
2.5 EMIOS+BCTUHW+ADC硬件EMIOS BCTU触发
本节框图结构如下:

使用eMIOS0_CH0,生成10Khz的时钟,去触发BCTU完成ADC0_48通道,即bandgap的采样。
在CT工具中,添加Emios_Mcal_Ip,配置如下:

BCTU配置改成使能HW triggering,配置如下:

Main代码相关代码如下:
Emios_Mcl_Ip_Init(EMIOS_INST0, &Emios_Mcl_Ip_0_Config_BOARD_INITPERIPHERALS);while(1)
{if( toggleLed == 1){toggleLed = 0;printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu);}
}
由于采样率是按照10Khz的频率去触发,频率较快,这里打印还是按照1s打印,打印结果如下:

可以看到,得到的结果也是一个可以变动的bandgap值。
本节代码:S32K344_PIT_TRIGMUX_BCTUHW_EMIOS_ADC_printf_RTD400.zip
2.6 EMIOS+BCTUHW LIST+ADC硬件EMIOS BCTU触发LIST采集
本节和上面的EMIOS BCTU硬件触发类似,只是在BCTU中配置使用LIST的形式,可以一次触发转换多个通道。主要修改点为BCTU模块:

添加对应的main代码如下:
#define BCTU_FIFO_WATERMARK 3U
void BctuWatermarkNotif(void)
{uint8 idx;notif_triggered = TRUE;for (idx = 0u; idx < BCTU_FIFO_WATERMARK; idx++){data_bctu[idx] = Bctu_Ip_GetFifoData(BCTUHWUNIT_0_BOARD_INITPERIPHERALS_INSTANCE, BCTU_USED_FIFO_IDX);}
}while(1){if( toggleLed == 1){toggleLed = 0;printf("ADC0_bandgap ch48 data_bctu = %d .\r\n", data_bctu[0]);printf("ADC0_vrefl ch54 data_bctu = %d .\r\n", data_bctu[1]);printf("ADC0_vrefh ch55 data_bctu = %d .\r\n", data_bctu[2]);}}
测试结果如下:

可以看到,结果和采集的bandgap,VREFL,VREFH还是吻合的,说明代码功能正常运行。
本节代码:
S32K344_PIT_TRIGMUX_BCTUHWLIST_EMIOS_ADC_printf_RTD400.zip
代码链接:
https://community.nxp.com/t5/S32K-Knowledge-Base/RTD400-K344-ADC-SW-HW-trigger/ta-p/1966179
相关文章:
【S32K3 RTD LLD篇5】K344 ADC SW+HW trigger
【S32K3 RTD LLD篇5】K344 ADC SWHW trigger 一,文档简介二,ADC SW HW 触发2.1 软硬件平台2.2 SWADC 软件触发2.3 SWBCTUADC 软件BCTU触发2.4 PITTRIGMUXADC 硬件PIT TRIGUMX触发2.5 EMIOSBCTUHWADC硬件EMIOS BCTU触发2.6 EMIOSBCTUHW LISTADC硬件EMIOS …...
TransFormer 视频笔记
TransFormer BasicsAttention单头注意力 single head attentionQ: query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 Value matrix 12288*12288 MLP Bas…...
前端的混合全栈之路Meteor篇(三):发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统
Meteor 3.0 是一个功能强大的全栈 JavaScript 框架,特别适合实时应用程序的开发。它的核心机制之一就包括发布-订阅(Publish-Subscribe)模型,它允许服务器端发布数据,客户端订阅并实时更新。本文将介绍如何在 Meteor 3…...
自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术
🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...
Webstorm 中对 Node.js 后端项目进行断点调试
首先,肯定需要有一个启动服务器的命令脚本。 然后,写一个 debug 的配置: 然后,debug 模式 启动项目和 启动调试服务: 最后,发送请求,即可调试: 这几个关键按钮含义: 重启…...
VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐
目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择,因为它不仅具有现代前端框架的所有优点,还能让你专注于构建高性能、高可用性的W…...
一、Spring Boot集成Spring Security之自动装配
Spring Boot集成Spring Security之自动装配介绍 一、实现功能及软件版本说明二、创建Spring Boot项目三、查看自动装配配置类四、自动装配配置类之SecurityAutoConfiguration1、SecurityAutoConfiguration部分源码2、主要作用3、SpringBootWebSecurityConfiguration3.1、Spring…...
计数相关的题 Python 力扣
2284. 最多单词数的发件人 给你一个聊天记录,共包含 n 条信息。给你两个字符串数组 messages 和 senders ,其中 messages[i] 是 senders[i] 发出的一条 信息 。 一条 信息 是若干用单个空格连接的 单词 ,信息开头和结尾不会有多余空格。发件…...
Express内置的中间件(express.json和express.urlencoded)格式的请求体数据
目录 Express内置的中间件 express.json 中间件的使用 express.urlencoded 中间件的使用 express.urlencoded([options]) 解析req.body的兼容写法 Express内置的中间件 自 Express 4.16.0 版本开始,Express 内置了 3 个常用的中间件,极大的提高了 …...
cmakelist加载Qt模块
Qt编程中,cmakelist会自动添加Core,Gui,Widgets模块,有时需要添加新的Qt的模块。在命令find_package中搜索要新增的模块,在命令target_link_libraries中添加要新增的模块。 比如要使用QUiLoader类,要增加对…...
8-2.Android 任务之 CountDownTimer 编码模板(开启计时器、取消计时器)
一、CountDownTimer 1、概述 CountDownTimer 是 Android 中一个用于执行定时操作的类 CountDownTimer 主要应用于在指定时间段内完成某项任务,或者每隔一段时间触发某项任务 2、使用步骤 创建 CountDownTimer:创建 CountDownTimer 就是创建它的匿名…...
Servlet的生命周期及用户提交表单页面的实现(实验报告)
一、实验目的、要求 1. 掌握Servlet的定义,即Servlet是运行在服务器端的Java程序,用于扩展服务器的功能。 2. 学习和掌握在开发环境中搭建Servlet应用所需的工具,如Tomcat服务器、IDEA等。 二、实验内容 根据本章所学知识,实验…...
【Router】路由功能之IP过滤(IP Filter)功能(基于端口)介绍及实现
IP过滤(IP Filter) IP Filter是一种通过对网络数据包中的 IP 地址进行分析和筛选,以实现对网络流量的控制和管理的技术。 IP过滤(IP Filter)作用 安全防护 可以阻止来自特定 IP 地址或 IP 地址范围的恶意攻击、非法访问等,增强网络的安全性。 流量管理 根据不同的 IP …...
数据结构_2.2、顺序表插入删除查找
1、线性表的顺序存储表示定义: 线性表:是具有相同数据类型的n (n≥0)个数据元素的有限序列 顺序表:用顺序存储的方式实现线性表 顺序存储:把逻辑上相邻的元素存储在物理 位置上也相邻的存储单元中&#…...
嵌入式C语言自我修养:编译链接
源文件生成可执行文件的过程? 源文件经过预处理、编译、汇编、链接生成一个可执行的目标文件。 编译器驱动程序,包括预处理器、编译器、汇编器和链接器。Linux用户可以调用GCC驱动程序来完成整个编译流程。 使用GCC驱动程序将示例程序从ASCII码源文件转换…...
Mac制作Linux操作系统启动盘
前期准备 一个 Mac 电脑 一个 U 盘(8GB 以上) 下载好 Linux 系统镜像(iso 文件) 具体步骤 挂载 U 盘 解挂 U 盘 写系统镜像到 U 盘 完成 一、挂载 U 盘 首先插入 U 盘,打开终端输入下面的命令查看 U 盘是否已经 m…...
PHP语言发展历程
PHP是一种开源的服务器端脚本语言,主要用于Web开发,最初由Rasmus Lerdorf在1994年创建。PHP的发展历程如下: PHP的起源:1994年,Rasmus Lerdorf创建了PHP的第一个版本,最初是一套用于跟踪他个人简历访问的C…...
Notepad++ 之 AndroidLogger插件
背景 最近一段时间在分析Android log 定位问题,Notepad 之前用的比较少,现在看log觉得确实好用,美中不足的是 看Android log的时候不像 logcat -v color 可以区分不同等级的颜色,于是调研了一下,发现大部分都是使用An…...
开源2+1链动模式AI智能名片O2O商城小程序源码:线下店立体连接的超强助力器
摘要:本文将为您揭示线下店立体连接的重大意义,您知道吗?线上越火,线下就得越深入经营。现代门店可不再只是卖东西的地儿,还得连接KOC呢!咱们来看看门店要做的那些超重要的事儿,还有开源21链动模…...
我为什么决定关闭ChatGPT的记忆功能?
你好,我是三桥君 几个月前,ChatGPT宣布即将推出一项名为“记忆功能”的新特性,英文名叫memory。 这个功能听起来相当吸引人,宣传口号是让GPT更加了解用户,仿佛是要为我们每个人量身打造一个专属的AI助手。 在记忆功…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
