(多核DSP快速入门)5.SYS/BIOS的使用实例分析

  原创文章

转载请注册来源http://blog.csdn.net/tostq

系列教程目录:http://blog.csdn.net/tostq/article/details/51245979   

       SYS/BIOS是一个可扩展的实时内核(或者说是操作系统),其提供了许多模块化的APIs(应用程序接口),支持抢占式多线程,硬件抽象,实时分析和配置工具,其设计目的是为了最大限度地减少对内存和CPU的要求。其拥有很多实时嵌入式操作系统的功能,如任务的调度,任务间的同步和通信,内存管理,实时时钟管理,中断服务管理等。有了它,用户可以编写复杂的多线程程序,并且会占用更少的CPU和内存资源。
       SYS/BIOS的早期版本是DSP/BIOS,更名的原因,是因为SYS/BIOS不仅可以用于DSP,而且也可以嵌入到ARM等其他SoC中去。SYS/BIOS是一个可用于实时调度、同步,主机和目标机通信,以及实时分析系统上的一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析和配置工具等。同时也提供标准的API接口,易于使用。它是TI的eXpressDSP实时软件技术的的一个关键部分。
       CCS中集成安装了SYS/BIOS,能够大大方便用户编写多任务应用程序。另一方面,SYS/BIOS可以在XDCtools中使用配置技术,极大地方便了SYS/BIOS的开发流程。
       本节主要是通过一些简单的SYS/BIOS的例子来介绍相关APIs组件的作用,这里主要包括了时钟Clock模块、任务Tsk模块、软件中断Swi模块、信号量Sem模块及日志Log模块五类简单模块的使用。

一、新建SYS/BIOS项目
(1)在项目模板中选择SYS/BIOS项目中的Hello Example模板,点击Next

(2)在RTSC(XDCtools的别称)配置页中选中需要的SYS/BIOS,XDCtools及其他组件的版本,Target保持默认,不需修改,如果Platform没有自动填充,选择与设备适用的平台。Build-profile决定程序链接的库,推荐使用release,即使仍然处于创建和调试阶段,点击完成创建项目。

Tips:当我们开始使用SYS/BIOS时,是不能指定自己添加的链接命令文件.cmd。因为.cmd会在构建工程的时候由SYS/BIOS自动创建并使用。
(3)点击编译
(4)导入target文件后,点击调试,运行得到结果

二、SYS/BIOS的模块与配置
(1)SYS/BIOS可以用文本编辑器或者是图像配置编辑器XGCONF来编辑,双击打开.cfg文件如下

       单击System Overview,可以显示程序当前使用的主模块(带绿色小箭头的)
(2)各种APIs模块的添加这里有两种方法,一种是直接双击主模板进入,然后勾选Add

       另一种方法是在Available Products中右击选中的模块,选择Use

(3)各个API模块的作用
       CLK:片内定时器模块,主要控制片内定时器并提供高精度的32位实时逻辑时钟,它能控制中断的速度,使之最快达到单指令周期时间。
       HST:主机输入/输出模块,管理主机通过对象,它允许应用程序在目标系统和主机之间交流数据,主机通道通过静态配置为输入或输出。
       HWI:硬件中断模块,提供对硬件中断服务例程的支持,可在配置文件中指定当硬件中断发生时需要启动的函数
       IDL:休眠功能模块,管理休眠函数在目标系统程序没有更高优先权的函数运行时启动
       LOG:日志模块,管理LOG对象,LOG对象在目标系统程序执行时实时捕捉事件,开发者可以使用系统日志或定义自己的日志,并在CCS中利用它实时浏览信息。
       MEM:存储器模块允许指定存放目标程序的代码和数据所需的存储器段
       PIP:数据通道模块管理数据通道,它用来缓存输入和输出数据流,这此数据通道提供一致性的软件数据结构,可以使用它们驱动DSP和其他实时外围设备之间的I/O通道
       PRD:周期函数模块,管理周期对象,它触发应用程序的周期性执行。
       RTDX:实时数据交换允许数据在主机和目标系统之间实时交换,在主机上使用自动OLE的客户都可对数据进行实时显示和分析。
       STS:统计模块,管理统计累积器,在程序运行时,它存储关键统计数据并能通过CCS浏览这此统计数据
       SWI:软件中断模块管理软件中断。
       TRC:跟踪模块,管理一套跟踪控制比特,它们通过事件日志和统计累积器控制程序信息的实时捕捉。

