(八)linux中断实现

2023-05-16

目录

    • 一、linux中断的实现
    • 二、中断号
    • 三、中断的标志
    • 四、中断源对应的中断服务程序
    • 五、中断服务程序与原子上下文
    • 六、等待队列
    • 七、附录

一、linux中断的实现

#include <linux/interrupt.h>

linux系统针对底层的中断处理过程做了封装,使用linux提供函数,可以实现中断的响应和处理。
1、申请中断

int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
	    const char *name, void *dev)

参数说明:
unsigned int irq ---->中断号,每个中断源有一个唯一的中断号
irq_handler_t handler ---->中断服务程序,中断响应的时候,执行的函数。
unsigned long flags ---->中断的标志,外部中断:触发方式
const char *name ---->中断的名称,自定义
void *dev ---->向中断服务程序发送的参数
返回值:
成功,返回0;失败,返回复数的错误码。

注意:
1)查看中断的信息:

[root@GEC6818 /]#cat /proc/interrupts 
           CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7       
 33:          0          0          0          0          0          0          0          0       GIC  pl08xdmac
 34:          0          0          0          0          0          0          0          0       GIC  pl08xdmac
 37:          0          0          0          0          0          0          0          0       GIC  rtc 1hz
 39:         11          5          4         12         18         12         10         18       GIC  nxp-uart
 48:          1          0          0          0          0          0          0          0       GIC  s3c2440-i2c.1
 49:       1096         48       1960       1223       1589       1246       1132       1533       GIC  s3c2440-i2c.2
中断号                 各个CPU上中断发生的次数                                                  中断控制器   中断的名称

2)一个中断已经申请过了,再次申请,就申请不到了。
3)中断的优先级是高于所有的进程的。

2、中断服务程序
注意问题:
裸机:中断服务程序是没有返回值和参数的。
linux:中断服务程序是底层的中断处理过程调用的函数,所以有参数和返回值。

irqreturn_t (*irq_handler_t)(int irq, void *dev);

参数说明:
int irq ----> 中断号
void *dev —>申请中断的时候,传递的参数
返回值:

/**
 * enum irqreturn
 * @IRQ_NONE		interrupt was not from this device
 * @IRQ_HANDLED		interrupt was handled by this device
 * @IRQ_WAKE_THREAD	handler requests to wake the handler thread
 */
enum irqreturn {
	IRQ_NONE		= (0 << 0),
	IRQ_HANDLED		= (1 << 0),   ---->中断处理结束,正常返回
	IRQ_WAKE_THREAD		= (1 << 1),
};

3、释放中断

void free_irq(unsigned int, void *);

参数说明:
int irq ----> 中断号
void *dev —>申请中断的时候,传递的参数

 

二、中断号

每个中断源都有一个唯一的中断号,中断号和中断源是对应的,中断源和硬件是相关的,不同的处理器,中断源是不同的。

中断号的定义:
/arch/arm/mach-s5p6818/include/mach/s5p6818_irq.h

1、串口的中断号

#define IRQ_PHY_UART1					(6	+ 32) // pl01115_Uart_modem
#define IRQ_PHY_UART0					(7	+ 32) // UART0_MODULE
#define IRQ_PHY_UART2					(8	+ 32) // UART1_MODULE
#define IRQ_PHY_UART3					(9	+ 32) // pl01115_Uart_nodma0
#define IRQ_PHY_UART4					(10 + 32)	// pl01115_Uart_nodma1
#define IRQ_PHY_UART5					(11 + 32)	// pl01115_Uart_nodma2

2、IIC的中断号

#define IRQ_PHY_I2C0					(15 + 32)
#define IRQ_PHY_I2C1					(16 + 32)
#define IRQ_PHY_I2C2					(17 + 32)

3、定时器的中断号

#define IRQ_PHY_TIMER_INT0				(23 + 32)
#define IRQ_PHY_TIMER_INT1				(24 + 32)
#define IRQ_PHY_TIMER_INT2				(25 + 32)
#define IRQ_PHY_TIMER_INT3				(26 + 32)

4、其他

#define IRQ_PHY_ADC						(41 + 32)
#define IRQ_PHY_WDT						(31 + 32)

5、外部中断的中断号

