当表示SHAVE完成工作的中断信号出现时,线程将被重回准备状态。在中断处理程序调用sem_post时,将会释放旗语并唤醒阻塞的线程。
RTEMS的源代码在MDK中已经包含并允许客户修改。一些步骤需要被遵循以从源代码中编译RTEMS:make all、make compile-、make all ENABLE_DEBUG=yes、make install等。具体见本章文档。
为在两个LEONs上运行RTEMS,RTEMS_ON_BOTH_LEONS需要被设置为‘yes’。如果RTEMS_BUILD_NAME被设置为‘b-custom’使用两个LEONs的应用程序将使用二进制文件路径为:mdk/common/rtems/prebuiltcustom/build/myriad2:LeonOS需要使用的库和包含文件来自于b-los路径;LeonRT使用的来自于b-lrt路径。
如果RTEMS_BUILD_NAME变量设置为‘b-prebuild’,两个Leons将使用同样的RTEMS库mdk/common/rtems/prebuilt。
MDK包含的通用代码包括驱动、组件及示例应用。
示例程序分为几个子路径:myriad1,myriad2和移动部分(portable)。Myriad1和Myriad2路径有四个类别的示例:Demo,HowTo,Progressive and SIPP;portable路径下不包含Demo。
Progressive类别用于培训学习。这些例子从简单的Leon或者Shave打印开始,发展到复杂的并行计算或者DMA优化使用。
该类别的示例展示了实现各种MDK软件开发目的的例子。
仅包含MaxFlops示例,展示如何运行卷积核处理图像,使用的SHAVE汇编代码。
包含基于SIPP的示例。具体可见SIPP用户手册。
Sparc-elf-objcopy用于包含原始数据到elf文件。
见文档该章
LeonOS,LeonRT和12个SHAVES如何相互通信及在应用程序开发中需要跟踪哪些东西。
如果变量在Leon中被申明(int myvar[4]),SHAVE访问它的方法是简单的通过变量名:extern int myvar[4] (变量在OS中申明)或者extern int lrt_myvar[4](变量在RT中被申明),然后可以跟其他变量一样使用。
假设同样的变量myvar被连接到mvlib文件的应用程序所申明,并被放置到Shave3中。这样,当从Leon访问该变量时,需要使用的方法是:extern u32 someapp3_myvar[4]。然后使用someapp3_myvar如其他变量一样。
有时需要多个SHAVES使用相同物理地址的同一个变量。例如一个特殊的SHAVE函数或者变量需要被所有的SHAVEs共享。这样可以通过统一符号来实现。这样需要在SHAVE的mvlib文件中定义的变量不需要在shave3和shave4中定义为extern u32 someapp3_myvar[4],extern u32 someapp4_myvar[4]。而是将这个变量定义为myvar通过创建symuniq文件并用规则创建shvXuniqlib文件。可以参考Makefile规则的相关部分来了解使用细节。
RT的入口函数作为RT的starting执行点,可以在OS侧访问,如:extern u32 lrt_start。
OS调用RT,RT调用SHAVE的方法。更详细的信息在编译过程中的创建mvlib部分。
同步运行需要调用如下函数void swcStartShave(),void swcStartShaveCC()。异步运行需要调用函数:void swcStartShaveAsync(),void swcStartShaveAsyncCC()。
动态加载代码到SHAVE核运行
两类可动态加载:‘Mbin’文件和‘shvdlib’文件。动态加载由库函数swcShaveLoader完成。
该部分主要目标是以分析执行速度信息为例提供一个基本的指导,涉及MDK软件包的可选项并解释其中的一些限制。该部分不提供所有的分析内容,比如:功率消耗分析,指令级并行等。
SHAVE处理器有2个64bit的硬件计数器可以配置用来计数各个指标。
swcTestUtils,使用详细信息可以在doxygenated MDK文档中找到。因为只有两个计数器可用,为了计数所有指标必须多次执行相同的代码
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-66399-4.html