ADI Blackfin DSP处理器-BF533的开发详解17:IIS+AUDIO音频codec的应用(含源代码)

news2024/10/7 18:30:52

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

很早期做的设计,用的是TI的一颗音频codec,如果要放到今天,我肯定是用ADI的SigmaDSP了,ADI所有的SigmaDSP我都用过,非常熟。

硬件实现原理

音频是采用 TI 公司的 TLV320AIC23B 音频 Codec 芯片,TLV320AIC23B 支持 1 路 MICIN,1 路 LINEIN, 1 路OUT,1 路 HPOUT。硬件设计中将 1 路 LINEIN 和 1 路 HPOUT 通过接口引出,板载 1 个 MIC,连接芯片的 MICIN
接口。

BF533 处理器的 SPORT 接口支持 IIS 协和和 TDM 协议,可直接与 TLV320AIC23B 的接口连接。通过 BF53x处理器的 PF0 和 PF1 接口分别模拟 IIC 的 SCL 和 SDA 总线,用来初始化 TLV320AIC23B 芯片。

TLV320AIC23B 支持多种音频采样格式,硬件设计中为其提供的时钟为 12MHz,可参考 TLV320AIC23B 数据手册将其配置为 USB 模式采样。

在这里插入图片描述

硬件连接示意图

在这里插入图片描述

初始化配置

TLV320AIC23B 的器件地址可通过接口上的 CS 引脚进行选择,如下表:在这里插入图片描述

硬件中,将 CS 管脚接地,所以其使用的器件地址是:写器件:0x34 读器件:0x35

TLV320AIC23B 需要通过 IIC 接口配置初始化,所以需要通过配置板卡上的 CPLD 寄存器,将 PF0 和 PF1 配置为 IIC 总线模式,该配置映射在 CPLD 的 DEVICE_OE 寄存器,其配置功能为:

DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。
DEVICE_OE 寄存器位功能:

在这里插入图片描述

PF0_SET:PF0 模拟 IIC 总线 SCL 接口或 PF0 中断功能使能

1:关闭 I2C_SCL 输入信号, 使能 PF0 中断信号
0:使能 I2C_SCL 输入信号,关闭 PF0 中断信号

使用 IIC 配置 TLV320AIC23B 时,需将 PF0_SET 位设置为 0,关闭中断,待 IIC 配置完成后,再将中断 PF0_SET位设置为 1,将 PF0 中断功能打开。

代码实现功能

  1. bf53x_audio_talkthrough代码:

代码实现了一个音频输入播放的功能,将一个声源通过 LINEIN 接口(蓝色)输入,将一音响或耳机连接在HPOUT 接口(绿色),运行代码后,音响或耳机中能听到输入声源的声音。输入声源的音量不要太大,否则会产生
削波现象,导致听到的输出声音有爆破音。

  1. bf53x_audio_mic

代码实现了 MIC 输入播放的功能,将一音响或耳机连接在 HPOUT 接口(绿色),运行代码后,用手机或其他播放器对准板上 MIC 接口播放音乐,在音响或耳机中能听到输入声源的声音。

代码实现原理

  1. bf53x_audio_talkthrough

代码通过 IIC 初始化完 TLV320AIC23B 后,TLV320AIC23B 开始通过 LINEIN 接口采集模拟音频数据,并将采集到的数据通过 ADSP-BF53x 的 SPORT 口传送给 ADSP-BF53x,ADSP-BF53x 将数据做内存交换后,再通过 SPORT口传送给 TLV320AIC23B,TLV320AIC23B 将数据转为模拟信号后通过 HPOUT 接口输出。

  1. bf53x_audio_mic

代码通过 IIC 初始化完 TLV320AIC23B 后,TLV320AIC23B 开始通过板上 MIC 采集模拟音频数据,并将采集到的数据通过 ADSP-BF53x 的 SPORT 口传送给 ADSP-BF53x,ADSP-BF53x 将数据做内存交换后,再通过 SPORT口传送给 TLV320AIC23B,TLV320AIC23B 将数据转为模拟信号后通过 HPOUT 接口输出。

调试步骤

  1. bf53x_audio_talkthrough

1)将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
2)将正在播放的声源通过标准音频连接线接入开发板的 Lin IN 接口(蓝色接口)接入,音箱或耳机连接 HPOUT接口(绿色接口)。
3)先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
4)运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
5)加载 VisualDSP++ 5.0 工程文件 BF53x_AUDIO_TALKTHROUGH.dpj,编译并全速运行。

  1. bf53x_audio_mic

