新闻中心

EEPW首页>嵌入式系统>设计应用> 基于xilkernel的嵌入式应用程序设计方法

基于xilkernel的嵌入式应用程序设计方法

作者: 时间:2011-12-23 来源:网络 收藏

  这样,系统会发起important_task和second_important_task两个任务,important_task的优先级比second_important_task高,会优先运行。除非important_task任务阻塞或退出,second_important_task才可能得到运行。

  posix无名信号量

  信号量提供高速的任务间同步和互斥机制。对于互斥,信号量可以上锁共享资源,使得该共享资源在同一时刻只有一个线程所拥有。关于此信号量的一些常用函数如下:

  intsem_init(sem_t*sem,intpshared,unsignedintvalue);
intsem_wait(sem_t*sem);
intsem_post(sem_t*sem);

  sem_init()创建一个信号量,并初始化信号量的值为value;sem_wait()调用将阻塞进程,直到信号量的值大于0,此函数返回时信号量的值减1;sem_post()是将信号量的值加1,并发出信号唤醒等待的进程。

  信号量用于同步,一般要初始化为0,等待要同步的任务阻塞在sem_wait()调用上。任务调用sem_post来解锁该信号量,来达到同步。下面一个例子是用信号量实现同步操作的:

staticsem_tprotect;
void*first_thread(){......
sem_init(protect,1,0);
......
}
void*thread_func1(){......
while(1){
sem_wait(protect);
......
}
}
void*thread_func2(){......
while(1){......
if(某种条件成立)sem_post(protect);
}
}

  当信号量用于互斥时,一般要初始化为一个大于0的值,就可以让资源可用。如果信号量的初始值为1,第一个上锁该信号量的线程会立即执行,后继的线程将会阻塞,直到下次信号量解锁才会执行。

  xsi消息队列

  消息队列允许长度可变、数目可变的消息排队。任何任务或中断服务程序可以发送消息到消息队列。任何任务可从消息队列接收消息。关于此消息队列的一些常用函数如下:

  intmsgget(key_tkey,intmsgflg)
intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg)
ssize_tmsgrcv(intmsqid,void*msgp,size_tnbytes,longmsgtyp,intmsgflg)

  msgget()来创建一个消息队列,key是消息队列的标识符,msgflag目前有两个选项,ipc_creat和ipc_excl。msgsnd()函数往队列发送一条消息,msgp是消息缓冲指向的指针,msgsz表示消息的字节数。msgrcv()函数作用是从消息队列中读取消息,把接收到的消息拷贝到msgp指针指向的缓冲区,nbytes表示缓冲支持的消息字节数。发送和接收消息中的msqid是消息队列描述符,用来标识相关的消息队列。下面是消息队列单向通信的简单代码:

struct_msg{
shorttype;
charfirst;
charlast;
};
staticstruct_msgmsg_p;
staticstruct_msgmsg_c;
staticintmsgid;
void*first_thread(){......
msgid=msgget(5,ipc_creat|ipc_excl);
......
}
void*consumer()
{
while(1){
msgrcv(msgid,msg_c,4,0,0);
......
}
}
void*producer()
{
while(1){......
msgsnd(msgid,msg_p,4,0);
}
}

  在例子开始,建立消息的数据结构。在producer()中操作消息的各项数据,通过msgsnd()发送此消息。在consumer()中,如果消息队列里没有消息,则msgsnd()阻塞此线程,直到消息队列非空时,msgsnd()才把消息复制到msg_p指向的数据结构中,此时此线程开始执行,并可以对接收到的消息进行处理。

  中断

已经被设计为可以和多个中断设备共同工作,用户用opb_intcip核作为中断控制器来处理硬件中断。仅支持一个中断控制器来连接ppc405的外部中断引脚,而且不支持中断控制器连接临界的中断。对于中断继承了standalone的中断处理

  在xilkernel_main()中已经完成了初始化powerpc405的中断表,并能使了中断控制器连接在处理器上的非临界的中断。下面是摘抄xilkernel_main()内部执行相关代码:

  xexc_init();/*初始化powerpc405的中断表*/
xexc_menableexceptions(xexc_non_critical);/*能使非临界中断*/

  下面是开发程序要做的一些工作。首先,使中断控制器开始接收中断;其次,把必需的非临界中断添加到中断控制器上;再就是注册此非临界中断;最后能使此中断。下面是一个串口中断接收的简单代码:

void*first_thread(){......
xintc_mmasterenable(xpar_myintc_baseaddr);
xintc_menableintr(xpar_myintc_baseaddr,xpar_myuart_interrupt_mask);
xintc_registerhandler(xpar_myintc_baseaddr,xpar_myuart_interrupt_intr,
(xinterrupthandler)uart_int_handler,(void*)xpar_myintc_baseaddr);
xuartlite_menableintr(xpar_myuart_baseaddr);
......
}
voiduart_int_handler(void*baseaddr_p){/*
中断处理程序*/while(!xuartlite_misreceiveempty(xpar_myuart_baseaddr)){
ch=xuartlite_recvbyte(xpar_myuart_baseaddr);
......
}
}

 一个中断事件和中断处理程序相连接。而中断处理程序应该尽量短,如果中断处理程序不能完全处理此事件,可以由信号量同步发起一个任务来处理本事件。

  结语

  xilinx公司的vritex-iipro实现了“微处理器+可编程逻辑”的可配置设计平台,其出众的性能受到高端的青睐。在此平台上利用xilkernel操作系统,为开发提供了极大的系统结构灵性。本文仅介绍了几种常用的xilkernel的应用,读者还可以利用互斥、软件定时器等实现其它的功能。读者也可以根据嵌入式开发的经验和xilkernel的强大功能,构建复杂的fpga嵌入式系统。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