CCS中DSPBIOS工具的使用.docx
- 文档编号:505584
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:29
- 大小:1.12MB
CCS中DSPBIOS工具的使用.docx
《CCS中DSPBIOS工具的使用.docx》由会员分享,可在线阅读,更多相关《CCS中DSPBIOS工具的使用.docx(29页珍藏版)》请在冰点文库上搜索。
CCS中DSPBIOS工具的使用
学号成绩
《DSP技术》课程论文
题目CCS中DSP/BIOS工具的使用
作者班级_
院别专业_
完成时间
一、DSP/BIOS简介……………………………………………………………………1
二、DSP/BIOS的组件构成……………………………………………………………1
三、DSP/BIOS的启动顺序……………………………………………………………2
四、DSP/BIOS的配置…………………………………………………………………2
五、基础类的DSP/BIOSAPI调用……………………………………………………15
六、DSP\BIOS的中断、优先级………………………………………………………22
七、参考文献…………………………………………………………………………23
摘要:
DSP/BIOS的静态配置是利用CCS提供的配置工具完成,包括图形化配置工具和文本配置工具。
图形化工具层次清晰,比较直观,而文本工具更加灵活。
一、DSP/BIOS简介
DSP/BIOS是CCS中集成的一个简易的嵌入式实时操作系统,能够大大方便用户编写多任务应用程序。
DSP/BIOS拥有很多实时嵌入式操作系统的功能,如任务的调度,任务间的同步和通信,内存管理,实时时钟管理,中断服务管理等。
有了它,用户可以编写复杂的多线程程序,并且会占用更少的CPU和内存资源。
DSP/BIOS是一个可用于实时调度、同步,主机和目标机通信,以及实时分析系统上的一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析和配置工具等。
同时提供标准的API接口,易于使用。
它是TI的eXpressDSP实时软件技术的的一个关键部分。
二、DSP/BIOS的组件构成
DSP/BIOS在一个主机/目标机环境中的组件分布如下所示:
ØDSP/BIOSAPI:
编写的程序可以调用API接口函数;
ØDSP/BIOS配置:
创建的配置文件定义了程序使用的静态BIOS对象;
ØDSP/BIOS分析工具:
集成在CCS上的一些BIOS分析工具可以对运行与目标设备上的程序进行监测,包括CPU负载、时间、日志、线程执行状态等。
DSP/BIOS分为很多模块,提供的所有API函数都按照模块分类,以模块名加下划线开头来命名,如图 40所示为DSP/BIOS的全部模块。
图 40
三、DSP/BIOS的启动顺序
当DSP/BIOS的应用程序启动时,一般遵循下面的步骤:
(一)初始化DSP:
DSP/BIOS程序从C/C++环境入口c_int00开始运行。
对于C6000平台,在c_int00开始处,系统栈指针(B15)和全局页指针(B14)被分别设置在堆栈断的末尾和.bss断的开始。
控制寄存器AMR、IER、CSR等被初始化;
(二)初始化.bss段:
当堆栈被设置完成后,初始化任务被调用,利用.cinit的记录对.bss断的变量进行初始化;
(三)调用BIOS_init初始化用到的各个模块:
BIOS_init调用MOD_init对配置用到的各个模块进行初始化,包括HWI_init、HST_init、IDL_init等;
(四)处理.pinit表:
.pinit表包含一些指向初始化函数的指针,对C++程序,全局对象类的创建也在此时完成;
(五)调用用户程序的main函数:
用户main函数可以是C/C++函数或者汇编语言函数,对于汇编函数,使用_main的函数名。
由于此时的硬件、软件中断还没有被使能,所以在用户主函数的初始化中需要注意,可以使能单独的中断屏蔽位,但是不能调用类似HWI_enable的接口来使能全局中断;
(六)调用BIOS_start启动DSP/BIOS:
BIOS_start在用户main函数退出后被调用,它负责使能使用的各个模块并调用MOD_startup启动每个模块。
包括CLK_startup、PIP_startup、SWI_startup、HWI_startup等。
当TSK管理模块在配置中被使用时,TSK_startup被执行,并且BIOS_start将不会结束返回;
(七)执行idle循环:
有两种方式进入idle循环。
当TSK管理模块使能时,任务调度器运行的TSK_idle任务调用IDL_loop在其它任务空闲时进入idle循环;当TSK模块未被使用时,BIOS_start调用将返回,并执行IDL_loop进入永久的idle循环,此时硬件和软件中断可以抢占idle循环得到执行。
由于idle循环中管理和主机的通信,因此主机和目标机之间的数据交互可以进行了。
四、DSP/BIOS的配置
DSP/BIOS的静态配置是利用CCS提供的配置工具完成,包括图形化配置工具和文本配置工具。
图形化工具层次清晰,比较直观,而文本工具更加灵活。
通常使用图形化的配置方法,下面对主要的模块配置做一些介绍。
(一)GlobalSettingProperties
右键点击“GlobalSettings”,点击“What’sThis”,会弹出帮助窗口,该文件中有GlobalSettingProperties的各项设置说明。
下面介绍的其他如MEM、LOG等配置都可以用同样的方法得到相应的帮助。
选择弹出菜单中的“Properties”,如图 41所示。
图 41
弹出如图 42所示对话框:
图 42
一般选择默认设置即可,CLKOUT项需要根据DSP硬件单板提供的工作时钟设置,Himalaya通常运行在1GHz频率。
DSPEndianMode 项根据实际情况设置。
(二)MEM设置
MEM模块设置中可以根据具体情况设置不同的内存段,其中存在一个默认的IRAM片内内存段。
需要注意的是,首先必须在IRAM段上设置一个heap段落,用于BIOS的内部使用。
设置方法是在IRAM段上右键选择“Properties”,弹出如图 43对话框,必须设置红线框中的选项,heapsize可根据情况具体设置。
图 43
接下来配置MEM全局属性,右键点击配置窗口中的“MEM…”,如图 44所示:
图 44
点击“Properties”,弹出如图 45所示窗口:
图 45
如图红线框中,两个heap段都要选择为IRAM,“StackSize”项需要根据实际情况设置最大的栈大小,其他使用缺省设置即可。
在图 44的菜单中,点击“InsertMEM”可创建新的内存段。
在新的内存段名上右键选择“Properties”弹出如图 43窗口,根据情况设置base(基地址)、len(段长度)、heapsize(用于MEM动态内存分配的堆大小)。
(三)LOG设置
LOG用于输出和记录一些打印信息,默认存在一个LOG_system对象,是系统内部用来处理打印信息的,不需要去设置。
可以增加新的LOG对象,用来在应用程序中输出打印信息。
如图 46,在LOG标签上右键选择“InsertLOG”,填写对象名LOG_test即建立了一个新的LOG对象。
图 46
在LOG_test标签上右键选择“Properties”,弹出如图 47窗口,可对此LOG对象属性作一些设置。
具体设置含义可通过Help查看。
图 47
(四) CLK设置
在CLK属性中通常选择定时器Timer0作为DSP/BIOS的基准时钟,计时分辩率设置为每秒1000次中断,在1GHz系统时钟下,近似为每次定时中断间隔999.996微秒。
TimerMode选择为32bitunchained模式,即使用TCI6482的TMR0的TIMLO作为Timer0,而TIMHI还可以作其它用途使用。
CLK属性配置界面如图 48所示:
图 48
(五)HWI设置
HWI(硬中断)中包含HWI_INT4到HWI_INT15可用来定义用户自己的硬件中断,HWI_RESET、HWI_NMI和HWI_RESERVED不要去改动。
如图 49,每个硬HWI的优先级从上到下逐渐降低。
图 49
选择HWI_INT10为例,来设置EMAC/MDIO的中断,需要填写中断事件号17,并且填写中断服务程序名(C函数前面需要加下划线)如图50所示:
图 50
在Dispatcher页面,选择“UseDispatcher”由BIOS代理控制中断的确认和清除,不需要用户中断服务程序干预,比较简便。
如图51:
图 51
(六)SWI设置
SWI(软中断)的优先级在HWI之后,但是比TSK高,可以通过右键菜单中的“InsertSWI”创建一个SWI对象,可以指定SWI内部优先级,从0(最低)到14(最高)。
如图 52:
图 52
(七)TSK设置
在TSKManager(任务管理器)中可以根据需要创建各种任务,任务间是根据优先级抢占策略来进行调度的,TSK提供有多种优先级别,包括-1(Suspend)、0(Idle)、1(最低)到15(最高)。
如图 53:
图 53
在TSKManager上右键选择“InsertTSK”并填写任务名称后就可以创建一个任务,在相应任务上右键选择“Properties”可对任务属性进行设置,如图 54:
图 54
StackSize(最大堆栈大小)和Priority(优先级)需要根据任务的具体情况进行设置。
在页面,填写任务实体函数名(C函数前面加一个下划线),如图 55:
图 55
(八)Synchronization设置
DSP/BIOS中任务间的通信和同步可由SEM、MBX、QUE、LCK四个模块完成:
ØSEM(信号量):
用于任务同步和互斥,有计数功能,根据需要使用;
ØMBX(邮箱):
也用于任务同步,可以传递少量数据,根据需要使用;
ØQUE(队列):
可实现任务同步和资源的共享,根据需要使用;
ØLCK(资源锁):
实现对共享资源的互斥,根据需要使用。
四种同步模块对象都可以通过各自的右键菜单中“Insert…”来创建,并可对其属性作相应的设置。
如图 56所示:
图 56
(九)Input/Output设置
这里可以设置一些输入/输出相关的高级设置,具体可通过CCS的帮助项来了解。
一般不需要进行设置。
只有RTDX(实时数据交换),需要根据目标环境的情况对数据交换模式进行一下选择,用来在调试中主机和目标机进行数据交换。
可以是仿真器环境的JTAG模式,或者是模拟器环境的Simulator模式。
如图 57所示:
五、基础类的DSP/BIOSAPI调用
(一)时钟管理CLK
1.Unsncounts =CLK_countspms(void)
返回每毫秒的定时器高分辨率时钟的计数值
2.LgUnscurrtime=CLK_gethtime(void)
返回高分辨率时钟的计数值超过32bit归零
高分辨率时钟是DSP时钟除以(TDDR+1)
3.LgUnscurrtime=CLK_getltime(void)
返回低分辨率时钟的计数值超过32bit归零
高分辨率时钟是DSP时钟除以(TDDR+1)再除以(PRD+1)
4.Unsperiod =CLK_getprd(void)
返回CLK管理器周期寄存器的值
(二)周期函数PRD
1.LgUnsnum =PRD_getticks(void)
返回32位周期函数管理计数值
2.voidPRD_start(PRD_Obj*period)
启动PRD模块计数器,一般地,mode=one-shot
3.voidPRD_stop(PRD_Obj*period)
关闭PRD模块计数器
4.voidPRD_tick(void)
对周期模块的计数器加1,以便周期模块管理器确定哪个周期性函数得以运行
(三)软件中断管理SWI
1.voidSWI_andn(SWI_Obj*swi,Unsmask) mask屏蔽字参数
将邮箱值与mask做与运算,并用结果代替以前的邮箱值,若为0,启动软件中断,恢复邮箱初始值
2.voidSWI_andn(SWI_Obj*swi)
将邮箱值减1,并用结果代替以前的邮箱值,若为0,启动软件中断,恢复邮箱初始值
3.voidSWI_disable(Void)
禁止软件中断
4.voidSWI_enable(Void)
使能软件中断
5.Unsnum=SWI_getmbox(void)
返回当前SWI对象在被执行的邮箱值,若中断已经开始执行,DSP/BIOS会先保存此值
6.Unskey=SWI_getpri(SWI_Obj*swi)
返回指定的SWI对象的优先级
7.voidSWI_inc(SWI_Obj*swi)
将指定的SWI对象的邮箱值加1,同时启动软件中断,就算用户调用多次,最终执行一次。
8.voidSWI_or(SWI_Obj*swi,Unsmask) mask屏蔽字参数
将启动指定的软件中断,并将此软件中断的邮箱值与mask做与运算,并用结果代替以前的邮箱值,等到中断完成之后,邮箱值恢复为初始值,一般地,调用SWI_getmbox获得触发此软件中断的邮箱值
9.voidSWI_post(SWI_Handleswi)
启动指定的SWI对象的软件中断,此函数不受邮箱值的影响,也不影响邮箱值。
一般地,周期性低启动一个软件中断,将_SWI_post填入PRD对象的函数设置栏,启动软件中断的参数写入arg0
10.Unskey=SWI_raisepri(Unsmask)
提高SWI软件中断的优先级,一般地
key=SWI_raisepri(SWI_getpri(&swi_1));
--accesssharedresouces--
SWI_restorepri(key)
11.voidSWI_restorepri(Unskey)
恢复原来的优先级
12.SWI_Obj*swi=SWI_self(void)
当前执行的SWI对象的软件中断的地址
(四)信息输出管理LOG
1.voidLOG_disable(LOG_Obj*log)
关闭指定对向的日志功能
2.voidLOG_enable(LOG_Obj*log)
开启指定对向的日志功能
3.voidLOG_error(Stringformat,Argarg0)
voidLOG_message(Stringformat,Argarg0)
前一个函数可以将一个事件、数据或出错信息按照指定的格式串写入系统日志,不受TRC跟踪管理模块的影响,后一个函数类似于前一个函数,但是受到TRC跟踪管理模块的影响
4.voidLOG_event(LOG_Obj*log,Argarg0,Argarg1,Argarg2)
将未格式化的事件消息写入日志中
5.voidLOG_printf(LOG_Obj*log,Stringformat,intarg0,intarg1)
指定的LOG窗口显示消息%d%x%o%s
6.voidLOG_reset(LOG_Obj*log)
复位日志缓冲区
(五)存储器管理MEM
1.void*addr=MEM_alloc(intsegid,Unssize,Unsalign)
指定存储段分配连续块,返回起始地址
segid=存储段的标识符或者ID号
size块大小等于多少个字
align边界条件只为0或2的幂若align为0、1则无约束
2.void*addr=MEM_calloc(segid,size,align)
分配内存并初始化为0
3.intsegid=MEM_define(Ptrbase,Unslength,MEM_Attrs*attrs)
定义一个新的存储段。
返回值为存储段的ID标号,attr参数为NULL,会按照默认参数进行配置,段的参数由结构体typeMEM_Attrs规定,此函数仅在main函数中使用
base:
新段的基地址
length:
段长度
attrs:
段属性
4.boolstatus=MEM_free(segid,addr,size)
释放申请的动态内存不能在SWI和HWI中调用,调用之前,用LCK中API查看内存块的锁定情况
5.voidMEM_redefine(segid,base,length)
重新定义一个存储段,只能在main中调用
6.boolstatus=MEM_stat(intsegid,MEM_Stat*statbuf)
segid存储段标识符
statbuf状态缓存区指针
structmem_stat{
Unssize;//存储段大小
Unsused;//已经使用的数量
Unslength;//最大连续存储块长度
同理:
若segid有效,则MEM_stat返回TRUE
不能在SWI和HWI中使用,应判断锁定情况
7.void*addr=MEM_valloc(intsegid,Unssize,Unsalign,charvalue)
先申请内存,初始化为指定的值value
(六)C6000专用模块C64x
1.Unsoldmask=C64_diableIER(Unsmask)
关闭相应的中断返回值实际屏蔽的中断
2.voidC64_enableIER(Unsoldmask)
开放相应的中断
Unsoldmask;
oldmask=C64_disableIER(0x1);//disableINT0
C64_enableIER(oldmask); //enableINT0
3.voidC64_plug(intvecid,Fxnfxn,intdmachan)
插入一个中断向量
intvecid:
中断序号
Fxnfxn:
中断服务程序的函数指针
intdmachan:
插入操作使用的DMA通道
将ISFP写到中断服务表IST中。
若IST在外部RAM,则CPU复制代替DMA,此时DMA为-1
IST在片内RAM时,使用DMA方式,是0,1,2,3用户保证在函数调用时该DMA通道有效
(七)统计模块STS
1.voidSTS_add(STS_Obj*sts,LgIntvalue)
使用我们提供的数据更新STS统计对象的Total,Count,Max等参数
传入一个32位参数,Count加1,Total累加传递的32位参数,MAX记录传递参数的最大值
2.voidSTS_delta(STA_Obj*sts,LgIntvalue)
每个对象都包含有初始值,该初始值由配置文件指定或者由STS_set函数设置
STS_delta先计算当前传递参数与先前初始值只差,然后调用STS_add更新统计累加值
一般和STS_set一起用
eg:
STS_set(&sts,CLK_gethtime());
STS_delta(&sts,CLK_gethtime());
3.voidSTS_reset(STS_Obj*sts)
复位统计对象中的累加值。
Count和Total设置为0.MAX成为最大的负值。
4.voidSTS_set(STS_Obj*sts,LgIntvalue)
监视或统计程序的执行时间
(八)统计类模块TRC
1.TRC_LOGCLK日志记录定时器中断
2.TRC_LOGPRD日志记录周期时隙和周期函数的开始
3.TRC_LOGSWI日志记录软件中断的启动和完成
4.TRC_LOGTSK日志记录任务处于准备好、开始、停止、继续执行、终止等事件
5.TRC_STSHWI收集关于HWI统计数据
6.TRC_STSPIP写管道和读管道帧进行计数
7.TRC_STSPRD执行期间CLK时隙个数的统计数据
8.TRC_STSSWISWI执行时间的统计数据
9.TRC_STSTSKTSK执行时间的统计数据从TSK准备好到调用TSKdeltatime都要收集
10.TRC_USER0ANDTRC_USER1和TRC_query一起用执行和忽略结果的设备调用
11.TRC_GBLHOST执行所有的隐藏仪器功能,此比特位能够开始或停止收集所有开启的跟踪类型
12.TRC_GBLTARG执行所有的隐藏仪器功能,此比特位只能被目标程序设置
(九)任务管理TSK任务管理模块
1.voidTSK_checkstacks(TSK_Handleoldtask,TSK_Handlenewtask)
无论是新任务还是老任务,如果堆栈的最后位置上都没有RG_STACKSTAMP标识,那么TSK_checkstacks就会
报错SYS_abort,出现这种情况可能是由于上一个任务堆栈溢出或无效的存储占用了新任务的堆栈
一般地,用TSK_checkstacks(TSK_self(),TSK_self())来检查堆栈
定义Switch函数,这样在任务切换时自动调用堆栈检查函数:
voidmyswitchfxn(TSK_Handleoldtask,TSK_Handlenewtask)
{
...
TSK_checkstacks(oldtask,newtask);
...
}
2.TSK_Handletask=TSK_create(Fxnfxn,TSK_Attrs*attr,Arg[arg,]...)
创建一个调用函数fxn的任务对象,返回新对象的句柄,失败返回NULL。
调用此函数是动态创建,而在配置工具中创建是静态创建,二者效果一样。
静态创建的任务对象,创建函数将在BIOS_start函数中自动调用。
BIOS_start函数在main函数之后,
在后台IDL循环之前运行。
而动态创建的任务处于Ready状态。
函数参数最多不超过8个。
任务对象函数fxn返回时,自动调用TSK_exit函数。
解析:
TSK_Attrs*attrs任务参数指针
structTSK_Attrs{
intpriority;
Ptrstack;
Unsstacksize;
#ifdef_64_//imitateC55series.tocheck
Unssysstacksize;
#endif
Unsstackseg;
Ptrenviron;
Stringname;
boolexitflag;
}
3.voidTSK_delete(TSK_Handletask)
从所有内部队列里面删除这个任务,并且调用MEM_free释放任务对象和堆栈。
只能删除处于
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CCS DSPBIOS 工具 使用