ZYNQ中断例程
GPIO 中断系统初始化流程:
第一步:初始化 cpu 的异常处理功能
第二步:初始化中断控制器
第三步:向 CPU 注册异常处理回调函数;
第四步:将中断控制器中的对应中断 ID 的中断与中断控制器相连接
第五步:设置 GPIO 的中断类型,比如高电平中断、低电平中断、上升沿中断、
下降沿中断等。
第六步:设置 GPIO 中断回调函数,这里设置的回调函数是用于用户使用的。
第七步:使能 GPIO 的对应 PIN 的中断
第八步:使能中断控制器
第九步:使能异常处理功能
注意:AMP模式下对来自PL端的中断要用XScuGic_InterruptMaptoCpu()函数将CPU和中断对应起来
GIC在ZYNQ中只有一个,当两个CPU都需要中断时,要编程确定中断初始化的顺序
1.PS端GPIO中断
/*使用中断:用PS端口的GPIO操控PS端口的LED
*/
#include "stdio.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "sleep.h"
#include "xscugic.h"
//器件ID
#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
//GPIO的中断号 52
#define GPIO_INTERRUPT_ID XPAR_XGPIOPS_0_INTR//核心板上PS端LED
#define MIO_0_LED 0
//核心板上PS端按键
#define MIO_12_KEY 12
//实例指针
XGpioPs_Config * ConfigPtr ;
XScuGic_Config * IntcConfig ; /* Instance of the interrupt controller */
//实例
XGpioPs Gpio ; /* The driver instance for GPIO Device. */
XScuGic Intc ; /* The Instance of the Interrupt Controller Driver */void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId);
void IntrHandler();u32 key_press = 0;int main(){printf("GPIO INTERRUPT TEST!\n\r");u32 led_value = 0;//根据器件ID,查找器件的配置信息,返回值是一个结构体指针(XGpioPs_Config *)ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);//设置GPIO方向(0输入 1输出)XGpioPs_SetDirectionPin(&Gpio, MIO_0_LED, 1);XGpioPs_SetDirectionPin(&Gpio, MIO_12_KEY, 0);//设置输出使能(0关闭 1打开)XGpioPs_SetOutputEnablePin(&Gpio, MIO_0_LED, 1);//设置中断系统SetupInterruptSystem(&Intc, &Gpio, GPIO_INTERRUPT_ID);//写数据到GPIOwhile(1){if(key_press){XGpioPs_IntrClearPin(&Gpio, MIO_12_KEY);led_value = ~led_value;key_press = 0;//清除之前的中断状态寄存器(int_state)XGpioPs_WritePin(&Gpio,MIO_0_LED, led_value);//延时消抖usleep(10000);XGpioPs_IntrEnablePin(&Gpio, MIO_12_KEY);//打开MIO的中断使能信号}}return 0;
}void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpioPs *Gpio,u16 GpioIntrId)
{//查找器件配置信息并进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(GicInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);Xil_ExceptionInit();//初始化ARM处理器异常句柄Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,GicInstancePtr);//给IRQ注册异常处理程序Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);//使能处理器的中断XScuGic_Connect(GicInstancePtr, GpioIntrId,(Xil_ExceptionHandler)IntrHandler,(void *)Gpio);//关联中断处理函数,当中断发生时,程序执行第三个输出变量函数XScuGic_Enable(GicInstancePtr, GpioIntrId);//为GPIO器件使能中断XGpioPs_SetIntrTypePin(Gpio, MIO_12_KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);//设置指定引脚的中断触发类型XGpioPs_IntrEnablePin(Gpio, MIO_12_KEY);//打开MIO的中断使能信号
}void IntrHandler(){printf("interrupt detect!\n\r");key_press = 1;XGpioPs_IntrDisablePin(&Gpio, MIO_12_KEY);//关闭中断
}
PL端GPIO触发
/** GPIO中断实验* */
#include <stdio.h>
#include "xil_printf.h"
#include "xgpiops.h"
#include "xparameters.h"
#include "sleep.h"
#include "xscugic.h"#define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID //GPIO设备ID
#define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID //中断ID#define GPIO_INTR_ID XPAR_XGPIOPS_0_INTR //GPIO的中断序列号#define SW_BANK_ID XGPIOPS_BANK2//EMIO的引脚号
#define SW0 54 //EMIO的54引脚
#define LED0 55 //EMIO的55引脚
#define LED1 56 //EMIO的56引脚static XGpioPs GpioPs; //GPIO实例
static XGpioPs_Config* GpioCfgPtr; //GPIO初始化指针
static XScuGic GicPs; //中断控制器实例
static XScuGic_Config* GicPsPtr; //中断控制器指针int initGpio();
int setup_Interrupt();
void intrHandler(void * CallBackRef,u32 Bank,u32 status);
void breath_led();int main(){initGpio();print("GPIO 初始化成功!\n");setup_Interrupt();print("GPIO interrupt 初始化成功!\n");while(1){}return 0;
}int initGpio(){int status;GpioCfgPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);status = XGpioPs_CfgInitialize(&GpioPs,GpioCfgPtr,GpioCfgPtr->BaseAddr);if(status != XST_SUCCESS){return status;}XGpioPs_SetDirectionPin(&GpioPs,LED0,0x01);XGpioPs_SetDirectionPin(&GpioPs,LED1,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,LED0,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,LED1,0x01);XGpioPs_SetDirectionPin(&GpioPs,SW0,0x00);XGpioPs_SetOutputEnablePin(&GpioPs,SW0,0x00);return XST_SUCCESS;
}int setup_Interrupt(){int status;
//1.初始化异常处理函数Xil_ExceptionInit();
//2.初始化中断设备控制器GicPsPtr = XScuGic_LookupConfig(INTC_DEVICE_ID);status = XScuGic_CfgInitialize(&GicPs,GicPsPtr,GicPsPtr->CpuBaseAddress);if(status != XST_SUCCESS){return status;}
//3.注册异常处理函数(中断异常ID,异常处理函数,向异常处理函数里面传入的参数)Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&GicPs);
//4.连接中断处理函数(中断控制器的实例,GPIO的中断ID,中断处理函数,一般是被连接设备的指针)status = XScuGic_Connect(&GicPs,GPIO_INTR_ID,(Xil_InterruptHandler)XGpioPs_IntrHandler,&GpioPs);if(status != XST_SUCCESS){return status;}
/*5.设置中断类型(驱动实例,GPIO所在的bankID,32位的掩码对应bank的32个引脚(0电平敏感1边沿敏感),* 如果设置为电平有效则该次出设置高电平还是低电平有效),如果设置为边沿触发则此处设置是单边沿还是双边沿*/XGpioPs_SetIntrType(&GpioPs,SW_BANK_ID,0xffffffff,0x00,XGPIOPS_IRQ_TYPE_EDGE_RISING);
//6.设置GPIO回调函数,产生中断时进入此函数XGpioPs_SetCallbackHandler(&GpioPs,(void *) &GpioPs,intrHandler);
//7.使能对应PIN的中断XGpioPs_IntrEnable(&GpioPs,SW_BANK_ID,1<<(SW0-54));
//8.使能中断控制器中GPIO的中断XScuGic_Enable(&GicPs,GPIO_INTR_ID);
//9.使能异常处理Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);return XST_SUCCESS;
}void intrHandler(void * CallBackRef,u32 Bank,u32 status){XGpioPs * GpioPtr;GpioPtr = (XGpioPs *)CallBackRef;u32 intrstatus;//判断中断是否由指定引脚产生,是则继续中断处理函数intrstatus = XGpioPs_IntrGetStatusPin(GpioPtr,SW0);if(intrstatus == 1){//清除中断标志,关闭中断引脚防止二次进入中断XGpioPs_IntrClearPin(GpioPtr,SW0);XGpioPs_IntrDisablePin(GpioPtr,SW0);u32 readSW;//按键消抖int cnt;while(cnt <100){readSW = XGpioPs_ReadPin(GpioPtr,SW0);if(readSW == 1){cnt ++;}else{cnt = 0;}usleep(1000);}readSW = XGpioPs_ReadPin(GpioPtr,SW0);printf("readSW = %d\n",(int)readSW);if(readSW == 0){XGpioPs_WritePin(GpioPtr,LED1,0x01);}}//打开中断使能XGpioPs_IntrEnablePin(GpioPtr,SW0);
}void breath_led(){initGpio();int i,j;int led = 1;while(1){for(i=0;i<1000;i++){for(i=0;i<1000;i++){usleep(1);if(j<i){XGpioPs_WritePin(&GpioPs,LED0,led);}else{XGpioPs_WritePin(&GpioPs,LED0,~led);}}}}
}
PL端EMIO中断以及串口中断
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "AXI_reglist.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xuartps.h"
#include "sleep.h"#define GPIO_DEV_ID XPAR_PS7_GPIO_0_DEVICE_ID
#define GPIO_INTERRUPT_ID XPS_GPIO_INT_ID //来自FPGA的EMIO中断
#define GIC_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
#define UART1_DEV_ID XPAR_PS7_UART_1_DEVICE_ID
#define UART1INTR XPAR_PS7_UART_1_INTR#define EMIO_CYCLE_CNT_VALID 54 //接收FPGA端的周期计数有效信号引脚 高电平有效
#define EMIO_DELAY_CTRL 55 //发送FPGA端的延时控制字有效信号
#define EMIO_DIV_CNT_VALID 56 //发送给FPGA的分频有效信号 高电平有效
#define EMIO_BANK_ID 2 //EMIO的bank id
#define UART_SEND_DELAY 4 //串口发送间隔
#define DELAY_CTRL 0 //延时控制字static XGpioPs GpioPs;
static XGpioPs_Config * GpioCnfPtr;
static XScuGic ScuGic;
static XScuGic_Config * ScuGicCfgPtr;
static XUartPs Uart1;
static XUartPs_Config * Uart1CfgPtr;void initGpio(); //初始化并设置管脚的输入输出
void uart1Iint(); //初始化uart1
void initSwIntr(); //设置中断并关联中断函数void uart1Handler(void *CallBackRef); //串口接收中断
void f2pIntr0Handler(void * CallBackRef); //FPGA端的EMIO中断
u32 uart_send_cnt = 0 ;
u32 delay_ctrl = 0 ;
int main()
{//配置延时控制字的初始值uart_send_cnt = 0;WriteDivCnt(10000);//GPIO初始化initGpio();WriteDelayCtrl(DELAY_CTRL);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,0);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,1);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,0);//串口外设初始化uart1Iint();XGpioPs_WritePin(&GpioPs,EMIO_DIV_CNT_VALID,0);XGpioPs_WritePin(&GpioPs,EMIO_DIV_CNT_VALID,1);XGpioPs_WritePin(&GpioPs,EMIO_DIV_CNT_VALID,0);sleep(1);//中断初始化initSwIntr();while(1){}return 0;
}//initial gpio func
void initGpio(){GpioCnfPtr = XGpioPs_LookupConfig(GPIO_DEV_ID);XGpioPs_CfgInitialize(&GpioPs,GpioCnfPtr,GpioCnfPtr->BaseAddr);//设置两个管脚的输入输出模式 0输入 1输出XGpioPs_SetDirectionPin(&GpioPs,EMIO_CYCLE_CNT_VALID,0x00);XGpioPs_SetDirectionPin(&GpioPs,EMIO_DELAY_CTRL,0x01);XGpioPs_SetDirectionPin(&GpioPs,EMIO_DIV_CNT_VALID,0x01);//设置管脚的输入输出使能XGpioPs_SetOutputEnablePin(&GpioPs,EMIO_DIV_CNT_VALID,0x01);XGpioPs_SetOutputEnablePin(&GpioPs,EMIO_DELAY_CTRL,0x01);
}void uart1Iint(){u32 intrMask=0;Uart1CfgPtr = XUartPs_LookupConfig(UART1_DEV_ID);XUartPs_CfgInitialize(&Uart1,Uart1CfgPtr,Uart1CfgPtr->BaseAddress);//设置uart工作模式XUartPs_SetBaudRate(&Uart1,115200);//设置接收FIFO的触发阈值XUartPs_SetFifoThreshold(&Uart1, 2);XUartPs_SetOperMode(&Uart1,XUARTPS_OPER_MODE_NORMAL);intrMask =XUARTPS_IXR_RXOVR;XUartPs_SetInterruptMask(&Uart1,intrMask);
}//uart recv interrupt
void uart1Handler(void *CallBackRef){XUartPs *uart_instance_ptr = (XUartPs *) CallBackRef;u32 rec_data_L = 0 ;u32 rec_data_H = 0 ;u32 rec_data = 0;u32 isr_status ; //中断状态标志//读取中断ID寄存器,判断触发的是哪种中断isr_status = XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,XUARTPS_IMR_OFFSET);isr_status &= XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,XUARTPS_ISR_OFFSET);//判断中断标志位RxFIFO是否触发if (isr_status & (u32)XUARTPS_IXR_RXOVR){rec_data_L = XUartPs_RecvByte(XPAR_PS7_UART_1_BASEADDR);rec_data_H = XUartPs_RecvByte(XPAR_PS7_UART_1_BASEADDR);rec_data = rec_data_L | (rec_data_H<<8);WriteDelayCtrl(rec_data);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,0);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,1);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,0);//清除中断标志XUartPs_WriteReg(uart_instance_ptr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR) ;}
}//initial software interrept
void initSwIntr(){Xil_ExceptionInit();ScuGicCfgPtr = XScuGic_LookupConfig(GIC_ID);XScuGic_CfgInitialize(&ScuGic,ScuGicCfgPtr,ScuGicCfgPtr->CpuBaseAddress);Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);//connect uart1 interruptXScuGic_Connect(&ScuGic,UART1INTR,(Xil_ExceptionHandler)uart1Handler,&Uart1);XScuGic_SetPriorityTriggerType(&ScuGic , UART1INTR , 0xA0 ,0x01);XScuGic_Enable(&ScuGic,UART1INTR);//connect fpga interruptXScuGic_Connect(&ScuGic,GPIO_INTERRUPT_ID,(Xil_ExceptionHandler)f2pIntr0Handler,&GpioPs);XGpioPs_SetIntrType(&GpioPs,XGPIOPS_BANK2,1<<(EMIO_CYCLE_CNT_VALID-54),1<<(EMIO_CYCLE_CNT_VALID-54),0);//打开中断使能,对IO管脚配置XGpioPs_IntrEnablePin(&GpioPs, EMIO_CYCLE_CNT_VALID);XScuGic_Enable(&ScuGic,GPIO_INTERRUPT_ID);XScuGic_SetPriorityTriggerType(&ScuGic , GPIO_INTERRUPT_ID , 0xB0 ,0x01);Xil_ExceptionEnable();
}void f2pIntr0Handler(void * CallBackRef){XGpioPs *GpioPtr;GpioPtr = (XGpioPs *)CallBackRef;u32 intrstatus;u32 cyclecnt = 0;intrstatus = XGpioPs_IntrGetStatusPin(GpioPtr,EMIO_CYCLE_CNT_VALID);if(intrstatus == 1){if(delay_ctrl < 1024){if(uart_send_cnt == UART_SEND_DELAY){uart_send_cnt = 0;}if(uart_send_cnt == 0){cyclecnt = ReadCycleCnt();//高位在前,低位在后XUartPs_SendByte(XPAR_PS7_UART_1_BASEADDR,(cyclecnt >>24)& 0xff);XUartPs_SendByte(XPAR_PS7_UART_1_BASEADDR,(cyclecnt >>16)& 0xff);XUartPs_SendByte(XPAR_PS7_UART_1_BASEADDR,(cyclecnt >> 8)& 0xff);XUartPs_SendByte(XPAR_PS7_UART_1_BASEADDR,(cyclecnt >> 0)& 0xff);WriteDelayCtrl(delay_ctrl);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,0);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,1);XGpioPs_WritePin(&GpioPs,EMIO_DELAY_CTRL,0);}if(uart_send_cnt == 1){delay_ctrl = delay_ctrl + 1;}uart_send_cnt = uart_send_cnt + 1;}XGpioPs_IntrEnablePin(GpioPtr,EMIO_CYCLE_CNT_VALID);}
}
相关文章:
ZYNQ中断例程
GPIO 中断系统初始化流程: 第一步:初始化 cpu 的异常处理功能 第二步:初始化中断控制器 第三步:向 CPU 注册异常处理回调函数; 第四步:将中断控制器中的对应中断 ID 的中断与中断控制器相连接 第五步:设置 …...

常用linux命令 linux_cmd_sheet
查看文件大小 ls -al 显示每个文件的kb大小 查看系统日志 dmesg -T | tail 在 top 命令中,RES 和 VIRT(或者 total-vm)是用来表示进程内存使用的两个不同指标,它们之间有以下区别: RES(Resident Set Size…...

【proteus】8086 写一个汇编程序并调试
参考书籍:微机原理与接口技术——基于8086和Proteus仿真(第3版)p103-105,p119-122. 参考程序是p70,例4-1 在上一篇的基础上: 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图: …...
大数据之LibrA数据库常见术语(四)
Failover 指当某个节点出现故障时,自动切换到备节点上的过程。反之,从备节点上切换回来的过程称为Failback。 Freeze 在事务ID耗尽时由AutoVacuum Worker进程自动执行的操作。FusionInsight LibrA会把事务ID记在行头,在一个事务取得一行时&…...
Docker基础知识
文章目录 Docker Docker 一次构建,处处运行,类似于JVM 虚拟机是软件硬件(需要Hypervisors实现硬件资源虚拟化): 资源占用大启动慢(虚拟机是分钟级,Docker是秒级)冗余步骤多 sha2…...
swoole 是什么?
Swoole是一个为PHP用C和C编写的基于事件的高性能异步& 协程并行网络通信引擎; 使 PHP 开发人员可以编写高性能的协程 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IO…...
我想要一个勋章
目录 一、背景二、过程三、总结 一、背景 十年前结缘,也许是冥冥中自有天注定,注定要给自己多加一个今天的节日。 二、过程 一个勋章,一个有意义的标志。 一个勋章,一个时间轮上的帧。 一个勋章,一个二进制的节点。…...

微信小程序设计之主体文件app-json-pages
一、新建一个项目 首先,下载微信小程序开发工具,具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后,注册小程序账号,具体注册方法,可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…...

C语言-面试题实现有序序列合并
要求: a.输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 数据范围: 1≤n,m≤1000 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000 输入描述: 1.输入包含三行, 2.第一行包含两个正整数n, m&am…...

Android12 启动页适配
印象中,在2022年末接到了一个针对Android12启动页适配的需求,当时也使用了一些适配方案,也写了一个Demo,但是最终没有付诸适配行动;当然并不是适配失败,而是根据官方适配方案适配后太丑了… 1024纪念文章&a…...

【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目
文章目录 前言一、雪崩问题及其解决方案1.1 什么是雪崩问题1.2 雪崩问题的原因1.3 解决雪崩问题的方法1.4 总结 二、初识 Sentinel 框架2.1 什么是 Sentinel2.2 Sentinel 和 Hystrix 的对比 三、Sentinel 的安装部署四、集成 Sentinel 到微服务 前言 微服务架构在现代软件开发…...
20231023 比赛总结
比赛链接 反思 A 花了很长时间,幸亏没怎么调就对了,以后还是应该先看其他题的 括号匹配题的套路感觉没有掌握透,感觉无非就是单调栈,哈希,折线图 B 感觉比 T 1 T1 T1 简单 C 正解还是很妙的,但 68…...

Vite创建vue3+ts+pinia+vant项目起步流程
pnpm介绍&安装 本质上他是一个包管理工具,和npm/yarn没有区别,主要优势在于 包安装速度极快磁盘空间利用效率高 安装: npm i pnpm -g使用: npm命令pnpm等效npm installpnpm installnpm i axiospnpm add axiosnpm i webpa…...

JVM 类的加载子系统
文章目录 类的加载过程加载阶段链接阶段初始化 类的加载器测试代码中获取对应的加载器获取加载器加载的路径不同类对应的加载器自定义加载器自定义加载器的方式 获取类的加载器的方式双亲委派机制双亲委派机制的好处 Java 的 SPI 机制1. 接口定义2. 具体实现3. 配置 META-INF/s…...
什么是1024程序员节
一年一度专属于程序员的节日“1024程序员节”要到来了,相信有很多的小伙伴跟我一样,对这个节日非常的熟悉,但也有一下小伙伴对这个节日非常陌生,没事,下面由我来讲解一下1024程序员节。 目录 节日背景 节日由来 社…...

spark获取hadoop服务token
spark 作业一直卡在accepted 问题现象问题排查1.查看yarn app日志2.问题分析与原因 问题现象 通过yarn-cluster模式提交spark作业,客户端日志一直卡在submit app,没有运行 问题排查 1.查看yarn app日志 appid已生成,通过yarn查看app状态为…...

Simulink 最基础教程(一)
1.1基本概念 一个典型的Simulink模型大致如上图这样: 1)模块 block:图中画圈的那些,每个模块可以完成一些特定的任务,类似MATLAB中函数的概念。软件提供了很多模块,当然也可以自定义新的模块 2࿰…...
微信小程序:单行输入和多行输入组件
微信小程序提供了两种输入类型的输入框组件,分别是单行输入框 <input> 和多行输入框 <textarea>。 1. 单行输入组件(input) 单行输入框 <input> <input> 是一个用于收集用户输入的组件,主要用于收集单行…...
1024程序员
听说今天可以拿勋章,嘿嘿...
【Segment Anything Model】八:修改SAM源码做分类任务
🍉 博主微信 cvxiayixiao 🍓 【Segment Anything Model】计算机视觉检测分割任务专栏。 链接 🍑 【公开数据集预处理】特别是医疗公开数据集的接受和预处理,提供代码讲解。链接 🍈 【opencv+图像处理】opencv代码库讲解,结合图像处理知识,不仅仅是调库。链接 文章目…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...