Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26316
  • 博文数量: 16
  • 博客积分: 770
  • 博客等级: 军士长
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-02 10:33
文章分类

全部博文(16)

文章存档

2011年(1)

2009年(15)

我的朋友

分类:

2009-03-26 12:13:56

驱动是利用ARM的中断完成的,在LINUX下。
主要利用到:
1.字符设备驱动开发的整体框架。
主要是编写FILE_OPERATIONS这个特殊结构体中相应的函数,比如READ,init,write这些供应用程序使用。完成后生成.o文件,下载到ARM中的嵌入式系统中,利用insmod 加载进内核,在/dev下生成相应的设备结点,供应用程序打开。
2.int request_irq(unsigned int irq,irqreturn_t (*handler)(int, void *, struct pt_regs *),unsigned long irqflags, const char *devname, void *dev_id);
这个是申请中断函数,还有下面一组函数void disable_irq(unsigned int irq);
void enable_irq(unsigned int irq);
void free_irq(unsigned int irq, void *dev_id);
int set_external_irq(int irq, int edge, int pullup);这是设置中断方式。
 
另外由于利用到任务队列,因此用到了内核中的锁机制,这与应用层稍有不同,它们是:
spinlock_t buffer_lock = SPIN_LOCK_UNLOCKED;
spin_lock_irq(&buffer_lock);
spin_unlock_irq(&buffer_lock);
 
3.任务队列,其实就是C语言中常用的环形队列,下面是我写的一个队列接口:
.c文件:
#include "queue.h"
#include
#define print() printf("error!\n")
void queue_init(QUEUE * myqueue)
{
 myqueue->item_number = 0;
 myqueue->head = NULL;
 myqueue->rear = NULL;
}
bool queue_myempty(const QUEUE * myqueue)
{
 return (myqueue->item_number == 0); 
}
bool queue_myfull(const QUEUE * myqueue)
{
 return (myqueue->item_number == MAXNUMBER );
}
int queue_count(const QUEUE * myqueue)
{
 return (myqueue->item_number);
}
bool queue_add(ITEM item,QUEUE * myqueue)
{
 ITEM *temp = (ITEM*)malloc(sizeof(ITEM));
 if(queue_myfull(myqueue))
 {
  print();
  return false;
 }
 printf("hello\n");
 temp->number = item.number;
 if(queue_myempty(myqueue))
  myqueue->head = temp;
 else
  myqueue->rear->next = temp;
  printf("add\n");
  myqueue->rear = temp;
  myqueue->item_number++;
  temp->next = NULL;
  printf("add\n");
  return true;
}
bool queue_del(QUEUE * myqueue)
{
 ITEM *temp;
 if(queue_myempty(myqueue))
 {
  print();
  return false;
 }
 temp = myqueue->head;
 myqueue->head = myqueue->head->next;
 printf("remove the node :%d\n",temp->number);
 free(temp);
 myqueue->item_number--;
 if(queue_myempty(myqueue))
  myqueue->rear = NULL;
 return true;
}
bool queue_clear(QUEUE * myqueue)
{
 while(!queue_myempty(myqueue))
  queue_del(myqueue);
 return true;
}
.h文件
#pragma c9x on
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include
#define MAXNUMBER 10
typedef struct item{
 int number;
 struct item *next;
}ITEM;
typedef struct queue{
 ITEM *head;
 ITEM *rear;
 int item_number;
}QUEUE;
bool queue_myempty(const QUEUE * myqueue);
bool queue_myfull(const QUEUE *myqueue);
bool queue_clear( QUEUE *myqueue);
int queue_count(const QUEUE *myqueue);
void queue_init(QUEUE * myqueue);
bool queue_add(ITEM item,QUEUE * myqueue);
bool queue_del(QUEUE *myqueue);
#endif
 
阅读(565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~