#define IRQ_PHY_MAX_COUNT       	(74 + 32) // ADD GIC IRQ
#define IRQ_GPIO_START			IRQ_PHY_MAX_COUNT
enum {
    PAD_GPIO_A      = (0 * 32),
    PAD_GPIO_B      = (1 * 32),
    PAD_GPIO_C      = (2 * 32),
    PAD_GPIO_D      = (3 * 32),
    PAD_GPIO_E      = (4 * 32),
    PAD_GPIO_ALV    = (5 * 32),
};
#define IRQ_GPIO_A_START		(IRQ_GPIO_START + PAD_GPIO_A)
#define IRQ_GPIO_B_START		(IRQ_GPIO_START + PAD_GPIO_B)
#define IRQ_GPIO_C_START		(IRQ_GPIO_START + PAD_GPIO_C)
#define IRQ_GPIO_D_START		(IRQ_GPIO_START + PAD_GPIO_D)
#define IRQ_GPIO_E_START		(IRQ_GPIO_START + PAD_GPIO_E)

分析:
S5P6818一共32*5=160个GPIO。每个GPIO都可以作为外部中断使用:

按键 GPIO口 GPIO口号 中断号
K2 —> GPIOA28 ---->PAD_GPIO_A+28 ----->IRQ_GPIO_A_START + 28
K3 —> GPIOB30 ---->PAD_GPIO_B+30 ----->IRQ_GPIO_B_START + 30
K4 —> GPIOB31 ---->PAD_GPIO_B+31 ----->IRQ_GPIO_B_START + 31
K6 —> GPIOB9 ---->PAD_GPIO_B+9 ----->IRQ_GPIO_B_START + 9

GPIO头文件:
#include <cfg_type.h>

 

三、中断的标志

注意:
中断一安装成功(request_irq()),中断默认是打开的。

1、外部中断的中断标志
#define IRQF_TRIGGER_RISING 0x00000001
#define IRQF_TRIGGER_FALLING 0x00000002
#define IRQF_TRIGGER_HIGH 0x00000004
#define IRQF_TRIGGER_LOW 0x00000008

双边沿触发:
IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING

2、普通中断
IRQF_DISABLED - keep irqs disabled when calling the action handler.
当响应当前中断的时候,关闭其他的中断

IRQF_SHARED - allow sharing the irq among several devices
当一个中断源,注册多次,也就是一个中断源对应多个中断服务程序时

IRQF_TIMER - Flag to mark this interrupt as timer interrupt
当注册定时器的中断时,使用的标志。

 

四、中断源对应的中断服务程序

通常情况下,一个中断源对应一个中断服务程序。
也可以多个中断源对应一个中断服务程序,但是在中断服务程序中,需要区分中断源。

1、使用中断号来区分中断源

2、使用申请中断的时候,传递给中断服务程序的参数来区分中断源

 

五、中断服务程序与原子上下文

#include <linux/delay.h>
void ssleep(unsigned int seconds);  --->内核中的秒级睡眠

1、中断服务程序是一个原子过程:
例:

irqreturn_t key2_isr(int irq, void *dev)
{
	printk("key2 is pressing, irq = %d\n",irq);
	ssleep(1); //阻塞--->调度--->出错
	printk("after irq\n");
	return 	IRQ_HANDLED;
}

2、出错的信息:

