Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43381
  • 博文数量: 24
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-05 11:10
文章分类
文章存档

2011年(1)

2010年(3)

2009年(20)

我的朋友
最近访客

分类: LINUX

2009-09-27 20:23:43

模块编程我们先从hello world程序开始。
例1。编写hello world程序
  1 #include
  2 #include
  3 MODULE_LICENSE("Dual BSD/GPL");
  4 static int hello_init(void)
  5 {
  6         printk(KERN_ALERT "hello world!\n");
  7         return 0;
  8 }
  9 static void hello_exit(void)
 10 {
 11         printk(KERN_ALERT "goodbay world!\n");
 12 }                                                                          
 13 module_init(hello_init);
 14 module_exit(hello_exit);
写好了模块,然后我们要写出相应的Makefile。都写好后,我们make一下。
接下来我们sudo  insmod   hello.ko,然后我们用dmesg |tail查看,发现了: [ 1195.287181] hello world!
下来我们sudo  rmmod   hello,然后我们继续用dmesg |tail查看,发现了:[ 1341.549571] goodbay world!

(lsmod 列出已经加载的模块和其信息)
例2。在
hello world程序的基础上,我们改写成蜂鸣器的模块程序(这个程序我是在3250开发板运行的,此程序使蜂鸣器响三声)。
#include
#include
#include
#include

#define p3_out1 io_p2v(0x40028004)
#define p3_out0 io_p2v(0x40028008)
void beep()
{
        int i,tmp=3;
        while(tmp)
        {
                for(i=0;i<1000;i++)
                {
                        udelay(1000);
                }
                __raw_writel((1<<7),p3_out0);
                for(i=0;i<1000;i++)
                {
                        udelay(1000);
                }
                __raw_writel((1<<7),p3_out1);
        tmp--;
        }
}
static int __init beep_init(void)
{
        printk("init beep!\n");
        beep();
        return 0;
}
static void __exit beep_exit(void)
{
        printk("exit beep!\n");
}
module_init(beep_init);
module_exit(beep_exit);
MODULE_LICENSE("Dual BSD/GPL");
与之相对应的Makefile:
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
obj-m := beep.o
else
PWD  := $(shell pwd)
KVER = 2.6.27.8
KDIR := /home/guo/Linux2.6.27/sources/linux-2.6.27.8-smartarm3250(这是我编译开发板内核的路径)
all:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
        rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
阅读(744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~