lv14 中断处理原理:接口及按键驱动 14

时间:2024-02-11 23:03:28 标签:  按键  

一、什么是中断

一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件

分为:

  1. 内部中断 CPU执行程序的过程中,发生的一些硬件出错、运算出错事件(如分母为0、溢出等等),不可屏蔽

  2. 外部中断 外设发生某种情况,通过一个引脚的高、低电平变化来通知CPU (如外设产生了数据、某种处理完毕等等)

二、中断处理原理

任何一种中断产生,CPU都会暂停当前执行的程序,跳转到内存固定位置执行一段程序,该程序被称为总的中断服务程序,在该程序中区分中断源,然后进一步调用该中断源对应的处理函数。

中断源对应的处理函数被称为分中断处理程序,一般每一个分中断处理程序对应一个外设产生的中断

写驱动时,如果外设有中断,则需要编写一个函数(分中断处理程序)来处理这种中断

三、中断接口

3.1 中断申请

一般再init中申请 

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
/*
参数:irq:所申请的中断号handler:该中断号对应的中断处理函数flags:中断触发方式或处理方式 触发方式:IRQF_TRIGGER_NONE   //无触发IRQF_TRIGGER_RISING  //上升沿触发IRQF_TRIGGER_FALLING //下降沿触发IRQF_TRIGGER_HIGH  //高电平触发IRQF_TRIGGER_LOW    //低电平触发处理方式:IRQF_DISABLED    //用于快速中断,处理中屏蔽所有中断IRQF_SHARED    //共享中断name:中断名 /proc/interruptsdev:传递给中断例程的参数,共享中断时用于区分那个设备,一般为对应设备的结构体地址,无共享中断时写NULL
返回值:成功:0 失败:错误码
*/

3.2 中断释放

一般再exit中释放 

void free_irq(unsigned int irq, void *dev_id);
/*
功能:释放中断号
参数:irq:设备号dev_id:共享中断时用于区分那个设备一般强转成设备号,无共享中断时写NULL
*/

3.3 中断处理函数原型

typedef irqreturn_t (*irq_handler_t)(int, void *);
/*
参数:int:中断号void*:对应的申请中断时的dev_id
返回值:typedef enum irqreturn irqreturn_t; //中断返回值类型enum irqreturn {IRQ_NONE  = (0 << 0),  //什么都没处理IRQ_HANDLED = (1 << 0),  //处理正常IRQ_WAKE_THREAD = (1 << 1),};返回IRQ_HANDLED表示处理完了,返回IRQ_NONE在共享中断表示不处理
*/

四、按键驱动

重点:区分3种中断编号的含义,以区分中断申请中编号

  • 专用中断线
  • gpio复用的中断线,所有复用的有个编号(外部中断号,查芯片手册可知)
  • GIC内部组内有个编号
  • 内部中断、外部中断又有个统一的编号

我们通过外部中断号,找到分组编号,再申请对应的内核对应的中断号

内核软件又有个统一的编号,与上面都不一样,int irq

按键原理图:

总的编号 ID

外部编号 Interrupt Source

组内编号SPI Port No(一个分配器可以将其路由到任意组合的处理器的外围中断)

 

gpx1节点的定义在/linux-3.14/arch/arm/boot/dts/exynos4x12-pinctrl.dtsi

我们通过找到外部中断引脚gpx1,对应芯片手册找到外部编号EINT[9],找到组内编号25

exynos4412-fs4412.dts中增加节点mykey2_node {compatible = "mykey2,key2";key2-gpio = <&gpx1 1 0>; // 0代表工作模式高电平有效interrupt-parent = <&gpx1>;interrupts = <1 3>; //1代表图中<0 25 0> 3代表11,上升沿和下降沿都触发
};

设计思路

struct keyvalue
{int code;  //which KEYint status; //按下或抬起
};struct fs4412key2_dev
{struct cdev mydev;int gpio;  int irqno; struct keyvalue data;  int newflag;    //1 代表又新按键产生,0代表没有产生spinlock_t lock;  //对data 和flag两个共享资源加锁控制,因为即会在异常上下文中使用,也会在任务上下文中使用wait_queue_head_t rq; //为了实现读时候的阻塞
};

