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

2023-11-06

  原创文章

转载请注册来源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的官方视频学习资料
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • AM4379 关于CCS下无法正常加载程序

    最近调试4379的时候发现了个问题 xff0c 这里记录下 将boot set设置为全1模式下 xff0c 然后加载程序 xff0c 发现加载是可以正常加载 xff0c 但是运行图标是灰色的 xff08 如图 xff09 xff0c 然后我
  • 使用CCS移植FreeRTOS至TM4C123系列

    使用新建好的工程 xff0c 见上一篇博文 xff1a 使用CCS给TM4C123系列MCU新建工程 第一步 xff1a 在自己的工程下新建一个FreeRTOS文件夹 xff0c 在这个文件夹下新建两个文件夹 xff1a src和port
  • STM32F103 KEIL 标准库直接添加DSP库

    前言 近期由于比赛需要 xff0c 想要在STM32上移植DSP库进行FFT变换 xff0c 找了很多资料都是利用CUBEMX进行导入的方法 xff0c 本人使用的是标准库 xff0c 对HAL库并不熟悉 xff0c 所以考虑到移植的方便采
  • DSP芯片的定点运算

    本文排版不恰当 xff0c 请到新浪爱问下载本文的pdf版 xff0c 豪猪哥 DSP芯片的定点运算1 0 第3章 DSP芯片的定点运算 3 1 数 的定 标 在定点DSP芯片中 xff0c 采用定点数进行数值运算 xff0c 其操作数一般
  • DSP的PWM

    PRD 周期寄存器 xff0c 决定了PWM的周期 频率 CMP 比较寄存器 xff0c 决定了PWM的占空比 CRT 计数寄存器 PWM原理图 为什么需要PWM
  • DSP:TMS320C6657 之 UART波特率问题

    6657 设置串口波特率 以614400为例 xff08 1 xff09 根据公式计算分频系数 xff08 2 xff09 1GHz 主频下 UART 输入频率 166666666Hz xff08 1 6 xff09 xff08 3 xff
  • DSP数据安全平台

    数据安全平台 xff08 DSP xff0c Data Security Platforms xff09 的概念来源于Gartner的 2021数据安全技术成熟度曲线 xff0c DSP定义为以数据安全为中心的产品和服务 xff0c 旨在跨
  • DSP CCS 12.00运用, 产生正弦波的图像 芯片:F28335

    1 首先建立新的项目 工程 2 参数选择 3 设置数据 保证与芯片得连接 4 整理思路 信号频率 1000 HZ 采样频率 20000 HZ 采样点数 128 5 代码 头文件的定义 include stdio h include math
  • PFQ,适用于多核处理器系统中的网络监控框架

    PFQ 是一个支持多语言的网络框架 主要用于 Linux 操作系统下进行高效的包捕获和传输 适用于多核处理器系统中的网络监控框架 PFQ 专门为多核处理器而优化 包括对多个硬件队列的网络设备优化 支持任意网络设备驱动 并提供一个脚本用来加速
  • DSP-滤波器稳定性与极点 &数字滤波器&TMS320C67XX dsp启动过程

    DSP技术 https www cnblogs com kanite category 1318278 html 滤波器稳定性与极点 在数字信号处理种 系统的稳定性是一个很重要的问题 比如说在滤波器的设计种 都要求系统必须稳定 否则是无法实
  • TI DSP TMS320C66x学习笔记之VLIB测试数据(三)

    VLIB是TI提供的针对C6x优化过的视觉库 下载地址 http software dl ti com libs vlib latest index FDS html 提供40多个核心函数 主要实现以下功能 Background Model
  • (多核DSP快速入门)5.SYS/BIOS的使用实例分析

    原创文章 转载请注册来源http blog csdn net tostq 系列教程目录 http blog csdn net tostq article details 51245979 SYS BIOS是一个可扩展的实时内核 或者说是操作
  • 【转】DSP 缓存机制

    本文主要以DSP讲解cache原理 但原理与CPU是相通的 故转载 原文地址 https blog csdn net qq 39376747 article details 112794096 文章目录 DSP 缓存机制 1 Cache基础
  • 深入理解采样定理 + Matlab 仿真 Sa 函数的采样与恢复

    建议配合国宝老师的视频食用 信号与线性系统分析 吴大正 郭宝龙 文章目录 1 采样的说明 1 为什么要取样 2 什么是取样 2 采样定理 1 为什么要有奈奎斯特频率 2 什么是采样定理 3 信号的恢复 4 Matlab的Sa函数取样仿真 1
  • 标准单元库---NLDM/CCS library model

    Timing Model 数字芯片设计 除了全定制设计外 绝大部分都是基于std cell的半定制设计 那么std cell的模型就极为重要 尤其半定制 需要把一个std cell看成block box 只考虑其input output p
  • CCS8.0和XDS100V3仿真器连接目标板失败的解决办法

    对于新手 要想顺利的连接上目标板不是一个容易的事 所以我这里记录一下我这个新手为了连接目标板的折腾过程 我的开发平台 WIN10系统CCS8 0 目标板芯片 TMS320VC5509A 仿真器 研旭XDS100V3 已确定的前提条件 CCS
  • 利用DSP实现ADC采集数据以及DAC输出

    1 解决方案 必要的公式 文字等 在课外实验中 我们选择利用ADC对输入的信号进行采集 然后利用串口控制DAC的输出 实现通过串口控制DAC输出采集到的波形的功能 在本实验中 是通过判断串口发送的数据来实现对相应DAC的控制的 为了方便 我
  • 如何在DSP CCS开发环境中添加VLIB图像处理的库

    CCS Version 5 5 0 00077 VLIB VLIB Function Reference Release 3 3 2 0
  • [培训-DSP快速入门-8]:C54x DSP汇编语言之寻址方式

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119023151 目录 第1章
  • 纯国产DSP,QX320F28335,自研内核指令集,主频150MHz,自研工具链,硬件兼容TMS320F28335

    32位单核CPU 主频150MHz flash 1M SRAM 500KB 单精度浮点运算FPU 3个4M精度12位的ADC 12个ePWM 6个HRPWM 150ps

