嵌入式驱动开发

本文详细介绍了嵌入式驱动开发,涵盖内核模块、字符设备驱动、高级I/O操作、中断和时间管理等多个方面。讲解了内核模块的加载、卸载工具,字符设备驱动的框架,中断处理函数,以及不同类型的中断下半部机制,如软中断、tasklet和工作队列。此外,还讨论了高级I/O操作如ioctl、阻塞I/O、异步I/O等,并探讨了内存管理和Linux设备模型。

嵌入式驱动开发

第二章 内核模块

2.1第一个内核程序

  1. 内核模块:内核模块就是被单独编译的一段内核代码,它可以在需要的时候动态地加载到内核,从而动态地增加内核的功能。在不需要的时候可以动态地卸载,从而减少内核的功能,并节约一部分内存(这要求内核配置了模块可卸载选项才行)

  2. #include<linux/init.h>
    #include<linux/kernel.h>
    #include<linux/module.h>
    
    int init_module(void)
    {
         
         
        printk("module init\n");
        return 0;
    }
    void cleanup_module(void)
    {
         
         
        printfk("cleanup module\n");
    }
    

2.2内核模块的相关工具

  • 模块加载:
    • insmod:加载指定目录下的一个.ko文件到内核。
    • modprobe:自动加载模块到内核,相对于insmod更加智能。
  • 模块信息:
    • modinfo:查看模块的信息。
  • 模块卸载:
    • rmmod:卸载模块。

2.3内核模块的一般形式

  • MODULE_LICENSE是一个宏,里面的参数是一个字符串,代表相应的许可证协议。可以是:GPL、GPLv2、GPL and additional rights、Dual BSD/GPL、Dual MIT/GPL、Dual MPL/GPL等

一个模块的程序代码

#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>
static int_init vser_init(void)
{
   
   
	printk("vser_init\n");
	return 0;
}

static void_exit vser_exit(void)
{
   
   
	printk("vser_exit\n");
}
module_init(vser_init);
module_exit(vser_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kevin Jiang <jiangxg@farsight.com.cn>");
MODULE_DESCRIPTION("A simple module");
MODULE_ALIAS("virtual-serial");

2.6内核模块依赖

/*vser.c*/
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>

extern int expval;
extern void expfun(void);

static int _init vser_init(void)
{
   
   
    printk("vser_init\n");
    printk("expval: %d\n",expval);
    expfun();
    
    return 0;
}

static void _exit vser_exit(void)
{
   
   
    printk
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值