[root@GEC6818 /test]#insmod key_drv.ko 
[   14.663000] gec6818 key driver init 
[root@GEC6818 /test]#[   17.544000] key2 is pressing, irq = 134   ---->已经进入到了中断服务程序
[   17.545000] BUG: scheduling while atomic: swapper/3/0/0x00010002   ----->出错,在一个原子过程中,进行进程的调度。
[   17.548000] Modules linked in: key_drv(O)
[   17.553000] [<c001517c>] (unwind_backtrace+0x0/0x134) from [<c0731340>] (__schedule+0x720/0x7d4)
[   17.561000] [<c0731340>] (__schedule+0x720/0x7d4) from [<c072f564>] (schedule_timeout+0x198/0x324)
[   17.570000] [<c072f564>] (schedule_timeout+0x198/0x324) from [<c0052e80>] (msleep+0x2c/0x38)
[   17.579000] [<c0052e80>] (msleep+0x2c/0x38) from [<bf00001c>] (key2_isr+0x1c/0x30 [key_drv])
[   17.587000] [<bf00001c>] (key2_isr+0x1c/0x30 [key_drv]) from [<c00b7344>] (handle_irq_event_percpu+0x80/0x284)
[   17.597000] [<c00b7344>] (handle_irq_event_percpu+0x80/0x284) from [<c00b7584>] (handle_irq_event+0x3c/0x5c)
[   17.607000] [<c00b7584>] (handle_irq_event+0x3c/0x5c) from [<c00b9b70>] (handle_level_irq+0xb4/0x108)
[   17.616000] [<c00b9b70>] (handle_level_irq+0xb4/0x108) from [<c001ef1c>] (gpio_handler+0x9c/0x17c)
[   17.625000] [<c001ef1c>] (gpio_handler+0x9c/0x17c) from [<c00b6b5c>] (generic_handle_irq+0x28/0x38)
[   17.634000] [<c00b6b5c>] (generic_handle_irq+0x28/0x38) from [<c000f4e4>] (handle_IRQ+0x58/0xb0)
[   17.643000] [<c000f4e4>] (handle_IRQ+0x58/0xb0) from [<c000854c>] (gic_handle_irq+0x28/0x58)
[   17.651000] [<c000854c>] (gic_handle_irq+0x28/0x58) from [<c000e840>] (__irq_svc+0x40/0x70)
[   17.660000] Exception stack(0xe30a9f88 to 0xe30a9fd0)
[   17.665000] 9f80:                   ffffffed 00000003 00000000 00000000 e30a8000 c0b298c8
[   17.673000] 9fa0: c0737290 e30a8000 e30a8000 c0aae128 00000000 00000000 00000019 e30a9fd0
[   17.681000] 9fc0: c000f83c c000f840 600b0013 ffffffff

3、原子过程
原子过程—>这个过程是一个连续的过程,该过程不能产生阻塞,不能被打断。

中断服务程序的执行过程就是一个原子过程,中断服务程序执行的过程中,使用的就是原子上下文。

上下文—>程序执行过程中,使用的环境:代码、stack、heap

哪些函数可能会产生阻塞:
ssleep()/copy_to_user()/copy_from_user()/获取信号量的函数。

不能把中断服务程序挂起。

 

六、等待队列

设置一个等待的条件,条件满足,进程就继续向下执行;条件不满足,进程就阻塞在等待队列上。当条件满足后,中断会唤醒等待队列中的进程,进程再继续向下执行。

等待队列也是一种同步的方法。

1、定义一个等待的条件

static int key_press_flag = 0;

2、定义一个等待队列

static wait_queue_head_t gec6818_key_wq;

3、初始化队列头

void init_waitqueue_head(wait_queue_head_t *q)

4、进程访问等待队列

void wait_event(wait_queue_head_t q, int condition) 
void wait_event_interruptible(wait_queue_head_t q, int condition)	

参数说明:
wait_queue_head_t *q —>定义并初始化好的等待队列
int condition—>等待条件

注意:
进程访问等待队列的时候,判断等待条件,条件满足,进程继续执行,条件不满足,进程就产生阻塞,进入睡眠状态,睡眠状态有两种。

1)进程进入睡眠的两种不同的状态:
可中断睡眠:进程在睡眠状态的时候,给该进程发信号,这个进程可以接收信号,并立即处理信号。
不可中断睡眠:进程在睡眠状态的时候,给该进程发信号,这个进程可以接收信号,但是不会立即响应这个信号,当进程进入执行状态,再去处理这个信号。

2)如何查看进程的状态:

[root@GEC6818 /]#top
Mem: 21092K used, 806356K free, 0K shrd, 892K buff, 2628K cached
CPU:  0.0% usr  1.1% sys  0.0% nic 98.8% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 0.00 0.00 0.00 1/85 138
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
  138   125 root     R     3336  0.4   1  1.1 top
    1     0 root     S     3336  0.4   2  0.0 init
  125     1 root     S     3336  0.4   2  0.0 -/bin/sh
   44     2 root     SW       0  0.0   0  0.0 [kworker/0:1]
  102     2 root     SW       0  0.0   4  0.0 [mmcqd/0]
    2     0 root     SW       0  0.0   0  0.0 [kthreadd]
    3     2 root     SW       0  0.0   0  0.0 [ksoftirqd/0]
    4     2 root     SW       0  0.0   0  0.0 [kworker/0:0]
    5     2 root     SW       0  0.0   3  0.0 [kworker/u:0]
    6     2 root     SW       0  0.0   0  0.0 [migration/0]
    7     2 root     SW       0  0.0   0  0.0 [watchdog/0]
    8     2 root     SW       0  0.0   1  0.0 [migration/1]
    9     2 root     SW       0  0.0   1  0.0 [kworker/1:0]
   10     2 root     SW       0  0.0   1  0.0 [ksoftirqd/1]
   11     2 root     SW       0  0.0   1  0.0 [watchdog/1]
   12     2 root     SW       0  0.0   2  0.0 [migration/2]
   13     2 root     SW       0  0.0   2  0.0 [kworker/2:0]
   14     2 root     SW       0  0.0   2  0.0 [ksoftirqd/2]
   15     2 root     SW       0  0.0   2  0.0 [watchdog/2]
   16     2 root     SW       0  0.0   3  0.0 [migration/3]

可中断睡眠 — S; 不可中断睡眠 — D。

3)如何想一个进程发信号
#kill 信号 PID
#killall 信号 进程的名字

4)有哪些信号

[root@GEC6818 /]#kill -l
 1) HUP
 2) INT
 3) QUIT
 4) ILL
 5) TRAP
 6) ABRT
 7) BUS
 8) FPE
 9) KILL
10) USR1
11) SEGV
12) USR2
13) PIPE
14) ALRM
15) TERM
16) STKFLT
17) CHLD
18) CONT
19) STOP
20) TSTP
21) TTIN
22) TTOU
23) URG
24) XCPU
25) XFSZ
26) VTALRM
27) PROF
28) WINCH
29) POLL
30) PWR
31) SYS
32) RTMIN
64) RTMAX

5、唤醒等待队列的进程

void wake_up(wait_queue_head_t *q)

 

七、附录

中断示例代码:key_drv.c
按键状态获取-1
按键状态获取-2
按键状态获取-3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(八)linux中断实现 的相关文章

  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志

