Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573246
  • 博文数量: 117
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 359
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 21:58
个人简介

爱上香烟

文章分类

全部博文(117)

文章存档

2018年(3)

2017年(8)

2016年(65)

2015年(41)

我的朋友

分类: LINUX

2015-05-02 10:05:14

原文地址:kernel中的kfifo接口 作者:zhanglong71

内核中的内核中的fifo使用备忘。
向fifo中存入、取出数据。
 
系统环境:ubuntu-10.04/linux-2.6.32-38-generic/gcc version 4.3.4(Ubuntu 4.3.4 10ubuntu1)
 
代码:kfifo.c

点击(此处)折叠或打开

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/kfifo.h>

  5. MODULE_LICENSE("GPL");
  6. MODULE_AUTHOR("zl");
  7. MODULE_VERSION("V1.0");
  8. MODULE_DESCRIPTION("kfifo test");

  9. struct KfifoNode {
  10.     unsigned int num;
  11.     char *string;
  12. };

  13. char *array[] = {
  14.     "abcdefg",
  15.     "gfedcba",
  16.     "aaaaa",
  17.     "bbbb",
  18.     "ccc",
  19.     "dd",
  20.     "e",
  21.     "12345",
  22.     "1234",
  23.     "123",
  24.     "12",
  25.     "1",
  26.     "1111",
  27. };

  28. #define TAB_SIZE(array) (sizeof(array)/sizeof(array[0]))

  29. static struct kfifo *pkfifoSpace;
  30. static spinlock_t fifoLock;

  31. static void kfifo_check(char* str, int line, struct kfifo* pkfifo)
  32. {
  33.     if(pkfifo != NULL)
  34.     {
  35.         printk("[%s-%d]: pkfifo->size = %d\t pkfifo->in = %d\t pkfifo->out = %d\t \n", str, line, pkfifo->size, pkfifo->in, pkfifo->out);
  36.     }
  37. }

  38. static int __init mykfifo_init(void)
  39. {
  40.     int i;
  41.     struct KfifoNode *pstNode;

  42.     pkfifoSpace = kfifo_alloc((sizeof(struct KfifoNode) << 4), GFP_KERNEL, &fifoLock);
  43.     if (pkfifoSpace == NULL)
  44.     {
  45.         printk("kfifo_alloc failed !\n");
  46.         return -EFAULT;
  47.     }
  48.     spin_lock_init(&fifoLock); //Initial fifo spinlock
  49.     pstNode = kzalloc(sizeof(struct KfifoNode), GFP_KERNEL);
  50. /****************************************************************/
  51.     printk("*****************************************************\n");
  52.     kfifo_check((char *)__func__, __LINE__, pkfifoSpace);
  53.     for(i = 0; i < TAB_SIZE(array); i++)
  54.     {
  55.         pstNode->num = i;
  56.         pstNode->string = (char *)array[i];
  57.         kfifo_put(pkfifoSpace, (unsigned char *)pstNode, sizeof(struct KfifoNode)); //将数据写入缓冲区
  58.         kfifo_check((char *)__func__, __LINE__, pkfifoSpace);
  59.         printk("[%s-%d]:Num is: %d, Message is: %s\n", __func__, __LINE__, pstNode->num, pstNode->string);
  60.     }
  61. /***************************************************************/
  62.     printk("-----------------------------------------------------\n");
  63.     if(!kfifo_len(pkfifoSpace))
  64.     {
  65.         printk("[%s-%d]: kfifo_len return 0, test failed !!! \n", __func__, __LINE__);
  66.         kfifo_reset(pkfifoSpace);
  67.         kfifo_free(pkfifoSpace);

  68.         return -1;
  69.     }
  70.     
  71.     for(i = 0; i < TAB_SIZE(array); i++)
  72.     {
  73.         kfifo_get(pkfifoSpace, (unsigned char *)pstNode, sizeof(struct KfifoNode));
  74.         kfifo_check((char *)__func__, __LINE__, pkfifoSpace);
  75.         printk("[%s-%d]: Num is: %d, fifoMessage is: %s\n", __func__, __LINE__, pstNode->num, pstNode->string);
  76.     }
  77. /***************************************************************/
  78.     printk("-----------------------------------------------------\n");
  79.     kfifo_check((char *)__func__, __LINE__, pkfifoSpace);

  80.     kfree(pstNode);
  81.     kfifo_reset(pkfifoSpace);
  82.     kfifo_free(pkfifoSpace);

  83.     return 0;

  84. }

  85. static void __exit mykfifo_exit(void)
  86. {
  87.     printk("exit !\n");
  88. }

  89. module_init(mykfifo_init);
  90. module_exit(mykfifo_exit);
makefile文件:

点击(此处)折叠或打开

  1. obj-m = kfifo.o
  2. #KERNELS = /home/zl/linux-2.6.30.4
  3. KERNELS = /lib/modules/$(shell uname -r)/build/
  4. default:
  5. make -C $(KERNELS) M=$(shell pwd) modules
  6. .PHONY:clean
  7. clean:
  8. make -C $(KERNELS) M=$(shell pwd) clean

编译,运行,及查看运行结果:

make clean;make;sudo insmod kfifo.ko ;sudo rmmod kfifo.ko ;tail -n200 /var/log/messages


 
阅读(1090) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~