S32K144 CAN使用

news2024/9/24 19:21:27

        S32K144是恩智浦半导体推出的一款高性能微控制器(MCU),主要针对汽车和高可靠性的工业应用。在汽车工业应用中使用CAN总线必不可少。

需要注意的是在ISO 11898(High Speed,速度在5kbps-1Mbps)中,隐形电平电压差在0附件。显性电平电压差在2V左右

ISO 11519(Low Speed,速度在5kbsp-125kbps)中,隐形电平电压差小于0V,显性电平电压差大于0V。在2006年之前使用的是ISO 11519,现在使用的是ISO 11898

CAN总线与RS485的比较:

1,速度与距离:CAN与RS485以1Mbit/S的高速率传输的距离都不超过100M,可谓高速上的距离差不多。但是在低速时CAN以5Kbit/S时,距离可达10KM,而485再低的速率也只能到1219米左右(都无中继)。可见CAN在长距离的传输上拥有绝对的优势

2,总线利用率:RS485是单主从结构,就是一个总线上只能有一台主机,通讯都由它发起的,它没有下命令,下面的节点不能发送,而且要发完即答,受到答复后,主机才向下一个节点询问,这样是为了防止多个节点向总线发送数据,而造成数据错乱。而CAN-bus是多主从结构,每个节点都有CAN控制器,多个节点发送时,以发送的ID号自动进行仲裁,这样就可以实现总线数据不错乱,而且一个节点发完,另一个节点可以探测到总线空闲,而马上发送,这样省去了主机的询问,提高了总线利用率,增强了快速性。所以在汽车等实性要求高的系统,都是用CAN总线,或者其他类似的总线。

3,错误检测机制,RS485只规定了物理层,而没有数据链路层,所以它对错误是无法识别的,除非一些短路等物理错误。这样容易造成一个节点破坏了,拼命向总线发数据(一直发1),这样造成整个总线瘫痪。所以RS485一旦坏一个节点,这个总线网络都挂。而CAN总线有CAN控制器,可以对总线任何错误进行检测,如果自身错误超过128个,就自动闭锁。保护总线。如果检测到其他节点错误或者自身错误,都会向总线发送错误帧,来提示其他节点,这个数据是错误的。大家小心。这样CAN总线一旦有一个节点CPU程序跑飞了,它的控制器自动闭锁。保护总线。所以在安全性要求高的网路,CAN是很强的。

4,价格与培训成本:CAN器件的价格大约是485的2倍这样,485的通讯从软件上是很方便的,只要懂串行通讯,就可以编程,而CAN需要底层工程师了解CAN复杂的层,编写上位机软件也要了解CAN的协议。可谓培训成本较高

5,CAN总线通过CAN控制器接口芯片82C250的两个输出端CANH和CANL与物理总线相连,而CANH端的状态只能是高电平或悬浮状态,CANL端只能是低电平或悬浮状态。这就保证不会出现象在RS-485网络中,当系统有错误,出现多节点同时向总线发送数据时,导致总线呈现短路,从而损坏某些节点的现象。而且CAN节点在错误严重的情况下具有自动关闭输出功能,以使总线上其他节点的操作不受影响,从而保证不会出现象在网络中,因个别节点出现问题,使得总线处于“死锁”状态。

6,CAN具有完善的通信协议,可由CAN控制器芯片及其接口芯片来实现,从而大大降低了系统的开发难度,缩短了开发周期,这些是只仅仅有电气协议的RS-485所无法比拟的

        本次示例使用的芯片为S32K14,环境为S32 Design Stduio for ARM,使用的CAN端口号为CAN1,测试方法为回环测试

目录

1.创建一个基本工程

2.初始化用到的引脚

3.创建一个delay.c/h

4.设置串口输出

4.设置CAN输入&输出

初始化

 接收

发送

整体main函数

 整体CAN函数

现象 


1.创建一个基本工程

这里就不细说