随机推荐

  • openwrt中samba及ftp服务器设置

    1 挂载点设置 U盘或硬盘格式化为exfat或ext4 挂载点自定义为 mnt sda1 并记得勾 上启用挂载项 2 samba设置 3 ftp设置 新手折腾很久 只会最简单的设置 还没完全搞明白但能用root登录使用了 但自定义用户和匿名
  • Linux下Qt程序运行时找不到so的解决办法

    一 全局性设置 将so放入相应的系统lib目录 修改环境变量 在环境变量中添加so所在路径 修改一些文件 在其中指定so所在路径 大概有上面的这3种方式 就不详细说了 相信大家都清楚 二 指定编译选项 上面介绍的方式 无一例外 都需要修改环
  • vulnhub-lampiao

    lampiao 1 信息收集 nmap p 192 168 14 189 dirb http 192 168 14 189 1898 X txt php 发现更新日志文件CHANGLOG txt 访问更新日志文件CHANGELOG txt
  • iOS 15 适配踩坑:NavigationBar、UITabBar失效问题

    苹果前两天推出了iOS 15 秋天都等不及 相关链接 ios 15 0 适配问题 NavigationBar和UITabBar失效问题 Xcode 13 beta版 iOS 15 beta 3的系统 除了客户提出的问题 自己还发现了两处UI
  • python常用的类间关系

    1 类之间的关系 1 1 定义 1 2 例子 2 定义可访问性 2 1 定义 2 2 例子 附录 1 类之间的关系 1 1 定义 简单的说 类和类之间的关系有三种 is a has a和use a关系 is a关系也叫继承或泛化 比如学生和
  • 《软件测试的艺术》第七章 可用性(或用户体验)测试

    软件测试的艺术 第七章 可用性 或用户体验 测试 7 0 前言 7 1 可用性测试基本要素 7 2 可用性测试流程 7 2 1 测试用户的选择 7 2 2 需要多少用户进行测试 7 2 3 数据采集方法 7 2 4 可用性调查问卷 7 2
  • 网页使用jssdk微信分享报错

    网页使用jssdk微信分享报错 显示找不到文件 jssdk php文件如下
  • 判断字符串是否以 endStr 为结尾

    String prototype endWith function endStr 判断字符串以 endStr 为结尾 let d this length endStr length return d gt 0 this lastIndexO
  • ubuntu16.04 从源码编译安装caffe(纯CPU版)

    需要做caffe在嵌入式的移植 决定先在X86上理清所有依赖包关系 再做交叉编译 由于目的是用在嵌入式 暂不支持GPU 1 boost 官网 http www boost org Caffe 中主要使用了Boost 的智能指针 新版v1 6
  • python中的字典(Dictionary)

    python中的字典 Dictionary 在Python中 字典 Dictionary 是一种键 值对的无序集合 用于存储和查找具有唯一键的元素 字典提供了一个高效的方式来根据键访问和操作值 特点 字典是无序的 其中的元素没有固定的顺序
  • 51单片机入门——单片机最小系统

    单片机最小系统 1 什么是最小系统 2 最小系统的三要素 2 1 电源 2 2 晶振 2 3 复位电路 2 3 1 外部RST引脚复位 2 3 2 软件复位 2 3 3 上电复位 掉电复位 2 3 4 看门狗复位 2 3 5 冷启动复位和热
  • 从小学开始学机器人编程教育的好处

    不过对于绝大多数孩子来说 情况也许并不是这样 他们学习机器人编程并非一定要成为程序员 更不一定要为将来创业做准备 但是他们同样能从编程学习中获益 获得多方面的思维训练 格物斯坦表示 通过学习编程 除了通常被提及的一些如促进学科知识学习 了解
  • C语言经典100例题(46)--宏#define命令练习(1)

    目录 题目 问题分析 代码 运行结果 题目 宏 define命令练习 1 问题分析 define是宏定义 程序在预处理阶段将用define定义的内容进行了 替换 因此在程序运行时 常量表中并没有用define定义的常量 系统不为它分配内存
  • Navicat 无法连接 MySQL 怎么办?

    本文背景 Navicat 是图形化操作 MySQL 的强大工具 但是当数据库的服务器没有开放 3306 端口给办公网络时 在办公网使用 navicat 连接数据库是连不上的 要操作数据库 只能先 ssh 登陆到数据库服务器 然后在黑屏敲命令
  • 修改网站在浏览器上方显示的logo

    1 准备好要显示的图片 通过百度 ico在线制作 转换成为ico的格式 放在对应的位置中 2 在html的head中添加 3 href是ico的位置 4 刷新页面 清除缓存即可
  • OPC通讯的安全防护

    http www dqjsw com cn dianqi OPC 111931 html OPC通讯的安全防护 OPC 用于过程控制的OLE 被广泛应用在控制系统中 用于提供不同供应商的设备和软件之间的互操作性 最新版本的OPC OPC U
  • 所有项目-环境-教程-链接地址汇总

    一 项目相关 1 项目清单 不定期更新 myDemo源码汇总 qq com 5 成品视频展示网站 https space bilibili com 397822494 因为有部分视频因为部分问题 无法上传 可直接添加作者索要演示视频 2 环
  • 一篇小孩子都能看懂的 ChatGPT 原理解析

    本文作者小宝 85 后程序员 现在蚂蚁金服从事后端架构 爱读书 爱编码 过去半年 随着 ChatGPT 的大火 大模型已经成为一种新的社交货币 现在见面都不是问 天气怎么样 而是你用 ChatGPT 了么 国内各大巨头也纷纷下场 制作自己的
  • Oulipo 【POJ - 3461】【双值哈希】

    题目链接 题意 给你两个字符串 前一个是小字符串 后一个是大的字符串 问你 大的字符串中有几组可以与小的字符串相等的子字符串 此题其实不用双值哈希好像也可以的 但为了确保A就敲了个双值哈希 我们想把字符串的形式用数的值来表示 那么 我们可以
  • (多核DSP快速入门)5.SYS/BIOS的使用实例分析

    原创文章 转载请注册来源http blog csdn net tostq 系列教程目录 http blog csdn net tostq article details 51245979 SYS BIOS是一个可扩展的实时内核 或者说是操作