三、在项目中导入LOG模块
       LOG模块实际上是一个实现打印信息的API
       (1)添加LOG模块

       (2)LOG模块的使用
       LOG模块定义了许多比如Log_error、Log_info、Log_warning、Log_print等之类函数,这些函数的用法同printf函数的用法很相似,这些函数都可以在 <xdc/runtime/Log.h>找到,其实际上是将printf的有用法分成许多不同的类(如错误信息、提示信息、警告信息等),LOG模块打印的内容可以在Tools/RTA/PrintfLogs中看到。
       Tips:LOG中定义了许多如下的函数,i比如Log_info1函数后面的数字代表函数接的变量数目
       如Log_info1("%d",s1)、Log_info2("%d, %d", s1, s2)


四、在项目中导入TSK任务模块
       TSK任务模块是操作系统中最基本的模块,其实际上反映了多线程抢占,每个任务单独是一个线程,各个线程(任务)具有各自的优先级
       (1)新建任务,首先选择Use TSK,确定TSK模拟是否导入

       然后创建新任务New Task

       这里我们创建两个任务task0、task1,分别对应其函数func_tsk0、func_tsk1。其优先级都为1

       (2)编写任务函数

       a). 这里我们在主函数中BIOS_start()函数,说明任务开始执行了
       b). 任务执行完后调用BIOS_exit(0)退出
       c). Task_yield()是个优先级调度函数,其作用就是如果有相同优先级的任务,则调度到同优先级的其它任务执行!
       d). Log_info1()的作用是打印日志信息
       e). while和count循环的目标是让任务执行较长的时间,而不是只执行一次就退出了。
       f). 最后别忘了在增加相关头文件和函数的声明!

       (3)编译调试,运行查看结果(这里我们只需要选择单核运行就可以了)
       从下面的分析,我们可以看到两个任务是相互依次运行的,每个任务运行一次后,其优先级就会降低,此时就切换到下一个任务


五、在项目中导入Swi软件中断模块
       前面我们已经知道了不同任务有不同优先级,而软件中断具有比任何任务都高的优先级,而其中硬件中断(HWI)又比软件中断(SWI)优先级更高。
       (1)添加软件中断Swi,这里方法同前面添加TSK的方法不一样,似乎不能用图形界面方式去添加(我没有成功=_=||)
       这里我选择通过直接在源代码中添加相关代码:
       a). 首先需要添加一个全局的Swi句柄: Swi_Handle swi0;
       b). 初始化Swi参数:
           Swi_Params swiParams;        
            Swi_Params_init(&swiParams);
            swiParams.priority = 2;        // 软件中断的优先级
            swiParams.trigger = 2;         // 软件中断的计数器
       c). 创建软件中断:
           swi0 = Swi_create(func_swi0, &swiParams, NULL);  // swi0是中断名,func_swi0是中断函数
       d). 编写中断函数:
               void func_swi0(void)
               {
                    static Int count = 0;
                    Log_info1("Swi0 is doing %d\n",count);
                    count++;
               }
       e). 更改软件中断计数器trigger,要触发软件中断,首先需要让trigger的计数为0,这里我们可以在任务函数内增加一个trigger自减的函数,任务函数执行两次后,将会触发软件中断。
       void func_tsk0(void)
       {
            Int count = 0;
            while(count<10){
                Log_info1("Task0 is doing %d\n",count);
                Swi_dec(swi0);
                Task_yield();
                count++;
            }
            BIOS_exit(0);
       }
       (2)一些Swi APIs 函数
       Swi_inc Swi.trigger自增函数,每次增加1
       Swi_dec Swi.trigger自减函数,每次减少1
       Swi_or 将trigger的值与模板求或操作
       Swi_and 将trigger的值与模板求和操作
       (3)编译调试,运行查看结果(这里我们只需要选择单核运行就可以了)
       从下面的分析,我们可以看到两个任务的每次都会使得软件中断计数 trigger 减1(通过 Swi_dec函数),直到trigger的值减少到0时,执行软件中断,中断后,trigger恢复到原来的值,这里的trigger初始值为2,所以执行两次任务后就会触发一次软件中断