2.初始化用到的引脚

用到的引脚有:

UART1:TX->PTC7  RX->PTC6

CAN1:    TX->PTA13 RX->PTA12

构建项目

配置串口1 波特率115200

配置CAN为CAN1,波特率为500K,回环模式

设置完成后构建项目

3.创建一个delay.c/h

delay.c

  static uint32_t fac_us;

  /*延迟函数致敬原子哥*/
  void SysTick_Init(void)  //systick 走 core_clk 48mhz  重装载寄存器 FFFFFF 为16 777 215hz 16.77mhz/48mhz 约等于333毫秒
  {
  	S32_SysTick->RVR = 0xFFFFFFul; //重装载寄存器
  	S32_SysTick->CVR = 0ul; //当前计数
  	S32_SysTick->CSR = 0u; //控制寄存器
  }

  /* Enable SysTick counter and interrupt */
  void SysTick_Enable(void)
  {
  	S32_SysTick->CSR = S32_SysTick_CSR_TICKINT(1u) | S32_SysTick_CSR_ENABLE(1);
  }

  /* Disable SysTick */
  void SysTick_Disable(void)
  {
  	S32_SysTick->CSR = 0ul;
  }


  static uint32_t fac_us;

  void delay_us(uint32_t nus)
  {
  	uint32_t ticks;
  	uint32_t told,tnow,tcnt=0;
  	uint32_t reload=S32_SysTick->RVR;				//LOAD的值
  	ticks=nus*fac_us; 						//需要的节拍数
  	told= S32_SysTick->CVR ;      				//刚进入时的计数器值
  	while(1)
  	{
  		tnow= S32_SysTick->CVR ;
  		if(tnow!=told)
  		{
  			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
  			else tcnt+=reload-tnow+told;
  			told=tnow;
  			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
  		}
  	};
  }

  void delay_ms(uint32_t nms)
  {
  	uint32_t i;
  	for(i=0;i<nms;i++) delay_us(1000);
  }

  int delay_init(void)
  {
  	uint32_t frequency;
  	CLOCK_SYS_GetFreq(CORE_CLOCK, &frequency);
  	fac_us = frequency / 1000000;// 得到的频率是mhz 如果想知道1us多少个节拍,需要除 1 000 000
  	SysTick_Init(); //systick 走 core_clk 48mhz  重装载寄存器 FFFFFF 为16 777 215hz 16.77mhz/48mhz 0.333秒  约等于333毫秒
  	SysTick_Enable();
  	return fac_us;
  }

delay.h


#ifndef DELAY_H_
#define DELAY_H_

void delay_ms(uint32_t nms);
void delay_us(uint32_t nus);
int delay_init(void);

#endif /* DELAY_H_ */

4.设置串口输出

#include <stdio.h>
#include <string.h>
#include "stdarg.h"
#include <stdint.h>
#include <stdbool.h>


 char USART1_TX_BUF[200];

 void u1_printf(char* fmt,...)
 {
   uint32_t bytesRemaining;
	va_list ap;
	va_start(ap,fmt);
	vsprintf((char*)USART1_TX_BUF,fmt,ap);
	va_end(ap);
	LPUART_DRV_SendData(INST_LPUART1, (uint8_t *)USART1_TX_BUF, strlen(USART1_TX_BUF)); //发送
    while (LPUART_DRV_GetTransmitStatus(INST_LPUART1, &bytesRemaining)!= STATUS_SUCCESS)  {}
 }

接下来就可以使用u1_printf来输出了

int main(void)
{
  /* Write your local variable definition here */

  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  #ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of Processor Expert internal initialization.                    ***/
    CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
    delay_init();//初始化delay函数
    PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
    LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0);
  /* Write your code here */
  /* For example: for(;;) { } */
    u1_printf("S32 begin\r\n");
	while(1){

	}
  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  #ifdef PEX_RTOS_START
    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of RTOS startup code.  ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;) {
    if(exit_code != 0) {
      break;
    }
  }
  return exit_code;
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