随机推荐

  • RISC-V指令集架构------RV32I基础整数指令集

    0 基本整数指令集的分类 RISC V指令集分为基础指令集和扩展指令集 xff0c 此外又根据不同的处理器位宽分为32位 64位和128位指令集 xff0c 比如RV32I就表示32位处理器的基本整数指令集 xff0c 此外 xff0c 为
  • 如何在ubuntu22.04版本上安装libssl1.1?

    直接使用sudo apt get install会提示找不到软件包输入一下命令即可 xff1a echo 34 deb http security ubuntu com ubuntu focal security main 34 sudo
  • vue2学习总结一

    1 vue介绍 Vue是一套用于构建用户界面 xff08 数据 gt 界面 xff09 的渐进式 xff08 简单应用 xff08 一个轻量小巧的核心库 xff09 gt 复杂应用 xff08 可以引入各种各样的Vue插件 xff09 xf
  • c++判断字符串是否为回文

    回文是指正读反读均相同的字符序列 如 34 abba 34 和 abdba 均是回文 xff0c 但 34 good 34 不是回文 Solution1 使用reverse 函数将字符串反转 xff0c 与原字符串比较 xff0c 若相同
  • 多车调度问题(大疆Robot Master)——ROS键盘控制失灵,小车无法收敛定位,路径规划出错

    问题1 ROS键盘控制小车失灵 具体就是 xff1a 用键盘左右转小车 xff0c 速度贼快 xff0c 而且方向不正确 xff0c 检查发现是控制模块失灵 xff0c 有可能是内部测量元件 xff08 陀螺仪等 xff09 烧了 xff0
  • 浏览器跨域-原因及解决方案

    1 浏览器跨域 如何判断一个浏览器的请求是否跨域 xff1f 在A地址 xff08 发起请求的页面地址 xff09 向B地址 xff08 要请求的目标页面地址 xff09 发起请求时 xff0c 如果A地址和B地址在 xff1a 协议 域名
  • 使用moment.js时设置中文无效

    背景 xff1a 使用 script 标签 xff0c 在 html 页面中引入了 moment js xff0c 使用时发现页面中 moment js 相关的文字显示的是英文 xff08 eg xff1a 3 days ago xff09
  • virtual stdio 2017 问题

    严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB8020 无法找到 Visual Studio 2010 的生成工具 平台工具集 61 v100 若要使用 v100 生成工具进行生成 xff0c 请安装 Visual Stud
  • 中国天气网天气api接口 天气预报调用方法 2020

    说明 百度了很久没有找到免费的天气 API 不是收费就是接口打不开了 最后终于找到了天气api https www tianqiapi com 可免费使用 最重要的是天气数据和中国天气网一致 城市编号也是用的天气网的 这样就方便多了 体验了
  • [路由][教程]OpenWrt通过LAN连接上级路由做交换机+无线功能教程

    1 前言 上级路由为ikuai软路由 xff0c 数据处理交给软路由来做 xff0c OpenWrt运行在路由器上 xff0c 通过LAN连接上级路由从而只做WIFI接收发送功能 此教程只能将LAN作为交换机使用 xff0c WAN口不行
  • [路由][教程]OpenWrt设置为交换机+无线功能教程

    1 前言 上级路由为ikuai软路由 xff0c 数据处理交给软路由来做 xff0c OpenWrt运行在路由器上 xff0c 通过LAN连接上级路由从而只做WIFI接收发送功能 2 需求 路由的LAN和WAN全部作为交换机使用无线WIFI
  • CV学习笔记-特征提取

    特征提取 1 概述 图像中常见的特征有边缘 角 区域等 通过各属性间的关系 xff0c 改变原有的特征空间 xff0c 例如组合不同的属性得到新的属性 xff0c 这样的处理叫做特征提取 注意特征选择是从原始的特征数据集中选择出子集 xff
  • CV学习笔记-深度学习

    深度学习 1 神经网络 1 概述 引例 xff1a 生物神经网络作用机理 生物神经网络的基本工作原理 xff1a 一个神经元的输入端有多个树突 xff0c 主要是用来接收输入信息的 输入信息经过突触处理 xff0c 将输入的信 息累加 xf
  • Mybatis-Plus条件构造器笔记

    Mybatis Plus条件构造器笔记 Mybatis Plus官方文档 xff1a https baomidou com pages 10c804 本文主要讨论Mybatis Plus条件构造器的区别和用法 QueryWrapper Up
  • 日常刷题 (0)

    牛客刷题 1 即使不进行强制类型转换 xff0c 在进行指针赋值运算时 xff0c 指针变量的基类型也可以不同 xff1f 答 xff1a 错 xff0c 指针变量的赋值只能赋予地址 xff0c 决不能赋予任何其它数据 xff0c 否则将引
  • coursera C程序进阶 第二周 #6

    题目 xff1a 流感传染 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人 xff0c 也可能空着 在第一天 xff0c 有些房间里的人得了流感 xff0c
  • 大数据学习路线图(旧)

    一 入门准备 1 linux操作基础 1 Linux的介绍 xff0c Linux的安装 xff1a VMware Workstation虚拟软件安装过程 CentOS虚拟机安装过程 2 Linux的常用命令 xff1a 常用命令的介绍 常
  • Linux网络编程:状态机

    Linux网络编程 xff1a 状态机 状态机基本概念介绍状态机的特征状态机的要素注意 xff01 为什么在网络编程中需要状态机 xff1f 状态机基本概念介绍 首先我们简单的介绍一下状态机的基本概念 有限状态机是一种用来进行对象行为建模的
  • Ubuntu 20.04 安装 cuda9.0不成功如何解决

    cuda9 0需要低版本gcc才能兼容 xff0c 试了很多教程 xff0c 最终参考以下链接安装成功 xff0c 粗略记录一下 xff0c 免得下次又采坑 1 安装低版本gcc xff1a gcc 5 4 0 参考以下链接 xff1a 不
  • (八)linux中断实现

    目录 一 linux中断的实现二 中断号三 中断的标志四 中断源对应的中断服务程序五 中断服务程序与原子上下文六 等待队列七 附录 一 linux中断的实现 span class token macro property span clas