1)将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
2)将正在播放的声源通过标准音频连接线接入开发板的 Lin IN 接口(蓝色接口)接入,音箱或耳机连接 HPOUT接口(绿色接口)。
3)先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
4)运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
5)加载 VisualDSP++ 5.0 工程文件 BF53x_AUDIO_MIC.dpj,编译并全速运行。

调试结果

bf53x_audio_talkthrough

在音响或耳机中可以听到输入声源的声音。

bf53x_audio_mic

用手机或其他播放器播放音乐,对准板上 MIC,可从耳机中听到 MIC 采集到的音乐。

程序源码

  1. bf53x_audio_talkthrough

aic23b_init.c

#include <cdefBF533.h>
#include “i2c.h”
#include “aic23b.h”

#define AIC23B_ADDRESS 0x34
static i2c_device mcu_i2c;

void init_aic23b(void);
int aic23b_write(unsigned char addr, unsigned char dat);
int aic23b_read(unsigned char addr, unsigned char * buf);

unsigned short AudioConfig[] = {
PWDC, 0x000FF,
LLVC, 0x1d,
RLVC, 0x1d,
LHVC, 0x70,
RHVC, 0x70,
AAPC, DAC,
DAPC, 0,
PWDC, 0,
DAIF, MS|FOR|LRP,
SARC, 0,
DIAC, ACT|RES };