无误

4.设置CAN输入&输出

初始化

 
#define CAN_MSG_MASK_ALL  0x07FF //全bit匹配 只接收接收邮箱里有的ID
#define CAN_MSG_MASK_NULL 0x0    //不匹配   接收所有消息

can_message_t recvMsg_CAN1; //接收邮箱结构体
can_message_t trasiMsg_CAN1 ; //发送邮箱结构体
uint32_t IRQ_CAN1_RX; //CAN1收到信息标志位

#define CAN1_TX_MAILBOX1  0x1     //CAN1发送邮箱标识
#define CAN1_RX_MAILBOX1  0x2	  //CAN1接收邮箱标识 最大为32
#define CAN1_RX_MAILBOX1_ID 0x55  //CAN1识别的ID
#define CAN1_TX_MAILBOX1_ID 0x55  //CAN1发送的ID

 void CAN1_Init(void){
	 CAN_Init(&can_pal1_instance, &can_pal1_Config0);
	  can_buff_config_t Rx_buffCfg =  {
		  .enableFD = false,//表示是否启用灵活数据速率CAN FD
		  .enableBRS = false,//表示是否在CAN FD帧内启用比特率切换
		  .fdPadding = 0U,//表示当数据长度码指定的负载大小大于实际数据长度时,用于填充的值。这有助于保持数据帧的一致性
		  .idType = CAN_MSG_ID_STD,//标准帧
		  .isRemote = false,//表示该帧是否为远程请求帧
	  };
	  can_buff_config_t Tx_buffCfg =  {
		  .enableFD = false,
		  .enableBRS = false,
		  .fdPadding = 0U,
		  .idType = CAN_MSG_ID_STD,
		  .isRemote = false
	  };
	  CAN_ConfigRxBuff(&can_pal1_instance, CAN1_RX_MAILBOX1, &Rx_buffCfg, CAN1_RX_MAILBOX1_ID);//注册一个接收的邮箱 接收的ID 0x55
	  CAN_ConfigTxBuff(&can_pal1_instance, CAN1_TX_MAILBOX1, &Tx_buffCfg);  //发送邮箱配置载入
	  CAN_SetRxFilter(&can_pal1_instance,CAN_MSG_ID_STD,CAN1_RX_MAILBOX1,CAN_MSG_MASK_ALL);//标准帧 全bit匹配
	  CAN_InstallEventCallback(&can_pal1_instance,&CAN1_Callback_Func,(void*)0); //注册CAN1回调函数
	  CAN_Receive(&can_pal1_instance, CAN1_RX_MAILBOX1, &recvMsg_CAN1); //CAN1接收邮箱CAN1_RX_MAILBOX1开启接收
}
 

初始化CAN1,主要设置了CAN1的收发邮箱以及开启了中断

 接收

刚刚在初始化里开启了中断,现在接收只需要在中断里置位标志位后再main函数处理即可,刚刚注册的回调函数为CAN1_Callback_Func()

//CAN1回调函数
void CAN1_Callback_Func (uint32_t instance,can_event_t event,uint32_t buffIdx,void *flexcanState)
{
	(void)flexcanState;
	(void)instance;
	(void)buffIdx;
	if(event == CAN_EVENT_RX_COMPLETE){//接收完成 事件
		if(recvMsg_CAN1.id == CAN1_RX_MAILBOX1_ID) {
			IRQ_CAN1_RX =CAN1_RX_MAILBOX1_ID;
			CAN_Receive(&can_pal1_instance, CAN1_RX_MAILBOX1, &recvMsg_CAN1);//接收报文并重新注册回调函数
		}
	}
}

在main函数里 处理数据