六、在项目中导入信号量Semaphore模块
       信号量是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用,对于多个任务来说,使用信号量可以防止多个任务同时执行。
       信号量可分互斥信号量和计数信号量,互斥信号量只有两种状态:1和0,为1时说明可用,否则不可用。而计数信号量通过设置一个计数值,如果计数值大于0,则任务请求该信号量时是可用。
       这里例子是我们给task0任务中增加一个互斥信号量,当信号量状态为1时,task0才能继续执行。通过软件中断来达到信号量归1。
       (1)添加信号量
              a). 首先需要添加一个全局的信号量句柄: Semaphore_Handle sem0;
              b). 创建信号量: sem0 = Semaphore_create(0, NULL, NULL);
              c). 在增加互斥信号量的任务函数中增加一个等待信号量为1的函数
                       Semaphore_pend(sem0, BIOS_WAIT_FOREVER);  // BIOS_WAIT_FOREVER表示一直等待,直到信号量为1
               d). 在软件中断函数中增加一个解锁信号量的函数
                       Semaphore_post(sem0);
               e). 最后别忘了添加Semaphore模块的头文件
                       #include <ti/sysbios/knl/Semaphore.h>
               f). 如果.cfg文件中没有添加信号量模块,记得一定要添加,否则虽然不会报错,但信号量不会工作
       (2)编译调试,运行查看结果(这里我们只需要选择单核运行就可以了)
       从下面的分析,我们可以看到只有当软件中断执行后,此时信号量才解锁,task0才能执行,而任务执行两次,才能触发一次软件中断。


七、在项目中导入时钟Clock模块
       Clocks模块主要提供周期性执行函数,我们这里新建一个周期性执行函数,其每四个周期执行一次。
       (1)添加信号量
               a). 首先初始化时钟参数:
                    Clock_Params clkParams;
                   Clock_Params_init(&clkParams);
                     clkParams.period = 5; // 函数执行周期
                   clkParams.startFlag = TRUE; // True说明时钟立即开始计时
              b). 创建时钟: Clock_create(func_clk, 5, &clkParams, NULL); //创建时钟,func_clk是周期执行的函数,这里5是开始执行的延时。
              c).  编写周期执行的时钟函数
                      void func_clk(UArg arg0)
                      {
                          UInt32 time;
                          time = Clock_getTicks(); // 这里是定时器的节拍器
                          System_printf("System time in clk0Fxn = %lu\n", (ULong)time);
                          if(time>20)
                               BIOS_exit(0);
                      }
                d). 因为任务的执行时间非常快,所以需要先把任务内的退出BIOS命令先删除下,否则当任务完成后,时钟函数还没执行
                      void func_tsk1(void)
                      {
                          Int count = 0;
                          while(1){
                           //while(count<10){
                               Log_info1("Task1 is doing %d\n",count);
                               Swi_dec(swi0);
                               Task_yield();
                              count++;
                           }
                           //BIOS_exit(0);
                      }
              e). 最后别忘了添加时钟模块的头文件
              #include <ti/sysbios/knl/Clock.h>
              f). 如果.cfg文件中没有添加时钟Clock模块,记得一定要添加,否则虽然不会报错,但时钟模块不会工作
       (2) 编译调试,运行查看结果(这里我们只需要选择单核运行就可以了)
       从下面的分析,我们可以看到只有当周期函数func_clk每隔5个周期开始执行,开始执行时间为5。


项目代码下载:

附录:关于SYS/BIOS的官方视频学习资料
  • 23
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
随着红外成像技术的快速发展,红外告警信息处理系统中需要实时处理的数据量 及处理的复杂度急剧增大,传统的基于单核 DSP 的系统难以满足数据处理实时性的 需求,基于多核 DSP 的红外告警信息处理系统的研制成为红外成像应用领域中的一 项研究热点。本文针对红外告警信息处理系统的应用需求,对 TMS320C6678 多核 DSP 在红外告警信息处理系统中的软硬件应用设计展开了相应的研究。文章的研究工 作如下。 本文分析红外告警信息处理系统对于数据采集、处理和输出的需求,确定了多核 DSP+FPGA 的系统硬件设计结构。然后按照功能将系统硬件分为电源、时钟、存储、 通信、调试和图像输入输出子模块,根据接口形式、通信协议、输入输出(I/O)电 压、时钟频率以及总体功耗选择合适的器件,参考器件手册完成了基于多核 DSP 的 红外告警信息处理系统的硬件设计。 基于嵌入式实时操作系统 SYS/BIOS 和核间通信(IPC)软件组件,本文在多核 DSP 上并行实现了一种红外弱小目标检测算法,文章先对算法的数据处理任务进行分 割,并将分割后的任务模块分配到不同的 DSP 核上,然后为不同 DSP 核设计程序, 以处理分配到的任务并实现核间通信和同步,同时解决了缓存一致性的问题。文章也 将相同的算法移植到了单个 DSP 核上,对比分析多核并行和单核串行执行相同任务 的时间特性,提出了多核并行程序的设计原则。 为了使系统硬件在上电之后即可自动加载并执行应用程序,本文将 CCS 输出的 多个 DSP 核的可执行文件制作成可以被 ROM 引导加载器(RBL)识别的一个引导镜 像,并烧写到非易失性存储器中,实现了多核 DSP 通过 SPI 接口引导的方案。 本文研究设计了基于多核 DSP 的红外告警信息处理系统硬件电路,实现了系统 中多核 DSP 的引导并改进了引导镜像的制作流程,同时基于 SYS/BIOS 和 IPC 软件 组件在多核 DSP 上并行实现了一种红外弱小目标检测算法,通过多核并行加快了算 法的执行速度,提升了红外告警信息处理系统的数据处理实时性。
### 回答1: tms320c66x keystone架构多核dsp入门实例精解.pdf 是一本介绍基于TMS320C66x Keystone架构的多核DSP编程的实践性指南。本书分为四章,每一章都包含了多个实例,逐步深入讲解多核DSP编程的基本概念和实践技巧。 第一章主要介绍Keystone架构的基本特点、硬件资源和多核编程的优势。第二章从单核到多核的转变上做了深入讲解,并且结合实例从基本的多核并行编程开始介绍了TMS320C66x Keystone架构下的Event Manager、Message Manager、Mailbox和RM的使用方法。 第三章介绍了DSP封装的基本操作和解封装方法,同时讲解了运用RTDX技术实现多核DSP互相通讯的方法。第四章讲解了多核DSP异构计算的优越性和实践技巧。通过实例,讲解了提升DSP并行度的四种方法:分割、工作流分配、部署和确定性和非确定性计算。 总体来说,该书是一本聚焦于TMS320C66x Keystone架构下多核DSP编程实践的入门指南和工具手册。需要注意的是,该书对读者在DSP编程方面的基础知识要求较高,建议具备一定的DSP编程经验再进行阅读。 ### 回答2: 《TMS320C66x Keystone架构多核DSP入门实例精解》是一本介绍Keystone架构多核DSP入门教材,主要涵盖了Keystone架构、TMS320C66x、多核处理、DSP算法开发、实时系统开发等内容。 Keystone架构是一种高性能、低功耗、灵活可扩展的DSP架构,在嵌入式应用领域得到广泛应用。TMS320C66x是Keystone架构的一种实现,具有高达1.2Tops的处理能力和丰富的片上外设资源。多核处理是Keystone架构的重要特性之一,可以有效提高系统的性能和可靠性。 本书以DSP算法开发为主线,详细介绍了TMS320C66x的架构、资源配置、多核编程、DSP算法开发等方面的内容。同时,还介绍了实时系统开发和性能优化等关键问题,为读者提供了一系列实践案例和经验总结。 本书适合从事嵌入式系统开发、DSP算法开发和实时系统开发等领域的工程师、学生和研究人员阅读。无论是初学者还是有一定经验的开发者,都可以从本书中获得有用的知识和实践经验,提高开发效率和系统性能。 ### 回答3: 《TMS320C66x Keystone架构多核DSP入门实例精解》是一本介绍Texas Instruments公司TMS320C66x系列多核数字信号处理器的入门教材和实例精解。本书深入浅出地介绍了DSP的体系结构、系统架构、并行编程方法和实现技术等方面的知识,实例详尽而丰富,既全面系统地介绍了该系列DSP的基本概念和特性,又能够从实践出发,提供丰富的应用案例和技术经验。 全书分为十二章,从DSP基础知识讲起,逐渐深入介绍了Keystone系列多核DSP的设计、接口和编程方法等方面的内容。每一章的末尾都有实验项目,让读者听取学到的知识进行实践,深入了解多核DSP的特点和应用。 该书的优点在于深入浅出,易于理解。同时,该书的实例很丰富,从任务调度、矩阵乘法、FFT算法、卷积编码等实例都贴近实际,体现了多核DSP的应用价值。该书对于学习多核DSP的学生、工程师、技术人员都是很好的参考材料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值