/****************************************************************************

  • 名称 :aic23b_write
  • 功能 : 写aic23b寄存器函数
  • 入口参数 :addr:寄存器偏移地址
    dat:寄存器配置值
  • 出口参数 :返回0
    ****************************************************************************/
    int aic23b_write(unsigned char addr, unsigned char dat)
    {
    int ret = -1;
    i2c_start(&mcu_i2c);
    if(i2c_write(&mcu_i2c, AIC23B_ADDRESS, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    if(i2c_write(&mcu_i2c, addr, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    i2c_write(&mcu_i2c, dat, 1);
    i2c_stop(&mcu_i2c);
    return 0;
    }

/****************************************************************************

  • 名称 :aic23b_read
  • 功能 : 读aic23b寄存器函数
  • 入口参数 :addr:寄存器偏移地址
    buf:寄存器读取数据缓存
  • 出口参数 :返回0
    ****************************************************************************/
    int aic23b_read(unsigned char addr, unsigned char * buf)
    {
    unsigned char *p = buf;
    int ret = -1;
    i2c_start(&mcu_i2c);
    //send slave address
    if(i2c_write(&mcu_i2c, AIC23B_ADDRESS, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    //send sub-address of slave
    if(i2c_write(&mcu_i2c, addr, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    i2c_stop(&mcu_i2c);
    i2c_start(&mcu_i2c);
    // send slave address (+1 read mode)
    if(i2c_write(&mcu_i2c, AIC23B_ADDRESS+1, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    if(i2c_wait_slave(&mcu_i2c, 1000)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    i2c_read(&mcu_i2c, p++, 1); // send ack
    i2c_stop(&mcu_i2c);
    return 0;
    }

/****************************************************************************

  • 名称 :Init_aic23b
  • 功能 : 音频模块的内部初始化
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/

void init_aic23b(void)
{
unsigned char i;

mcu_i2c.sclk = PF0;         //时钟PF脚
mcu_i2c.sdata = PF1;        //数据PF脚
mcu_i2c.low_ns = 7000;      //低电平延时 ns
mcu_i2c.high_ns = 6000;     //高电平延时 ns	   
       
i2c_init(&mcu_i2c);	
	aic23b_write(PWDC,0x000FF);   
	aic23b_write(LLVC,0x1d);    
aic23b_write(RLVC,0x1d);    
aic23b_write(LHVC,0xff);   
aic23b_write(RHVC,0xff);   
	aic23b_write(AAPC,DAC);
	aic23b_write(DAPC,0);    
aic23b_write(PWDC,0);
	aic23b_write(DAIF,MS|FOR|LRP);   
	aic23b_write(SARC,0);        
	aic23b_write(DIAC,ACT|RES);

}

cpu.c

#include <cdefBF533.h>
/**********************************************************************************

  • 名称 :Set_PLL
  • 功能 :初始化内核时钟和系统时钟
  • 入口参数 :pmsel pssel 设置参数
  • 出口参数 :无
    ***********/
    void Set_PLL(int pmsel,int pssel)
    {
    int new_PLL_CTL;
    pPLL_DIV = pssel;
    asm(“ssync;”);
    new_PLL_CTL = (pmsel & 0x3f) << 9;
    pSIC_IWR |= 0xffffffff;
    if (new_PLL_CTL != pPLL_CTL)
    {
    pPLL_CTL = new_PLL_CTL;
    asm(“ssync;”);
    asm(“idle;”);
    }
    }
    /
  • 名称 :Init_EBIU
  • 功能 :初始化并允许异步BANK存储器工作
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

/****************************************************************************

  • 名称 :Init_SDRAM
  • 功能 :初始化SDRAM
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Init_SDRAM(void)
    {
    *pEBIU_SDRRC = 0x00000817;
    *pEBIU_SDBCTL = 0x00000013;
    *pEBIU_SDGCTL = 0x0091998d;
    ssync();
    }

/****************************************************************************

  • 名称 : delay
  • 功能 : 延时函数
  • 入口参数 :无
  • 返回值 :无
    ****************************************************************************/
    void delay(unsigned int tem)
    {
    int i;
    for(i=0;i<tem;i++)
    asm(“nop;”);
    }

I2C.c

#include <cdefBF533.h>
#include “i2c.h”

#define CORE_CLK_IN 24 * 1000 * 1000

#define SET_PF(pf)
do{
*pFIO_FLAG_S = (pf);
ssync();
}while(0)

#define CLR_PF(pf)
do{
*pFIO_FLAG_C = (pf);
ssync();
}while(0)

#define SET_PF_OUTPUT(pf)
do{
*pFIO_INEN &= ~(pf);
*pFIO_DIR |= (pf);
ssync();
}while(0)

#define SET_PF_INPUT(pf)
do{
*pFIO_DIR &= ~(pf);
*pFIO_INEN |= (pf);
ssync();
}while(0)

int get_core_clk(void)
{
int tempPLLCTL;
int _DF;
int VCO;
int MSEL1;

tempPLLCTL = *pPLL_CTL;


MSEL1 = ((tempPLLCTL & 0x7E00) >> 9);
_DF   =  tempPLLCTL & 0x0001;

VCO  = MSEL1 * __CORE_CLK_IN__;
if(_DF == 1)
	VCO /= 2;

return  VCO;

}
void delay_ns(unsigned int core_clock, unsigned long long count)
{
count *= core_clock;
count /= 1000000000;
while(count–);

}

int _get_sdata(i2c_device * dev)
{
return ((*pFIO_FLAG_D & dev->sdata) ? 1 : 0);
}

void i2c_init(i2c_device * dev)
{
dev->core_clock = get_core_clk();
dev->delay_ns = delay_ns;
*pFIO_DIR |= dev->sclk | dev->sdata;
ssync();
}

void i2c_deinit(i2c_device * dev)
{
dev->sclk = 0;
dev->sdata = 0;

*pFIO_DIR &=  ~(dev->sclk | dev->sdata);
ssync();

}

void i2c_start(i2c_device * dev)
{
SET_PF_OUTPUT(dev->sdata);
SET_PF_OUTPUT(dev->sclk);

SET_PF(dev->sdata);
SET_PF(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns);

CLR_PF(dev->sdata);
delay_ns(dev->core_clock, dev->low_ns);

CLR_PF(dev->sclk);
delay_ns(dev->core_clock, dev->low_ns);

}

void i2c_stop(i2c_device * dev)
{
CLR_PF(dev->sclk);
delay_ns(dev->core_clock, dev->low_ns);

SET_PF_OUTPUT(dev->sdata);
CLR_PF(dev->sdata);
delay_ns(dev->core_clock, dev->low_ns);

SET_PF_INPUT(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns);

SET_PF_INPUT(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns);

}

int i2c_read_ack(i2c_device * dev)
{
int ret = 0;

SET_PF_INPUT(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns/3);

SET_PF(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns/3);

ret = _get_sdata(dev);

delay_ns(dev->core_clock, dev->high_ns/3);
CLR_PF(dev->sclk);

delay_ns(dev->core_clock, dev->low_ns);

SET_PF_OUTPUT(dev->sdata);
return ret;

}

int i2c_wait_slave(i2c_device * dev, unsigned int time_out)
{
int ret;
int count = time_out * 2 / dev->high_ns;

SET_PF_INPUT(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns/2);

do{
	ret = *pFIO_FLAG_D & dev->sclk;
	if(ret)
	   break;
	delay_ns(dev->core_clock, dev->high_ns/2);
}while(count--);

SET_PF_OUTPUT(dev->sclk);
return !ret;

}

void i2c_write_ack(i2c_device * dev)
{
SET_PF_OUTPUT(dev->sdata);
CLR_PF(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns/2);
SET_PF(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns);

CLR_PF(dev->sclk);
delay_ns(dev->core_clock, dev->low_ns);

}

int i2c_write(i2c_device * dev, unsigned char value, int need_ack)
{
int ret = -1;
unsigned char index;

SET_PF_OUTPUT(dev->sdata);

//send 8 bits to slave
for(index = 0; index < 8; index++){
	//send one bit to the i2c bus
	if((value<<index) & 0x80){
		SET_PF(dev->sdata);
	} else {
		CLR_PF(dev->sdata);
	}
	
	delay_ns(dev->core_clock, dev->low_ns/2);
	
	SET_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->high_ns);
	
	CLR_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->low_ns/2);
}

if(need_ack){
	ret = i2c_read_ack(dev);
}
return ret;

}

int i2c_read(i2c_device * dev, unsigned char * value, int send_ack)
{
unsigned char index;
*value = 0x00;

SET_PF_INPUT(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns/2);

//get 8 bits from the device
for(index = 0; index < 8; index++){
	SET_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->high_ns/2);
	
	*value <<= 1;
	*value |= _get_sdata(dev);
	
	delay_ns(dev->core_clock, dev->high_ns/2);
	
	CLR_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->low_ns);
}

// send ack to slave
if(send_ack){
	i2c_write_ack(dev);
}
return *value;

}

main.c

void main()
{
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
IIC_Enable();

init_aic23b();
Init_Interrupts();
Init_Sport0();
Init_DMA();
Enable_DMA_Sport0();

while(1); 

}

talkthrough.c

#include <cdefBF533.h>
#include <sys\exception.h>

#define TIMOD_DMA_TX 0x0003 // SPI transfer mode
#define SLEN_32 0x001f // SPORT0 word length
#define FLOW_1 0x1000 // DMA flow mode

#define INTERNAL_ADC_L0 0
#define INTERNAL_ADC_R0 2
#define INTERNAL_DAC_L0 0
#define INTERNAL_DAC_R0 2
#define INTERNAL_ADC_L1 1
#define INTERNAL_ADC_R1 3
#define INTERNAL_DAC_L1 1
#define INTERNAL_DAC_R1 3

EX_INTERRUPT_HANDLER(Sport0_RX_ISR);

int iChannel0LeftIn, iChannel1LeftIn;
int iChannel0RightIn, iChannel1RightIn;
int iChannel0LeftOut, iChannel1LeftOut;
int iChannel0RightOut, iChannel1RightOut;

volatile int iTxBuffer1[4];
volatile int iRxBuffer1[4];
/****************************************************************************

  • 名称 :Init_Timers
  • 功能 :初始化TIMER0 为PWM模式。
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Init_Timers(void)
    {
    *pTIMER0_CONFIG = 0x0019;
    *pTIMER0_PERIOD = 0x00800000;
    *pTIMER0_WIDTH = 0x00400000;
    *pTIMER_ENABLE = 0x0001;
    }

void Init_Sport0(void)
{
*pSPORT0_RCR1 = RFSR | RCKFE;
*pSPORT0_RCR2 = RSFSE |SLEN_32;

*pSPORT0_TCR1 = TFSR| LATFS | TCKFE;
*pSPORT0_TCR2 = TSFSE | SLEN_32;	

}

void Init_DMA(void)
{
*pDMA1_PERIPHERAL_MAP = 0x1000;
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1;
*pDMA1_START_ADDR = (void *)iRxBuffer1;
*pDMA1_X_COUNT = 4;
*pDMA1_X_MODIFY = 4;

*pDMA2_PERIPHERAL_MAP = 0x2000;
*pDMA2_CONFIG = WDSIZE_32 | FLOW_1;
*pDMA2_START_ADDR = (void *)iTxBuffer1;
*pDMA2_X_COUNT = 4;
*pDMA2_X_MODIFY = 4;

}

void Enable_DMA_Sport0(void)
{
*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN);
*pDMA1_CONFIG = (*pDMA1_CONFIG | DMAEN);

*pSPORT0_TCR1 	= (*pSPORT0_TCR1 | TSPEN);
*pSPORT0_RCR1 	= (*pSPORT0_RCR1 | RSPEN);

}

void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffff2f;
*pSIC_IAR2 = 0xffffffff;

register_handler(ik_ivg9, Sport0_RX_ISR);

*pSIC_IMASK = 0x00000200;

}

void Process_Data(void)
{
iChannel0LeftOut = iChannel0LeftIn;
iChannel0RightOut = iChannel0RightIn;
iChannel1LeftOut = iChannel1LeftIn;
iChannel1RightOut = iChannel1RightIn;
}

EX_INTERRUPT_HANDLER(Sport0_RX_ISR)
{
*pDMA1_IRQ_STATUS = 0x0001;

iChannel0LeftIn = iRxBuffer1[INTERNAL_ADC_L0];
iChannel0RightIn = iRxBuffer1[INTERNAL_ADC_R0];
iChannel1LeftIn = iRxBuffer1[INTERNAL_ADC_L1];
iChannel1RightIn = iRxBuffer1[INTERNAL_ADC_R1];

Process_Data();	
			
iTxBuffer1[INTERNAL_DAC_L0] = iChannel0LeftOut;
iTxBuffer1[INTERNAL_DAC_R0] = iChannel0RightOut;
iTxBuffer1[INTERNAL_DAC_L1] = iChannel1LeftOut;
iTxBuffer1[INTERNAL_DAC_R1] = iChannel1RightOut;

}

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

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

相关文章

【计算机图形学入门】笔记5:光栅化(三角形的离散化)

目录05光栅化&#xff08;三角形的离散化&#xff09;1.Canonical Cube to Screen 从标准立方体到屏幕1.屏幕是什么&#xff1f;What is a screen?2.光栅化是什么&#xff1f;Raster screen in German3.像素Pixel (FYI, short for “picture element”)4.使用以下矩阵公式将中…

基于蜂虎狩猎 (BEH) 算法求解单目标优化问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【克罗地亚VS巴西】和【荷兰VS阿根廷】足球的魅力

两场球赛你看了吗时间段克罗地亚 VS 巴西荷兰 VS 阿根廷最后的话时间段 &#x1f34b;12月09日的 23:00 克罗地亚 VS 巴西 &#x1f34a;12月10日的 03:00 荷兰 VS 阿根廷 克罗地亚 VS 巴西 半场比赛双方都没有找到绝佳的破门良机&#xff0c;0-0战平。 90分钟内&#xff…

Java的线程及多线程

1 线程 1.1 Thread 下面是两个demo&#xff0c;第一个是线程执行顺序&#xff0c;第二个是多个线程的顺序。 其中线程的start可以看成是就绪状态&#xff0c;cpu并不一定会马上去执行run方法的内容&#xff0c;因此如果是多线程&#xff0c;顺序是不确定的。 public class Th…

【Pytorch】第 6 章 :用函数逼近扩展学习

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【GRU回归预测】基于门控循环单元GRU实现数据多维输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

英方软件通过注册:预计年营收2亿 为胡军擎与江俊夫妻店

雷递网 雷建平 12月8日上海英方软件股份有限公司&#xff08;简称&#xff1a;“英方软件”&#xff09;日前通过注册&#xff0c;准备在科创板上市。英方软件计划募资5.7亿元&#xff0c;其中&#xff0c;2.46亿元用于行业数据安全和业务连续性及大数据复制软件升级项目&#…

JavaScript:错误处理

一个优秀的产品&#xff0c;需要有一个良好的错误处理策略可以让用户知道到底发生什么。不至于让用户自己不知道发生了什么&#xff0c;然后再重试或者是不至于然用户感到特别厌烦&#xff0c;然后直接离开。 try/catch语句 try/catch语句&#xff0c;在JavaScript中作为处理…

51 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载

前言 之前 碰到了一个 flink 基于 ChildFirstClassLoader 来进行任务隔离 导致的内存泄漏的问题 然后 使用 demo 复现了一下 问题 之后 想探索一下 java language 中 类型的卸载相关 并且会 拓展一些其他的知识 以下测试用例基于 jdk8, 部分截图基于 jdk9 测试用例 T…

0行代码拿210万年薪,ChatGPT催生新型「程序员」岗:工作纯靠和AI聊天

梦晨 发自 凹非寺量子位 | 公众号 QbitAI靠玩ChatGPT&#xff0c;还能找到新工作&#xff1f;没错&#xff0c;Riley Goodside&#xff08;后面叫他好面哥&#xff09;4月份开始在网上发布玩GPT-3的心得。最近ChatGPT一波爆火&#xff0c;他不光粉丝涨了一万多&#xff0c;还收…

『 云原生·Docker』Docker中部署Nginx

系列文章目录 本系列主要分为以下六大部分,正在更新中,尽请期待&#xff01; 『 云原生生之门』 『 云原生前置知识』 『 云原生Docker』 『 云原生Kubernetes』 『 云原生KubeSphere』 『 云原生DevOps』 &#x1f6a9;点击关注本专栏 提示&#xff1a;已经更新的或正在更新的…

自动驾驶之MultiPath++论文阅读笔记

预测道路参与者的future behavior. 摘要 将输入由dense image-based encoding改为a sparse encoding of heterogeneous scene elements. 即用polylines(折现)来描述road features和原始的agent state information(例如位置、速度和加速度)。 主要方法是对这些元素进行a conte…

【POJ No. 2778】DNA 序列 DNA Sequence

【POJ No. 2778】DNA 序列 DNA Sequence 北大OJ 题目地址 【题意】 DNA序列是一个只包含A、C、T和G的序列。分析DNA序列片段非常有用&#xff0c;若动物的DNA序列包含片段ATC&#xff0c;则意味着该动物可能患有遗传病。 给定m 个遗传病片段&#xff0c;求有多少种长度为n 的…

自动驾驶两大路线对决,渐进式玩家为何更容易得人心?

HiEV消息&#xff08;文/长海&#xff09;对自动驾驶赛道而言&#xff0c;2022年的冬天格外冷冽。寒潮袭来&#xff0c;从各家的应变方式看&#xff0c;不同路径的玩家呈现“冰火两重天”&#xff0c;进化的趋势也越来越清晰。 以Waymo为代表、持续研发L4级无人驾驶的跨越式路线…

web课程设计网页规划与设计 :DW旅游主题网页设计——凤阳智慧旅游官方-地方旅游网站模板html源码HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

ONES X 华西证券|以需求全流程管控,洞见金融数据价值

近日&#xff0c;ONES 签约全国一流证券金融服务商——华西证券&#xff0c;助推华西证券构建需求全流程管控体系&#xff0c;保障需求任务的上下游衔接与顺畅流转&#xff0c;做到系统内所有数据透明化、线上化、统一化&#xff0c;提高团队协同效率&#xff0c;打破「部门墙」…

所谓“生活的艺术“, 就是悠闲二字

关于作者 作为陈独秀、胡适、鲁迅的同时代人&#xff0c;林语堂是"五四"新文化运动的参与者&#xff0c;中国现 代著名作家、学者、翻译家、语言学家&#xff0c;新道家代表人物。他清晰地看到了关于中国 传统文化观点的两种极端倾向&#xff0c;一种是把 中国传统文…

R语言VAR模型的不同类型的脉冲响应分析

目录 模型与数据 估算值 预测误差脉冲响应 识别问题 正交脉冲响应 结构脉冲反应 广义脉冲响应 参考文献 最近我们被客户要求撰写关于脉冲响应分析的研究报告&#xff0c;包括一些图形和统计输出。脉冲响应分析是采用向量自回归模型的计量经济学分析中的重要一步。它们的…

火爆出圈的ChatGPT,你也来体验一下吧!

最近网络上流行了一个叫ChatGPT的东西&#xff0c;他到底是什么东西&#xff1f; ChatGPT是人工智能实验室OpenAI发布的一款对话式聊天机器人。他可以解答很多刁钻有难度的问题&#xff0c;一经发布就火遍科技圈。12月4日&#xff0c;马斯克在咨询该聊天机器人关于推特经营的建…

构建高性能内存队列:Disruptor 永远滴神~

我们清楚使用锁的性能比较低&#xff0c;尽量使用无锁设计。接下来就我们来认识下Disruptor。 Disruptor简单使用 先简单介绍下&#xff1a; Disruptor它是一个开源的并发框架&#xff0c;并获得2011 Duke’s程序框架创新奖【Oracle】&#xff0c;能够在无锁的情况下实现网络…