//CAN1处理消息
void CAN1_Read(void){
	u1_printf("CAN1 邮箱消息: ID:0x%x \r\n",recvMsg_CAN1.id);
	for(uint8_t i=0;i<recvMsg_CAN1.length;i++){
		u1_printf("0x%x ",recvMsg_CAN1.data[i]);
	}
	u1_printf("\r\n");//依次打印出标准帧的数据
}

main里: 

if(IRQ_CAN1_RX == CAN1_RX_MAILBOX1_ID){
	CAN1_Read();
}

发送

//CAN发送数据数组 ID
void CAN1_Send(uint8_t *dat,uint32_t ID){
	can_message_t trasiMsg_CAN1;
	trasiMsg_CAN1.cs = 0U;
	trasiMsg_CAN1.id = ID;
	for(uint8_t i=0;i<8;i++){
		trasiMsg_CAN1.data[i]=dat[i];
	}
	trasiMsg_CAN1.length = 8;
	CAN_Send(&can_pal1_instance, CAN1_TX_MAILBOX1, &trasiMsg_CAN1);
	 u1_printf("CAN1 Send  ID:0x%x \r\n",trasiMsg_CAN1.id);
	 for(int i=0; i<trasiMsg_CAN1.length;i++)
	 {
		 u1_printf("0x%x ",trasiMsg_CAN1.data[i]);
	 }
	 u1_printf("\r\n");
}

在main函数中使用一个按键触发,也可以用别的条件触发

if((PINS_DRV_ReadPins(PTC)>>12)&0x01){
	while((PINS_DRV_ReadPins(PTC)>>12)&0x01);
	CAN1_Send(candat,CAN1_TX_MAILBOX1_ID);//使用CAN1_TX_MAILBOX1_ID发送数组candat
}

 在main再加一句 使得在接收到数据之后可以处理

if(IRQ_CAN1_RX==CAN1_RX_MAILBOX1_ID){
		CAN1_Read();
		IRQ_CAN1_RX=0;
}

整体main函数

int main(void)
{

  /* Write your local variable definition here */
  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  #ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of Processor Expert internal initialization.                    ***/
    CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
    delay_init();//初始化delay函数
    PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
    LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0);
    CAN1_Init();
  /* Write your code here */
  /* For example: for(;;) { } */
    u1_printf("S32 begin\r\n");
	while(1){
		if(IRQ_CAN1_RX==CAN1_RX_MAILBOX1_ID){
			CAN1_Read();
			IRQ_CAN1_RX=0;
		}
		if((PINS_DRV_ReadPins(PTC)>>12)&0x01){
			CAN1_Send(candat,CAN1_TX_MAILBOX1_ID);
		    while((PINS_DRV_ReadPins(PTC)>>12)&0x01);
		}
		delay_ms(100);
	}
  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  #ifdef PEX_RTOS_START
    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of RTOS startup code.  ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;) {
    if(exit_code != 0) {
      break;
    }
  }
  return exit_code;
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

 整体CAN函数

#define CAN_MSG_MASK_ALL  0x07FF //全bit匹配 只接收接收邮箱里有的ID
#define CAN_MSG_MASK_NULL 0x0    //不匹配   接收所有消息

can_message_t recvMsg_CAN1; //接收邮箱结构体

uint32_t IRQ_CAN1_RX; //CAN1收到信息标志位

#define CAN1_TX_MAILBOX1  0x0     //CAN1发送邮箱标识
#define CAN1_RX_MAILBOX1  0x1	  //CAN1接收邮箱标识 最大为32
#define CAN1_RX_MAILBOX1_ID 0x55  //CAN1识别的ID 为11位标识
#define CAN1_TX_MAILBOX1_ID 0x55  //CAN1发送的ID 为11位标识

