注册 登录
自由的生活_软路由 返回首页

11的个人空间 https://bbs.routerclub.com/?499 [收藏] [复制] [分享] [RSS]

日志

kernel中的kfifo接口

已有 735 次阅读2012-3-31 22:51 | 接口

内核中的内核中的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(= 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(= 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

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


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-6-1 22:22 , Processed in 0.043232 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

返回顶部