五、按键实现

修改设备树

 定义

fs4412_key.h

#ifndef FS4412_KEY_H
#define FS4412_KEY_Henum KEYCODE
{KEY2 = 1002,KEY3,KEY4,
};enum KEY_STATUS
{KEY_DOWN = 0,KEY_UP,
};struct keyvalue
{unsigned int code;  //which keyunsigned int status; //1 0
};#endif

创建

fs4412_key2.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/cdev.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/poll.h>
#include <linux/mm.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <asm/uaccess.h>#include "fs4412_key.h"int major = 11;
int minor = 0;
int fs4412key2_num = 1;struct fs4412key2_dev
{struct cdev mydev;unsigned int gpio;unsigned int irqno;struct keyvalue data;unsigned int newflag;spinlock_t lock;wait_queue_head_t rq;
};struct fs4412key2_dev * pgmydev = NULL;int fs4412key2_open(struct inode *pnode,struct file *pfile)
{pfile->private_data =(void *) (container_of(pnode->i_cdev,struct fs4412key2_dev,mydev));//暂不处理重复设备打开的情况return 0;
}ssize_t fs4412key2_read(struct file *pfile,char __user *puser,size_t count,loff_t *p_pos)
{struct fs4412key2_dev *pmydev = (struct fs4412key2_dev *)pfile->private_data;int size = 0;int ret = 0;if(count < sizeof(struct keyvalue)){printk("expect read size is invalid\n");return -1;}spin_lock(&pmydev->lock);if(!pmydev->newflag){if(pfile->f_flags & O_NONBLOCK){//非阻塞spin_unlock(&pmydev->lock);printk("O_NONBLOCK No Data Read\n");return -1;}else{//阻塞spin_unlock(&pmydev->lock);ret = wait_event_interruptible(pmydev->rq,pmydev->newflag == 1);if(ret){printk("Wake up by signal\n");return -ERESTARTSYS;}spin_lock(&pmydev->lock);}}if(count > sizeof(struct keyvalue)){size = sizeof(struct keyvalue);}else{size = count;}ret = copy_to_user(puser,&pmydev->data,size);if(ret){spin_unlock(&pmydev->lock);printk("copy_to_user failed\n");return -1;}pmydev->newflag = 0;spin_unlock(&pmydev->lock);return size;
}unsigned int fs4412key2_poll(struct file *pfile,poll_table *ptb)
{struct fs4412key2_dev *pmydev = (struct fs4412key2_dev *)pfile->private_data;unsigned int mask = 0;poll_wait(pfile,&pmydev->rq,ptb);spin_lock(&pmydev->lock);if(pmydev->newflag){mask |= POLLIN | POLLRDNORM;}spin_unlock(&pmydev->lock);return mask;
}int fs4412key2_close(struct inode *pnode,struct file *pfile)
{struct fs4412key2_dev *pmydev = (struct fs4412key2_dev *)pfile->private_data;spin_lock(&pmydev->lock);pmydev->newflag = 0;spin_unlock(&pmydev->lock);return 0;
}irqreturn_t key2_irq_handle(int no,void *arg)
{struct fs4412key2_dev *pmydev = (struct fs4412key2_dev *)arg;int status = 0;status = gpio_get_value(pmydev->gpio);mdelay(1); //消抖if(status != gpio_get_value(pmydev->gpio)){return IRQ_NONE;}spin_lock(&pmydev->lock);if(status == pmydev->data.status){spin_unlock(&pmydev->lock);return IRQ_NONE;}pmydev->data.code = KEY2;pmydev->data.status = status;pmydev->newflag = 1;spin_unlock(&pmydev->lock);wake_up(&pmydev->rq);return IRQ_HANDLED;
}struct file_operations myops = {.owner = THIS_MODULE,.open = fs4412key2_open,.release = fs4412key2_close,.read = fs4412key2_read,.poll = fs4412key2_poll,
};int __init fs4412key2_init(void)
{int ret = 0;dev_t devno = MKDEV(major,minor);struct device_node *pnode = NULL;pnode = of_find_node_by_path("/fs4412-key2");if(NULL == pnode){printk("find node failed\n");return -1;}pgmydev = (struct fs4412key2_dev *)kmalloc(sizeof(struct fs4412key2_dev),GFP_KERNEL);if(NULL == pgmydev){printk("kmallc for struct fs4412key2_dev failed\n");return -1;}pgmydev->gpio = of_get_named_gpio(pnode,"key2-gpio",0);pgmydev->irqno = irq_of_parse_and_map(pnode,0);/*申请设备号*/ret = register_chrdev_region(devno,fs4412key2_num,"fs4412key2");if(ret){ret = alloc_chrdev_region(&devno,minor,fs4412key2_num,"fs4412key2");if(ret){kfree(pgmydev);pgmydev = NULL;printk("get devno failed\n");return -1;}major = MAJOR(devno);//容易遗漏,注意}/*给struct cdev对象指定操作函数集*/	cdev_init(&pgmydev->mydev,&myops);/*将struct cdev对象添加到内核对应的数据结构里*/pgmydev->mydev.owner = THIS_MODULE;cdev_add(&pgmydev->mydev,devno,fs4412key2_num);init_waitqueue_head(&pgmydev->rq);spin_lock_init(&pgmydev->lock);ret = request_irq(pgmydev->irqno,key2_irq_handle,IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,"fs4412key2",pgmydev);if(ret){printk("request_irq failed\n");cdev_del(&pgmydev->mydev);kfree(pgmydev);pgmydev = NULL;unregister_chrdev_region(devno,fs4412key2_num);return -1;}return 0;
}void __exit fs4412key2_exit(void)
{dev_t devno = MKDEV(major,minor);free_irq(pgmydev->irqno,pgmydev);cdev_del(&pgmydev->mydev);unregister_chrdev_region(devno,fs4412key2_num);kfree(pgmydev);pgmydev = NULL;
}MODULE_LICENSE("GPL");module_init(fs4412key2_init);
module_exit(fs4412key2_exit);

修改Makefile

ifeq ($(KERNELRELEASE),)ifeq ($(ARCH),arm)
KERNELDIR ?= /home/linux/Linux_4412/kernel/linux-3.14
ROOTFS ?= /opt/4412/rootfs
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules INSTALL_MOD_PATH=$(ROOTFS) modules_installclean:rm -rf *.o *.ko .*.cmd *.mod.* modules.order Module.symvers  .tmp_versionselseCONFIG_MODULE_SIG=n
obj-m += mychar.o
obj-m += mychar_poll.o
obj-m += openonce_atomic.o
obj-m += openonce_spinlock.o
obj-m += mychar_sema.o
obj-m += mychar_mutex.o
obj-m += second.o
obj-m += leddrv.o
obj-m += leddrv_dt.o
obj-m += fs4412_key2.oendif

测试应用程序编写

testkey2_app.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>#include <stdio.h>#include "fs4412_key.h"int main(int argc,char *argv[])
{int fd = -1;struct keyvalue keydata = {0};int ret = 0;if(argc < 2){printf("The argument is too few\n");return 1;}fd = open(argv[1],O_RDONLY);if(fd < 0){printf("open %s failed\n",argv[1]);return 3;}while((ret = read(fd,&keydata,sizeof(keydata))) == sizeof(keydata)){if(keydata.status == KEY_DOWN){printf("Key2 is down!\n");}else{printf("Key2 is up!\n");}}close(fd);fd = -1;return 0;
}

 编译拷贝到rootfs

 

插入内核模块,添加按键设备测试

 

来源:分享自作者个人站点/博客

智能推荐

一、什么是中断 一种硬件上的通知机制&#xff0c;用来通知CPU发生了某种需要立即处理的事件 分为&#xff1a; 内部中断 CPU执行程序的过程中&#xff0c;发生的一些硬件出错、运算出错事件&#xff08;如分母为0、溢出等等&#xff09;&#xff0c;不可屏蔽 外部中断 外设发生某种情况&#xff0c;通过一个引脚的高、低电平变化来通知CPU &#xff08;如外设产生了数据、某种处理完毕等等&#xff09; 二、中断处理原理 任何一种中断产生&#xff0c;CPU都会暂停当前执行的程序&#xff0c;跳转到内存

标签:按键  

在基于STM32的CAN接口中&#xff0c;中断处理是一个非常重要的部分&#xff0c;它可以帮助我们实时地处理接收到的数据和处理其他CAN事件。为了优化CAN接口的性能&#xff0c;以下是一些中断处理和性能优化的技巧&#xff1a; ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注我的知乎&#xff1a;对error视而不见 代码获取、问题探讨及文章转载可私信。  ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff

标签:接口  

 按键分区处理函数&#xff08;KeyedProcessFunction&#xff09;&#xff1a;先进行分区&#xff0c;然后定义处理操作 1.定时器&#xff08;Timer&#xff09;和定时服务&#xff08;TimerService&#xff09; 定时器&#xff08;timers&#xff09;是处理函数中进行时间相关操作的主要机制定时服务&#xff08;TimerService&#xff09;提供了注册定时器的功能 TimerService

标签:函数  

接口测试定义接口是前后端沟通的桥梁,是数据传输的通道,包括外部接口、内部接口。内部接口又包括:上层服务与下层服务接口,同级接口生活中常见接口:电脑上的键盘、USB接口,电梯按钮,KFC下单接口测试:是对系统或组件之间的接口进行测试,主要校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系接口自动化测试:让程序代替人为对接口项目进行自动化验证测试的过程接口测试意义接口测试使测试更早投入这句话变成现实接口测试可以测试一些界面测试非常难以实现或无法测试的范围从对项目的影响,接口测试直接测试后端服务,更加接近服务器上运行代码,也更能发现

标签:详解  接口  原理  测试  Postman  

前言 实际工作当中,涉及到接口加密时,每一个公司加密方式都是不一样的。 &nbsp;1. 遇到接口加密的解决方法: ① 如果是一些常用的加密,可以通过 (第三方)工具或者代码去解决。 ② 如果是开发自己封装的加密方法,核心逻辑外人是无法知道的,最好的方式让开发去协助你。提供接口去进行调用,然后进行加密/解密的操作 ③ 如果开发不肯提供接口,那么让开发协助你,把一些固定的数据给你手动进行加密一下。 ④ 如果你能够去解决核心代码,那自己用代码去进行实

标签:接口  

嵌入式设备中的按键处理按键按钮就是一种配备了弹性装置的双状态开关: 连通和断开. 由于弹性部件的作用, 大部分时间按钮是断开的. 从电路角度看, 按钮扮演的角色就是开路和短路. 按钮在嵌入式设备中是常见组件, 通常情况下, 一个按钮需要有一个弱上拉或下拉电阻, 对于STM32而言, GPIO口已经自带了弱上拉电阻, 可以在程序中设置是否使用, STC系列的MCU, 要看具体型号和具体的IO口, 例如经典的stc89c51/stc89c52, P0口就是漏极开路的双向IO口, 使用时当电流流出需外接上拉电阻.将按钮连接到MCU通常有两种方式, 一种是低电平有效, 另一种是高电平有效, 在低电平有效的电路中, 当按钮按下时

标签:按键  嵌入式  消息  硬件  设备  

​中断嵌套是指中断系统正在执行一个中断服务时&#xff0c;有另一个优先级更高的中断提出中断请求&#xff0c;这时会暂时终止当前正在执行的级别较低的中断源的服务程序&#xff0c;去处理级别更高的中断源&#xff0c;待处理完毕&#xff0c;再返回到被中断了的中断服务程序继续执行的过程。  ​ 中断嵌套可以让单片机能够处理多个优先级不同的事件或情况。当高优先级的中断被触发时&#xff0c;可以立即响应并处理&#xff0c;而不用等待低优先级中断处理完毕。当高优先级中断处理完毕后&#xff0c;再回到低优先级中断处理程序继续执行。 在单片机中&#xff0c;中断嵌套的实现通常需要注意中断优先级的设置和中断使能的控制&#xff0c;以确保高优先级中断能够

标签:嵌套  

本文主要介绍Python tkinter 几种按键事件及其示例。 目录 按键事件 响应所有按键事件

标签:按键  

背景开放 API 接口如果没有经过安全处理,则很容易出现三类安全问题,包括信息截获、篡改与泄露。首先是用户密码容易被截获,比如某家公司在开发开放式 API 时,没有对其进行安全控制,那么该公司的客户信息很容易被黑客截获,黑客在掌握客户的用户名、密码等相关信息与资料后,便能够利用客户的身份来登录,使得客户的隐私信息泄露,黑客便可以轻易地盗刷客户信用卡,使得客户承受损伤;其次是表单数据很容易被篡改,比如某家公司所开发的开放 API 并没有进行过防篡改控制,有客户在购买1000 元产品后,其提交表单被黑客利用技术手段篡改为 10 块钱,从而使得公司产生了经济损失。开放 API 接口安全问题解决方

标签:接口  API  

先贴脚本, 大神请直取新建线程组 → http取样器 → 前置处理器 → bean shell 预处理程序import org.apache.commons.codec.digest.DigestUtils; import java.util.Date;//没有第三方jar包,请放心 import Date date = new Date();//将时间戳截取到秒的量级(长度共10位),大神可以考虑地板除,弟中弟请当没看见String timestamp = String.valueOf(date.g

标签:接口  Jmeter  sign  

深入理解STM32中断及其使用方法&#xff08;基于HAL库&#xff09; STM32微控制器作为一款强大的嵌入式系统芯片&#xff0c;在各种应用中都需要使用中断来实现实时响应和处理各种事件。本文将深入讨论STM32中断的概念、HAL库的中断处理机制以及如

标签:机制  

3.1 Intel 8086微处理器Intel 8086微处理器是由美国Intel公司1978年推出的高性能的16位微处理器,第三代微处理器的典型嗲表,它有20根地址线,直接寻址能力达到1MB,具有16根数据总线,内部总线和ALU均为16位,可进行8位和16位操作。3.2 8086的存储组织寻址空间计算机的寻址空间是由CPU地址总线的位数决定的。当存储器按字节编址时,若地址总线为n位,cpu寻址范围是2`n字节。8086存储器的

标签:微处理器  第三章  接口  原理  计算机  

led驱动代码中无法给其他开发板重用&#xff0c;编程依据不清晰&#xff0c;如下&#xff0c;修改后尽量在代码中不直接修改寄存器。 把编程依据写到设备树中 一、起源 减少垃圾代码 减轻驱动开发工作量 驱动代码和设备信息分离 参考Open Fireware设计 用来记录硬件平台中各种硬件设备的属性信息

标签:版本  

1、中断基础概念 1.1 什么是中断 CPU在正常运行期间&#xff0c;由外部或者内部引起的时间&#xff0c;让CPU停下当前正在运行的程序&#xff0c;转而去执行触发他的中断所对应的程序&#xff0c;这就是中断。 响应中断的过程&#xff1a; <1>中断请求<2>中断响应<3>保护现场<4>中断处理<5>恢复现场<6>中断返回 如果不响应中断&#xff0c;就是中断屏蔽。 1.2 什么是中断上下文&#xff0c;为什么会有中断上下文&#xff1f; 中断的存在可以

标签:linux  

主板介绍:P3^2~P^5为四个按键;P1^0~P1^7为8个LED灯

标签:按键  keil  

ARM有七种模式&#xff0c;我们这里只讨论SVC、IRQ和FIQ模式。  我们可以假设ARM核心有两根中断引脚&#xff08;实际上是看不见的&#xff09;&#xff0c;一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中&#xff0c;有一个I位和一个F位&#xff0c;分别用来禁止IRQ和FIQ。  先不说中断控制器&#xff0c;只说ARM核心。正常情况下&#xff0c;A

标签:嵌套  

1. TriCore与中断的简介&nbsp;TriCore是德国英飞凌科技公司旗下的第一个为实时嵌入式系统而优化的统一的、32位的微控制器-DSP(Digital Signal Processing)处理器架构。TriCore的ISA(Instruction Set Architecture),即指令集体系结构,将微控制器的实时能力、DSP的计算能力以及RISC(Reduced Instruction Set Computing)负载 / 存储体系结构的高性能 / 价格特性,结合在了一个紧凑的可重编程核心中。

标签:处理器  机制  TriCore  

转自:https://blog.csdn.net/zgtzqzg2020/article/details/105703394 1. 中断进入自定义函数&nbsp; 在中断发生后,经历ARM通用的处理阶段,到达irq_handler宏,转入C语言阶段。 //arch/arm/

标签:linux  arm  

两相步进电机驱动 前言什么是步进电机驱动器细分控制电机内部结构图片步进电机驱动原理&#xff08;重要&#xff09;步进电机参数&#xff1

标签:两相  

今天来介绍另一个外设——按键与LED的配合工作&#xff0c;与开关不同&#xff0c;按键需要注意消除抖动带来的影响&#xff0c;代码逻辑也会更复杂一写&#xff0c;下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输入方式&#xff0c;由若干按键按照一定的规则组成&#xff0c;每一个按键实质就是一个按钮开关。而独立式键盘的各键相互独立&#xff0c;每个按键各接一条I/O口线&#xff0c;通过检测I/O输入线的电平状态&#xff0c;很容易地判断哪个按键被按下。

标签:多功能  

JMeter测试导入接口利用Jmeter测试上传文件,首先可根据接口文档或者fiddler抓包分析文件上传的接口;如下图:以下是我通过fiddler所截取的文件上传的接口

标签:接口  测试  Jmeter  Jmeter  

一、断言 添加方式&#xff1a;测试计划-->线程组-->HTTP 请求-->(右键添加)断言 断言成功查看结果树中不显示断言信息&#xff0c;断言失败查看结果树中显示断言信息&#xff0c;断言信息放在http请求下 测试字段&#xff1a;         响应文本和文档&#xff08;文本&#xff09;当返回数据为字符串时&#xff0c;断

标签:断言  

时间概念 中断结构 引脚  TCON

标签:定时器  

 一、关键字驱动KDT(Keyword-driven testing)   1、自动化测试框架发展的第三个阶段是关键字驱动测试框架阶段&#xff0c;它是当前比较流行的一种框架之一&#xff0c;并且现在的自动化测试工具已经将关键字驱动框架融入到工具中。在录制过程中自动化测试工具会将对象及操作属性保存到对象库中。   2、关键字驱动测试是数据驱动测试的一种改进类型&#xff0c; 用关键字的形式将测试逻辑封装在数据文件中&#xff0c;测试工具只要能够解释这些关键字即可对其应用自动化。

标签:测试数据  

文章目录 接口代理框架Proxy体系类结构导出接口

标签:框架  

猜你喜欢

文章目录 接口代理框架Proxy体系类结构导出接口 webrtc的实际运用PeerConne

标签:框架  

日志分段切分条件日志分段文件切分包含以下4个条件,满足其一即可:当前日志分段文件的大小超过了broker端参数 log.segment.bytes 配置的值。log.segment.bytes参数的默认值为 1073741824,即1GB当前日志分段中消息的最小时间戳与当前系统的时间戳的差值大于log.roll.ms或log.roll.hours参数配置的值。如果同时配置了log.roll.ms和log.roll.hours

标签:原理  关键  kafka  

文章目录 总览中断的作用中断类型内中断的例子外中断中断的分类中断机制的基本原理小结

标签:异常  

 目录 1、前言 2、实现方式 2.1、循环重试 2.2、递归重试

标签:重试  

&nbsp;在Web开发中,跨域请求是一个常见的问题。由于浏览器的安全策略限制,JavaScript在发送HTTP请求时只能访问同源下的资源,即协议、域名、端口号都必须一致。然而,有时我们需要从不同域名下获取数据,这就涉及到了跨域请求的问题。为了解决这个问题,我们可以使用API接口来处理跨域请求。API(Application Programmi

标签:接口  数据  API  

multipart/form-data 类型的上传接口我们在做接口测试工作时,会遇到含有文件上传的接口。抓到的上传接口的信息大概是以下这样子:请求体的 content-type 为:multipart/form-data; boundary=---------------------------(一堆数字)&nbsp;

标签:接口  类型  上传  requests  multipartform  

面向接口编程原理“基于接口而非实现编程”这条原则的英文描述是:“Program to an interface, not an implementation”。我们理解这条原则的时候,千万不要一开始就与具体的编程语言挂钩,局限在编程语言的“接口”语法中(比如 Java 中的 interface 接口语法)。这条原则最早出现于 1994 年 GoF 的《设计模式》这本书,它先于很多编程语言而诞生(比如 Java 语言),是一条比较抽象、泛化的设计思想。这条原则能非常有效地提高代码质量,之所以这么说,那是因为,应用这条原则,可以::将接口和实现相分离

标签:接口  原理  

1. 串口接收原理 基本原理&#xff1a;通过数据起始位判断要是否要开始接收的数据&#xff0c;通过采样的方式确定每一位数据是0还是1。 如何判

标签:串口  

异常处理简介在ARM汇编开发中,异常处理和中断是常见的概念,它们是对系统运行过程中出现的特殊情况进行处理的一种机制。异常处理和中断包括硬件异常、软件异常和外部中断等。当处理器遇到这些特殊情况时,它会自动执行相应的处理程序。异常和中断的分类复位(Reset):当处理器上电或复位时,处理器会执行复位操作,跳转到指定的复位向量地址,并运行相应的处理程序。未定义指令(Undefined Instruction):当处理器执行一条未定义的指令时,处理器会触发未定义指

标签:异常  概念  进阶篇  arm  

打算整理汇编语言与接口微机这方面的学习记录。本部分介绍常用芯片接口技术、中断系统与可编程中断控制器8259A。参考资料西电《微机原理与系统设计》周佳社西交《微机原理与接口技术》课本《汇编语言与接口技术》王让定小甲鱼《汇编语言》Part1 常用芯片的接口技术1. I/O接口的概念由于设备种类繁多,通信的信息格式多样,所以CPU与设备之间不能直接通信,必须在两者之

标签:可编程  系统  微机  控制器  芯片  

一、字符设备驱动框架解析 设备的操作函数如果比喻是桩的话&#xff08;性质类似于设备操作函数的函数&#xff0c;在一些场合被称为桩函数&#xff09;&#xff0c;则&#xff1a; 驱动实现设备操作函数 ----------- 做桩 insmod调用的init函数主要作用 --------- 钉桩 rmmod调用的exitt函数主要作用 --------- 拔桩 应用层通过系统调用函数间接调用这些设备操作函数 ------- 用桩 1.1 两个操作函数中常用的结构体说明 内核中记录文件元信息的结构体

标签:字符  

窗口处理函数包括&#xff1a;ProcessWindowFunction 和 ProcessAllWindowFunction 基础用法 stream.keyBy( t -> t.f0 ).window( TumblingEventTimeWindows.of(Time.seconds(10)) ).process(new MyProcessWindowFunction()) 这里的MyProcessWindowFunction

标签:函数  

extcon,是External Connector的简称,用于抽象外部连接器,比如说Audio Jack、USB MicroB/TypeC接口等。它的原型是Android的switch-class驱动,经过修改后在kernel 3.4.0版本时被引入内核中。

标签:extcon  USB  

iOS 14 UDP收不到广播处理1. 简单说明项目使用到了CocoaAsyncSocket,建立TCP之前,使用了UDP广播获取IP地址,但是系统升级到iOS 14之后,发现有台iPad间歇性可以收到广播,iPhone一直没有收到广播。2. 解决办法Info.plist添加NSLocalNetworkUsageDescription发送一次UDP广播,触发权限弹框,让用户点击好,允许访问本地网络。

标签:收不到  iOS  UDP  

目录 窗口处理函数      窗口处理函

标签:函数  

文章目录 总览主机如何与IO设备进行交互IO接口的作用IO接口结构细化接口与端口统一编址vs独立编址IO接口的类型小结

标签:端口  

18、某计算机的指令流水线由4个功能段组成&#xff0c;指令流经各功能段的时间&#xff08;忽略各功能段之间的缓存时间&#xff09;分别为90ns、80ns、70ns和60ns&#xff0c;则该计算机的CPU时钟周期至少是多少。A A、 90ns     B、 80ns C、 70ns     D、 60ns 19、下列不会引起指令流水阻塞的是什么。A

标签:中央处理器  

目录 1、在项目中使用枚举类型2、不做任何处理的演示效果2.1、接口出参2.2、接口入参 3、用枚举的code作为参数和返回值

标签:接口  

&nbsp;json断言可以让我们很快的定位到响应数据中的某一字段,当然前提是响应数据是json格式的,所以如果响应数据为json格式的话,使用json断言还是相当方便的。还是以之前的接口举例Url: https://data.cma.cn/weatherGis/web/weather/weatherFcst/getCurrentConditionHTTP Method: PostRequest:staId: 54511Res

标签:断言  接口  测试  Jmeter  JSON  

接口测试与数据驱动 1简介     数据驱动测试&#xff0c;即是分离测试逻辑与测试数据&#xff0c;通过如excel表格的形式来保存测试数据&#xff0c;用测试脚本读取并执行测试的过程。 2 数据驱动与jmeter接口测试       我们已经简单介绍了接口测试参数录入及测试执行的过程&#xff0c;因为大量的测试脚本与测试数据内聚在一起&#xff0c;使得我们的测试脚本的可移植性及可维护性变得很不好&#xff0c;所以我们接下来采取了csv格式表格保存测试数据来驱动测试的方式。

标签:测试  

pm.executeAsync(filePath, args, options) filePath string 外部程序路径 args

标签:接口  

前言 这一次主要是碰到一个问题。因为使用jsch去读取文件的时候&#xff0c;有一些文件它是使用软链接制作的一个映射。因为这里面有一个问题。如果它是软链接你就无法判断他到底是文件。还是文件夹&#xff1f;因为他没有提供可以直接读取的方法&#xff0c;用权限信息去判断&#xff0c;文件和文件夹都是l开头&#xff0c;所以这一篇博客的主要目的是介绍如何去处理软链接。判断是实际的文件还是文件夹。 遇到的问题 从Jsch的参数来看&#xff0c;首先这里他提供的一些Is link是为true的。但是判

标签:文件夹  

一.makefile中的include关键字 类似C语言中的include 将其他文件的内容原封不动的搬入当前文件 make对include关键字的处理方式&#xff1a; 在当前目录搜索或指定目录搜索目标文件 搜索成功&#xff1a;将文件内容搬入当前makefile中 搜索失败&#xff1a;产生警告&#xff0c;并以文件名作为目标查找并执行对应规则

标签:原理  

在做接口测试的时候&#xff0c;会对接口进行断言&#xff0c;一个完整的接口测试&#xff0c;包括&#xff1a;请求->获取响应正文->断言。 一、apipost如何进行断言 apipost的断言设置实在后执行脚本中进行编写的。apipost本身提供了11中断言&#xff1a; apt.assert(‘response.raw.responseText&#61;&#61;“test”’);测试响应内容是否为test apt.assert(‘response.raw.status&#61;&#61;200’);测试响应码是否为200 apt.assert(‘response.raw.typ

标签:接口  

一、TTY介绍当前主要有三种类型tty设备及驱动程序:控制台、pty和串口。其中控制台和pty可看作为虚拟tty设备,物理tty设备包含串口、USB转串口、SPI转串口等。二、TTY设备及驱动信息查看确定tty设备及驱动程序类型可查阅/proc/tty/drivers文件。如下所示:

标签:串口  linux  TTY  

相关问题

相关文章

热门文章

推荐文章

相关标签