//CAN1回调函数
void CAN1_Callback_Func (uint32_t instance,can_event_t event,uint32_t buffIdx,void *flexcanState)
{
	(void)flexcanState;
	(void)instance;
	(void)buffIdx;
	if(event == CAN_EVENT_RX_COMPLETE){//接收完成 事件
		if(recvMsg_CAN1.id == CAN1_RX_MAILBOX1_ID) {
			IRQ_CAN1_RX =CAN1_RX_MAILBOX1_ID;
			CAN_Receive(&can_pal1_instance, CAN1_RX_MAILBOX1, &recvMsg_CAN1);//接收报文并重新注册回调函数
		}
	}
}

 void CAN1_Init(void){
	 CAN_Init(&can_pal1_instance, &can_pal1_Config0);
	  can_buff_config_t Rx_buffCfg =  {
		  .enableFD = false,//表示是否启用灵活数据速率CAN FD
		  .enableBRS = false,//表示是否在CAN FD帧内启用比特率切换
		  .fdPadding = 0U,//表示当数据长度码指定的负载大小大于实际数据长度时,用于填充的值。这有助于保持数据帧的一致性
		  .idType = CAN_MSG_ID_STD,//标准帧
		  .isRemote = false,//表示该帧是否为远程请求帧
	  };
	  can_buff_config_t Tx_buffCfg =  {
		  .enableFD = false,
		  .enableBRS = false,
		  .fdPadding = 0U,
		  .idType = CAN_MSG_ID_STD,
		  .isRemote = false
	  };
	  CAN_ConfigRxBuff(&can_pal1_instance, CAN1_RX_MAILBOX1, &Rx_buffCfg, CAN1_RX_MAILBOX1_ID);//注册一个接收的邮箱 接收的ID 0x55
	  CAN_ConfigTxBuff(&can_pal1_instance, CAN1_TX_MAILBOX1, &Tx_buffCfg);  //发送邮箱配置载入
	  CAN_SetRxFilter(&can_pal1_instance,CAN_MSG_ID_STD,CAN1_RX_MAILBOX1,CAN_MSG_MASK_ALL);//标准帧 全bit匹配
	  CAN_InstallEventCallback(&can_pal1_instance,&CAN1_Callback_Func,(void*)0); //注册CAN1回调函数
	  CAN_Receive(&can_pal1_instance, CAN1_RX_MAILBOX1, &recvMsg_CAN1); //CAN1接收邮箱CAN1_RX_MAILBOX1开启接收
 }


//CAN1处理消息
void CAN1_Read(void){
	u1_printf("CAN1 邮箱消息: ID:0x%x \r\n",recvMsg_CAN1.id);
	for(uint8_t i=0;i<recvMsg_CAN1.length;i++){
		u1_printf("0x%x ",recvMsg_CAN1.data[i]);
	}
	u1_printf("\r\n");//依次打印出标准帧的数据
}

uint8_t candat[8]={1,2,3,4,5,6,7,8};
void CAN1_Send(uint8_t *dat,uint32_t ID){
	can_message_t trasiMsg_CAN1;
	trasiMsg_CAN1.cs = 0U;
	trasiMsg_CAN1.id = ID;
	for(uint8_t i=0;i<8;i++){
		trasiMsg_CAN1.data[i]=dat[i];
	}
	trasiMsg_CAN1.length = 8;
	CAN_Send(&can_pal1_instance, CAN1_TX_MAILBOX1, &trasiMsg_CAN1);
	 u1_printf("CAN1 Send  ID:0x%x \r\n",trasiMsg_CAN1.id);
	 for(int i=0; i<trasiMsg_CAN1.length;i++)
	 {
		 u1_printf("0x%x ",trasiMsg_CAN1.data[i]);
	 }
	 u1_printf("\r\n");
}

现象 

开机为

按下按键,松开后

至此CAN回环测试成功

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

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

相关文章

收银机打印机相关知识 windows7 查看打印机名称--未来之窗智慧经营收银系统百科

一、名词解释 打印机型号&#xff0c;打印机厂家&#xff0c;打印机接口、打印机驱动&#xff0c;打印机名称 机器的机身都有&#xff0c;打印机品牌&#xff0c;型号 二、什么是打印机接口 2.1 usb接口 一般用在收银小票&#xff0c;结账单&#xff0c;水单 2.2 并口接口 …

