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

基于xilkernel的嵌入式应用程序设计,第1张

 

  集成在virtex-iipro器件中的powerpc405,是一个32位risc硬核,它支持coreconnect总线的标准外设集合。使用coreconnect总线,可以方便地控制多个外设。在edk集成开发环境下,对于多个外设,每个外设都有对应的任务。powerpc405默认的嵌入式内核是standalone,在其上开发的多个任务是宏观串行执行的,只有利用参数传递或全局参变量来建立各任务间的关系。在很多情况下,系统需要多个任务系统宏观并行执行,使用standalone显然是不合适的。而通过把嵌入的standalone内核改变为edk自带的xilkernel内核,适当地改变软件平台设置的内容,就可以实现多个任务的并行执行。xilkernel也支持多任务间通讯和中断。根据各种通讯方式,也可以建立各个任务之间的联系;通过中断,处理器可以及时响应外设产生的事件。

  硬件系统结构

  如图1所示,powerpc405使用fpga外部的存储单元,使用coreconnect总线和外围接口。coreconnect总线的标准外设集合可以重复使用,使系统整合变的更加容易。

  

基于xilkernel的嵌入式应用程序设计,图1powerpc405硬件系统结构,第2张

 

  图1powerpc405硬件系统结构

  coreconnect总线结构

  plb总线接口:用于powerpc405内核与高性能设备的连接。plb接口包括isplb接口和dsplb接口两种。其中,isplb接口用于外设与powerpc405指令缓冲的连接,dsplb接口用于外设与powerpc405数据缓冲的连接。

  opb总线接口:片上外设总线,内核通过opb来访问低速和低性能的系统资源。它不是直接连接到处理器内核。处理器内核借助于“plbtoopb”桥,通过opb访问从外设;opb总线控制器的外设可以借助“opbtoplb”桥,通过plb访问存储器

  硬件平台构件

  在edk集成开发环境中,由用户向导生成mhs文件,用户也可以根据mhs文件的语法添加自定义的外设。mhs文件用于描述硬件体系结构,其主要包括平台的处理器类型、总线结构、外围接口、中断处理和地址空间。

  edk工具platgen使用mhs文件作为输入来创建硬件平台,它创建不同形式的网表文件(ngc,edif),下游工具的支持文件和顶级hdl包装以允许用户添加其他的组件到硬件平台。

  软件系统结构

  在edk集成开发环境中,mss文件用于描述软件体系结构,其主要定义了平台的内核、软件库、驱动程序和文件系统的参数。

  edk工具libgen使用mss文件作为输入,定制驱动、库、文件系统和中断处理程序。

  xilkernel模块结构

  xilkernel模块结构如图2所示,xilkernel提供与内核的posix接口。但并不是每一个通过posix定义的概念和接口都是可用的。取而代之的是一个精细选择的子集,几乎覆盖了所有有用的接口和概念。其支持posix线程、posix无名信号量、xsi消息队列、posix互斥锁、中断处理等。

  xilkernel的软件平台配置

  xilkernel已经被设计为可以和edk软件和硬件流紧密共同工作,完全被整合在软件平台配置和自动的库、板级支持包产生机制之中。在软件配置平台,可以对xilkernel支持的功能进行配置,下面介绍一些主要的配置:

  a、指定系统定时器的频率值和时间片间隔。

  b、指定系统可以运行的线程数量、任务调度方式(这里我们设置为优先级抢占方式,以保证重要的突发事件及时得到处理)和系统中断控制器。

  c、配置系统的通讯方式,可以通过这些开关来确定系统需要的通讯方式,并可以确定各个通讯方式的参数。包括消息队列、信号量等。

  d、指定系统的静态任务,也就是完全进入内核后执行的第一个任务,可以在这个任务里产生和设置系统需要的其它任务。

  e、一些增强系统功能的设置等等。

  主要任务间的通讯方式和中断

  必需的配置

  首先要生成连接脚本,是通过硬件需要生成的,此脚本反映了xilkernel需要的不同的段存储器。比如.vectors段被分配于一个有64kb地址边界的存储器的开始,而.boot段在0xfffffffc处。其余的代码和数据存储器可以放在任何地方。

  

基于xilkernel的嵌入式应用程序设计,图2xilkernel模块结构,第3张

 

  图2xilkernel模块结构

  其次,xilkernel是作为一个库来架构的。这意味着应用程序源文件仅需要连接xilkernel,就能够访问xilkernel的功能。这些需要设置编译器的库连接选项为xilkernel,并在用户代码中包含“xmk.h”文件。应用程序提供main()入口,然后通过调用xilkernel_main()作为内核的入口点。产生库、bsp并编译程序后,xilkernel将自动作为系统启动、初始化硬件核、中断和软件处理程序的一部分。下面是一个简单的内核入口代码:

  #include"xmk.h"

  /*定义和声明*/

  intmain()

  {

  /*用户完成预处理,不允许调用内核接口*/

  xilkernel_main();/*开始内核*/

  /*程序不会执行到这里*/

  }

  /*系统的静态任务*/

  void*first_thread()

  {

  /*产生一些线程来处理用户需要*/

  }

  线程的创建

  线程的创建及属性的简单设置可以由下面几个函数实现:

  intpthread_attr_init(pthread_attr_t*attr)

  intpthread_attr_setschedparam(pthread_attr_t*attr,structsched_param*schedpar)

  intpthread_create(pthread_tthread,pthread_attr_t*attr,void*(*start_func)(void*),void*param)

  pthread_attr_init()初始化线程的属性。thread_attr_setschedparam()来设置线程的优先级,attr是线程的属性,schedpar是包含有线程优先级的数据结构。pthread_create()创建一个线程,thread表明线程id,attr指出线程属性,start_func函数指针是线程创建成功后开始执行的函数,param是这个函数的一个唯一的参数。

  在静态任务中调用这些函数来产生一些有优先级的任务。如下例:

  staTIcpthread_tTId0,TId1;

  staTIcpthread_attr_tattr;

  staticstructsched_paramprio;

  void*first_thread(){......

  pthread_attr_init(&attr);

  prio.sched_priority=4;

  pthread_attr_setschedparam(&attr,&prio);

  ret=pthread_create(&tid0,&attr,(void*)important_task,null);

  pthread_attr_init(&attr);

  prio.sched_priority=5;

  pthread_attr_setschedparam(&attr,&prio);

  ret=pthread_create(&tid1,&attr,(void*)second_important_task,null);

  ......

  }

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

  

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2713856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存