1.linux中程序切换到后台去运行,第一种办法是在输入命令的时候在末尾加上&符号:
# ./test &
如果测试程序已经在运行了,这个时候可以按ctrl+z将程序切换到后台去运行。
将后台运行的程序切换到前台:
# fg
如果有多个后台程序,可以先使用jobs命令,然后使用fg+数字来指定将某个程序切换到前台。
# top
这个命令可以查看各个进程使用CPU的比例(类似于windows的任务管理器)。
2.linux内核中的trap_init函数被用来设置各种异常的处理向量,包括中断向量。
# vi .config
CONFIG_VECTORS_BASE的值就是内核中断基址。
trap_init里面构造了异常向量,异常向量表中有各种向量处理函数需要跳转的地址,跳转过去之后会做保存现场等一些工作,最后调用asm_do_IRQ,asm_do_IRQ这个函数是C语言来实现的,主要负责中断处理。里面实现:
(1)判断是哪个中断
(2)调用中断处理函数
(3)清中断
分析:
首先根据中断号再找到irq_desc数组中对应的中断描述(这个数组以中断号为下标),然后进入desc_handle_irq,调用desc->handle_irq,(搜索handle_irq:ctrl+/)找到在Chip.c中有语句desc->handle_irq = handle以此为根据找到中断处理函数,desc->handle_irq = handle这条语句在__set_irq_handler函数中,该函数是在Irq.h中被函数set_irq_handler替换掉的,继续查找set_irq_handler的调用者,最后找到在s3c24xx_init_irq函数中调用该函数(设置的依据是中断号)。
3.handle_edge_irq函数的分析
进入函数判断中断的状态,对中断次数计数,desc->chip_ack()函数清除中断,handle_IRQ_event真正的中断处理过程,该函数取出action链表中的成员执行action->handler。
4.在Irq.h中定义有irq_desc结构体,这个结构体里面保存了很多中断处理的相关变量。用户的中断程序一般放在action->handler中,用户的函数必须通过request_irq来注册为中断函数,request_irq这个函数在Manage.c中定义。与request_irq函数相对的是free_irq函数,用来卸载中断函数。
5.基于中断的LED驱动程序
(1)在open函数中使用request_irq函数来设置中断。
request_irq(IRQ_EINT0, buttons_irq, IRQT_BOTHEDGE, "S", 1);
(2)在close函数中使用free_irq来卸载中断。
free_irq(IRQ_EINT0, 1);
(3)添加buttons_irq函数。
(4)添加头文件。
(5)加载驱动之后
# cat /proc/interrupts
并没有出现"S",还需要打开这个设备
# exec 5</dev/buttons
# cat /proc/interrupts
如果要关闭这个设备
# exec 5</&-
s3c2410_gpio_getpin(),这个系统函数能够帮助判断某个引脚的状态。
# ./test &
如果测试程序已经在运行了,这个时候可以按ctrl+z将程序切换到后台去运行。
将后台运行的程序切换到前台:
# fg
如果有多个后台程序,可以先使用jobs命令,然后使用fg+数字来指定将某个程序切换到前台。
# top
这个命令可以查看各个进程使用CPU的比例(类似于windows的任务管理器)。
2.linux内核中的trap_init函数被用来设置各种异常的处理向量,包括中断向量。
# vi .config
CONFIG_VECTORS_BASE的值就是内核中断基址。
trap_init里面构造了异常向量,异常向量表中有各种向量处理函数需要跳转的地址,跳转过去之后会做保存现场等一些工作,最后调用asm_do_IRQ,asm_do_IRQ这个函数是C语言来实现的,主要负责中断处理。里面实现:
(1)判断是哪个中断
(2)调用中断处理函数
(3)清中断
分析:
首先根据中断号再找到irq_desc数组中对应的中断描述(这个数组以中断号为下标),然后进入desc_handle_irq,调用desc->handle_irq,(搜索handle_irq:ctrl+/)找到在Chip.c中有语句desc->handle_irq = handle以此为根据找到中断处理函数,desc->handle_irq = handle这条语句在__set_irq_handler函数中,该函数是在Irq.h中被函数set_irq_handler替换掉的,继续查找set_irq_handler的调用者,最后找到在s3c24xx_init_irq函数中调用该函数(设置的依据是中断号)。
3.handle_edge_irq函数的分析
进入函数判断中断的状态,对中断次数计数,desc->chip_ack()函数清除中断,handle_IRQ_event真正的中断处理过程,该函数取出action链表中的成员执行action->handler。
4.在Irq.h中定义有irq_desc结构体,这个结构体里面保存了很多中断处理的相关变量。用户的中断程序一般放在action->handler中,用户的函数必须通过request_irq来注册为中断函数,request_irq这个函数在Manage.c中定义。与request_irq函数相对的是free_irq函数,用来卸载中断函数。
5.基于中断的LED驱动程序
(1)在open函数中使用request_irq函数来设置中断。
request_irq(IRQ_EINT0, buttons_irq, IRQT_BOTHEDGE, "S", 1);
(2)在close函数中使用free_irq来卸载中断。
free_irq(IRQ_EINT0, 1);
(3)添加buttons_irq函数。
(4)添加头文件。
(5)加载驱动之后
# cat /proc/interrupts
并没有出现"S",还需要打开这个设备
# exec 5</dev/buttons
# cat /proc/interrupts
如果要关闭这个设备
# exec 5</&-
s3c2410_gpio_getpin(),这个系统函数能够帮助判断某个引脚的状态。