RK3568平台开发系列讲解(文件系统篇)什么是 inode?

一、什么是 inode? 为了存储一个文件,除了本身的文件内容块,还需要一个地方来存储文件相关的元信息信息。承载这些文件元数据的数据结构就是 inode(index node),inode 包含了文件元信息,比如文件的所有者、权限、修改时间戳等。 可以使用 ls -i 查看一个文件的 inode 号…

java基础概念11-方法

一、什么是方法 方法&#xff08;method&#xff09;是程序中最小的执行单元。 方法中的程序&#xff0c;要不然就是一起执行&#xff0c;要不然就是一起不执行&#xff01;&#xff01;&#xff01; 二、方法的定义 在Java中&#xff0c;方法定义的一般格式如下&#xff1a;…

牛客 河南萌新联赛2024第(四)场:河南理工大学 B题

比赛链接&#xff1a; 河南萌新联赛2024第&#xff08;四&#xff09;场&#xff1a;河南理工大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) B题&#xff1a;小雷的神奇电脑 题目描述&#xff1a; 小雷有一台特殊的电脑&#xff0c;这台电…

搜维尔科技:如何使用 SenseGlove Nova 在其“CAVE”投影室中操纵虚拟物体

AVR 创建了一个创新的基于 PC 的多面沉浸式环境&#xff0c;参与者完全被虚拟图像和声音包围。 需要解决的挑战&#xff1a; 传统的 VR 系统通常缺乏逼真的触觉反馈&#xff0c;限制了用户的沉浸感。AVR Japan 旨在通过将触觉技术融入其 CAVE 系统来解决这一挑战&#xff0c;使…

【8-9月份唯一机械电气计算机主题的IEEE会议】第七届机电一体化与计算机技术工程国际学术会议(MCTE 2024,8月23-25)

由广东博士创新发展促进会、输变电装备技术全国重点实验室联合主办&#xff0c;重庆大学电气工程学院、AEIC学术交流中心协办的第七届机电一体化与计算机技术工程国际学术会议&#xff08;MCTE 2024&#xff09;将于2024年8月23-25日在中国广州隆重举行。 大会诚挚邀请您投递相…

学习日志8.7--Security Zone防火墙安全区域

安全区域实验拓扑开始之前先通过一台主机和防火墙相连&#xff0c;设置主机的IP地址和网关&#xff0c;开启防火墙设置防火墙接口g1/0/1的IP地址为192.168.1.254&#xff0c;将防火墙设置为主机的网关&#xff0c;尝试能不能用主机ping通防火墙。尝试之后&#xff0c;发现失败&…

蚂蚁CodeFuse代码大模型技术解析:基于全仓库上下文的代码补全

背景 2023年CodeFuse完成了百亿级别的代码大模型从0到1的预训练&#xff0c;配合指令微调、量化部署等一系列配套技术&#xff0c;成功将AI大模型能力应用到多个下游研发场景&#xff0c;助力生产提效。在众多下游产品中&#xff0c;CodeFuse代码补全插件直接触及研发过程中最…

性能测试趋势 2024

效率。其主要目标是确保软件满足性能要求并提供令人满意的用户体验。 有效的性能测试需要仔细的规划、真实的场景以及使用适当的工具来模拟真实世界的条件。定期进行性能测试有助于确保软件系统能够处理不同的工作负载并提供积极的用户体验。性能测试的未来正在受到技术发展的…

SSL证书配置

SSL证书配置 证书申请nginx 配置ssl证书 今天群友发现我的博客证书过期了&#xff0c;重新申请一个免费的部署一下 证书申请 点击创建证书 绑定对应的域名&#xff0c;选择快捷签发&#xff0c;点击提交审核 点击验证&#xff0c;如果购买的域名和服务器都在同一个账号下&…

WPF学习(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件&#xff0c;属性以及使用案例&#xff0c;从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮&#xff08;Button&#xff09;、单选(RadioButton)、复选&#xff08;CheckBox&#xff09;、文本框…

AIGC大模型实践总结(非常详细)零基础入门到精通,收藏这一篇就够了

大模型浪潮席卷全球&#xff0c;在各行各业中的重要性愈发凸显&#xff0c;呈现出一股不可逆转的发展趋势。这一年本人所在业产技也在这一过程中持续探索和尝试AIGC。本文一方面是对AIGC实践的总结回顾&#xff0c;同时也是本人学习实践AIGC过程中一些笔记、心得分享。因个人能…

Linux云计算 |【第二阶段】CLUSTER-DAY4

主要内容&#xff1a; 块存储应用案例&#xff08;快照、快照回滚、快照克隆&#xff09;、分布式文件系统&#xff08;文件系统的构成&#xff1a;inode和block&#xff0c;创建存储池实现inode和block&#xff09;、对象存储&#xff08;radosgw&#xff09; 补充&#xff1…

C++ STL与string类

一 什么是STL&#xff1f; STL&#xff0c;全称是标准模板库&#xff08;Standard Template Library&#xff09;&#xff0c;是C标准库的一部分。STL提供了一些常用的数据结构和算法&#xff0c;帮助开发者更方便、高效地编写代码。通过使用STL&#xff0c;开发者不需要重复造…

吴恩达机器学习笔记 三十九 协同过滤的TensorFlow实现

TensorFlow的一个优点&#xff1a;可以自动算出成本函数的导数 如上图&#xff0c;设 f( x ) wx&#xff0c;成本 J 为(wx - 1)^2&#xff0c;用GradientTape()这个函数&#xff0c;TensorFlow会记录计算成本J所需的操作序列&#xff0c;保存在 tape 中。 dJdw为自动计算出的导…

图片转文字怎么操作?教你几招图片转文字小妙招

在日常的工作学习中&#xff0c;我们每天可能会接触到大量的图片资料&#xff0c;无论是会议纪要、书籍扫描页、还是网络上的有用信息截图&#xff0c;如果能快速将这些图片中的文字提取出来&#xff0c;无疑将极大提升我们的工作效率。下面给大家分享几种能够将图片转换成文字…

AI学习记录 - 自注意力机制的计算流程图

过段时间解释一下&#xff0c;为啥这样子计算&#xff0c;研究这个自注意力花了不少时间&#xff0c;网上很多讲概念&#xff0c;但是没有具体的流程图和计算方式总结…

多线程 01:Java 多线程学习导航,线程简介,线程相关概念的整理

一、概述 记录时间 [20240807] 立秋 & 128 创作纪念日 本文是关于 Java 多线程学习的导航篇&#xff0c;总览了有关多线程学习的几个模块。简单介绍了一些与线程相关的基本概念&#xff0c;便于后续展开多线程的学习。 前置知识&#xff1a;Java 基础篇&#xff1b;Java 面…

腾讯云AI代码助手的实用性能以及带给开发者的便捷开发陪伴

腾讯云AI代码助手的实用性能以及带给开发者的便捷开发陪伴 前言一、开发环境介绍二、腾讯云AI代码助手使用实例1 一键代码补全2 与腾讯云ai代码助手对话3 直接对源码进行注释&#xff0c;查错 三 获得的帮助与提升四 对腾讯云AI代码助手的建议总结 前言 在日常的编程工作的生活…

SQL报错注入之updatexml

目录 1.updatexml报错原理 2.判断是否有注入点 我们在地址栏中输入?id1 我们在地址栏中输入?id1-- 3.updatexml报错注入 3.1爆库名 3.2爆表名 3.3爆字段名 3.4爆数据 1.updatexml报错原理 updatexml(xml_doument,XPath_string,new_value) 第一个参数&#xff1a;XML…