版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学号 成绩评语DSP技术课程论文题目CCS中 DSP/BIOS工具的使用作 者班 级 _院 别专 业 _完成时间目录一、DSP/BIOS简介1二、DSP/BIOS的组件构成1三、DSP/BIOS的启动顺序2四、DSP/BIOS的配置2五、基础类的 DSP/BIOS API 调用 15六、DSPBIOS的中断、优先级22七、参考文献 23摘要: DSP/BIOS的静态配置是利用 CCS提供的配置工具完成, 包括图形化配置工具 和文本配置工具。图形化工具层次清晰,比较直观,而文本工具更加灵活一、DSP/BIOS 简介DSP/BIOS是 CCS中集成的一个简易的嵌入式实时操作系统, 能够大大方便用户
2、编写多 任务应用程序。 DSP/BIOS拥有很多实时嵌入式操作系统的功能, 如任务的调度, 任务 间的同步和通信,内存管理,实时时钟管理,中断服务管理等。有了它,用户可以编 写复杂的多线程程序,并且会占用更少的 CPU和内存资源。DSP/BIOS是一个可用于实时调度、 同步,主机和目标机通信, 以及实时分析系统上的 一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析 和配置工具等。同时提供标准的 API接口,易于使用。它是 TI 的 eXpressDSP实时软 件技术的的一个关键部分。二、DSP/BIOS 的组件构成DSP/BIOS在一个主机 / 目标机环境中的组件分布
3、如下所示:DSP/BIOS API:编写的程序可以调用 API 接口函数; DSP/BIOS配置:创建的配置文件定义了程序使用的静态 BIOS对象; DSP/BIOS分析工具:集成在 CCS上的一些 BIOS分析工具可以对运行与目标设 备上的程序进行监测,包括 CPU负载、时间、日志、线程执行状态等。DSP/BIOS分为很多模块, 提供的所有 API 函数都按照模块分类, 以模块名加下划线开 头来命名,如图 40 所示为 DSP/BIOS的全部模块。图 40三、DSP/BIOS的启动顺序当 DSP/BIOS的应用程序启动时,一般遵循下面的步骤:(一)初始化 DSP:DSP/BIOS程序从 C/
4、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 表:.pin
5、it 表包含一些指向初始化函数的指针,对 C+程序, 全局对象类的创建也在此时完成;(五)调用用户程序的 main函数:用户 main函数可以是 C/C+函数或者汇编语 言函数,对于汇编函数,使用 _main 的函数名。由于此时的硬件、软件中断还没有被 使能,所以在用户主函数的初始化中需要注意,可以使能单独的中断屏蔽位,但是不 能调用类似 HWI_enable 的接口来使能全局中断;(六)调用 BIOS_start 启动 DSP/BIOS:BIOS_start 在用户 main 函数退出后被 调用,它负责使能 使 用的各 个 模块并 调 用 MOD_startup 启动每个模 块。包 括 CL
6、K_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 循
7、环中管理和主机 的通信,因此主机和目标机之间的数据交互可以进行了。四、DSP/BIOS的配置DSP/BIOS的静态配置是利用 CCS提供的配置工具完成, 包括图形化配置工具和文 本配置工具。图形化工具层次清晰,比较直观,而文本工具更加灵活。通常使用图形 化的配置方法,下面对主要的模块配置做一些介绍。(一)Global Setting Properties右键点击“ Global Settings ”,点击“ What's This ”,会弹出帮助窗口,该文件中有 Global Setting Properties的各项设置说明。下面介绍的其他如 MEM、 LOG等配置都可以用同样的方法
8、得到相应的帮助。选择弹出菜单中的“ Properties ”,如图 41 所示图 41弹出如图 42 所示对话框 :图 42一般选择默认设置即可,CLKOUT项需要根据 DSP 硬件单板提供的工作时钟设置,Himalaya 通常运行在 1GHz频率。DSP Endian Mode 项根据实际情况设置(二)MEM设置MEM模块设置中可以根据具体情况设置不同的内存段,其中存在一个默认的IRAM片内内存段。需要注意的是,首先必须在 IRAM段上设置一个 heap 段落,用于 BIOS 的内部使用。设置方法是在 IRAM段上右键选择“Properties ”,弹出如图 43 对话框, 必须设置红线框中
9、的选项, heap size 可根据情况具体设置。图 43接下来配置 MEM全局属性,右键点击配置窗口中的“ MEM”,如图 44 所示:图 44点击“ Properties ”,弹出如图 45 所示窗口:图 45如图红线框中,两个 heap 段都要选择为 IRAM,“Stack Size ”项需要根据实际情况设 置最大的栈大小,其他使用缺省设置即可。在图 44 的菜单中,点击“ Insert MEM”可创建新的内存段。在新的内存段名上右键 选择“ Properties ”弹出如图 43 窗口,根据情况设置 base(基地址)、 len (段长 度)、heap size (用于 MEM动态内存
10、分配的堆大小) 。(三)LOG设置LOG用于输出和记录一些打印信息, 默认存在一个 LOG_system对象, 是系统内部 用来处理打印信息的,不需要去设置。可以增加新的 LOG对象,用来在应用程序中输 出打印信息。如图 46,在 LOG标签上右键选择“Insert LOG”,填写对象名 LOG_test即建立了一个新的 LOG对象图46在 LOG_test 标签上右键选择 “ Properties ”,弹出如图 47 窗口,可对此 LOG对象属 性作一些设置。具体设置含义可通过 Help 查看。图 47四) CLK设置在 CLK属性中通常选择定时器 Timer0 作为 DSP/BIOS的基准
11、时钟,计时分辩率设 置为每秒 1000次中断,在1GHz系统时钟下,近似为每次定时中断间隔微秒。 Timer Mode 选择为 32bit unchained 模式,即使用 TCI6482的TMR0的TIMLO作为 Timer0 ,而TIMHI 还可以作其它用途使用。 CLK属性配置界面如图 48 所示:图 48(五) HWI 设置HW(I 硬中断)中包含 HWI_INT4到 HWI_INT15可用来定义用户自己的硬件中断, HWI_RESE、THWI_NM和I HWI_RESERVE不D要去改动。如图 49,每个硬 HWI的优先级 从上到下逐渐降低。图 49选择 HWI_INT10为例,来设
12、置 EMAC/MDIO的中断,需要填写中断事件号17,并且填写中断服务程序名( C函数前面需要加下划线)如图 50 所示:图 50在 Dispatcher 页面,选择“ Use Dispatcher ”由 BIOS 代理控制中断的确认和清除, 不需要用户中断服务程序干预,比较简便。如图 51:图 51(六) SWI 设置SW(I 软中断)的优先级在 HWI之后,但是比 TSK高,可以通过右键菜单中的“ InsertSWI”创建一个 SWI对象,可以指定 SWI内部优先级,从 0(最低)到 14(最高) 。如图 52:图 52(七) TSK 设置在 TSK Manager(任务管理器)中可以根据
13、需要创建各种任务,任务间是根据优 先级抢占策略来进行调度的, TSK提供有多种优先级别, 包括 -1(Suspend) 、0(Idle) 1(最低)到 15(最高) 。如图 53:图 53在 TSK Manager 上右键选择“ Insert TSK ”并填写任务名称后就可以创建一个任务, 在相应任务上右键选择“ Properties ”可对任务属性进行设置,如图54:图 54Stack Size (最大堆栈大小)和 Priority (优先级)需要根据任务的具体情况进行设 置。在页面,填写任务实体函数名( C函数前面加一个下划线) ,如图 55:图 55(八) Synchronization
14、 设置DSP/BIOS中任务间的通信和同步可由 SEM、MBX、 QUE、LCK四个模块完成:SEM(信号量):用于任务同步和互斥,有计数功能,根据需要使用; MBX(邮箱):也用于任务同步,可以传递少量数据,根据需要使用; QUE(队列):可实现任务同步和资源的共享,根据需要使用; LCK(资源锁):实现对共享资源的互斥,根据需要使用。 四种同步模块对象都可以通过各自的右键菜单中“ Insert ”来创建,并可对其属 性作相应的设置。如图 56 所示:图 56(九) Input/Output 设置这里可以设置一些输入 / 输出相关的高级设置,具体可通过 CCS的帮助项来了解 一般不需要进行设
15、置。只有 RTDX(实时数据交换),需要根据目标环境的情况对数据 交换模式进行一下选择, 用来在调试中主机和目标机进行数据交换。可以是仿真器环 境的 JTAG模式,或者是模拟器环境的 Simulator 模式。如图 57 所示:五、基础类的 DSP/BIOS API调用(一)时钟管理 CLKncounts = CLK_countspms(void)返回每毫秒的定时器高分辨率时钟的计数值currtime = CLK_gethtime(void)返回高分辨率时钟的计数值 超过 32bit 归零高分辨率时钟是 DSP时钟除以 (TDDR+1) currtime = CLK_getltime(void
16、)返回低分辨率时钟的计数值 超过 32bit 归零高分辨率时钟是 DSP时钟除以 (TDDR+1)再除以(PRD+1) period = CLK_getprd(void)返回 CLK管理器周期寄存器的值( 二 ) 周期函数 PRDnum= PRD_getticks(void)返回 32 位周期函数管理计数值PRD_start(PRD_Obj* period)启动 PRD模块计数器,一般地, mode=one-shotPRD_stop(PRD_Obj* period)关闭 PRD模块计数器PRD_tick(void) 对周期模块的计数器加 1,以便周期模块管理器确定哪个周期性函数得以运行( 三
17、) 软件中断管理 SWISWI_andn(SWI_Obj* swi, Uns mask)mask 屏蔽字参数将邮箱值与 mask做与运算,并用结果代替以前的邮箱值, 若为 0,启动软件中断, 恢复邮箱初始值SWI_andn(SWI_Obj* swi)将邮箱值减 1,并用结果代替以前的邮箱值,若为 0,启动软件中断,恢复邮箱 初始值SWI_disable(Void)禁止软件中断SWI_enable(Void)使能软件中断num = SWI_getmbox(void)返回当前 SWI对象在被执行的邮箱值, 若中断已经开始执行, DSP/BIOS会先保存 此值key = SWI_getpri(SWI
18、_Obj * swi)返回指定的 SWI对象的优先级SWI_inc(SWI_Obj * swi)将指定的 SWI对象的邮箱值加 1,同时启动软件中断,就算用户调用多次,最终 执行一次。SWI_or(SWI_Obj* swi, Uns mask) mask 屏蔽字参数 将启动指定的软件中断,并将此软件中断的邮箱值与 mask做与运算,并用结果 代替以前的邮箱值,等到中断完成之后,邮箱值恢复为初始值,一般地,调用 SWI_getmbox获得触发此软件中断的邮箱值SWI_post(SWI_Handle swi)启动指定的 SWI对象的软件中断,此函数不受邮箱值的影响,也不影响邮箱值。 一般地,周期性
19、低启动一个软件中断,将 _SWI_post 填入 PRD对象的函数设置栏,启 动软件中断的参数写入 arg0key = SWI_raisepri(Uns mask)提高 SWI软件中断的优先级,一般地key = SWI_raisepri(SWI_getpri(&swi_1);-access shared resouces-SWI_restorepri(key)SWI_restorepri(Uns key)恢复原来的优先级* swi = SWI_self(void)当前执行的 SWI对象的软件中断的地址( 四 ) 信息输出管理 LOGLOG_disable(LOG_Obj * log)关
20、闭指定对向的日志功能LOG_enable(LOG_Obj * log)开启指定对向的日志功能LOG_error(String format, Arg arg0)void LOG_message(String format, Arg arg0) 前一个函数可以将一个事件、数据或出错信息按照指定的格式串写入系统日志, 不受 TRC跟踪管理模块的影响 , 后一个函数类似于前一个函数,但是受到 TRC跟踪管 理模块的影响LOG_event(LOG_Obj * log, Arg arg0, Arg arg1, Arg arg2) 将未格式化的事件消息写入日志中LOG_printf(LOG_Obj * l
21、og, String format, int arg0, int arg1)指定的 LOG窗口显示消息 %d %x %o %s LOG_reset(LOG_Obj * log)复位日志缓冲区( 五 ) 存储器管理 MEM* addr = MEM_alloc(int segid,Uns size,Uns align) 指定存储段分配连续块,返回起始地址 segid = 存储段的标识符或者 ID 号 size 块大小 等于多少个字align 边界条件 只为 0或 2 的幂 若 align 为 0、1 则无约束* addr = MEM_calloc(segid, size, align) 分配内存并
22、初始化为 0segid = MEM_define(Ptr base, Uns length, MEM_Attrs* attrs) 定义一个新的存储段。返回值为存储段的 ID 标号 ,attr 参数为 NULL,会按照默 认参数进行配置,段的参数由结构体 type MEM_Attrs 规定,此函数仅在 main 函数中 使用base: 新段的基地址 length :段长度 attrs :段属性status = MEM_free(segid,addr,size) 释放申请的动态内存 不能在 SWI和 HWI中调用,调用之前,用 LCK中 API查看内 存块的锁定情况MEM_redefine(seg
23、id,base,length) 重新定义一个存储段,只能在 main 中调用 status = MEM_stat(int segid, MEM_Stat * statbuf) segid 存储段标识符 statbuf 状态缓存区指针struct mem_statUns size;void TSK_checkstacks(TSK_Handle oldtask,TSK_Handle newtask) 无论是新任务还是老任务,如果堆栈的最后位置上都没有 RG_STACKSTA标MP识, 那么 TSK_checkstacks 就会报错 SYS_abort,出现这种情况可能是由于上一个任务堆栈溢出或无效
24、的存储占 用了新任务的堆栈般地,用 TSK_checkstacks(TSK_self(),TSK_self() 来检查堆栈定义 Switch 函数,这样在任务切换时自动调用堆栈检查函数:void myswitchfxn(TSK_Handle oldtask, TSK_Handle newtask)TSK_checkstacks(oldtask,newtask);2. TSK_Handle task = TSK_create(Fxn fxn, TSK_Attrs * attr, Arg arg,.) 创建一个调用函数 fxn 的任务对象,返回新对象的句柄,失败返回 NULL。 调用此函数是动态创
25、建,而在配置工具中创建是静态创建,二者效果一样。 静态创建的任务对象,创建函数将在 BIOS_start 函数中自动调用。 BIOS_start 函数在 main 函数之后,在后台 IDL 循环之前运行。 而动态创建的任务处于 Ready状态。函数参数最多不 超过 8 个。任务对象函数 fxn 返回时,自动调用 TSK_exit 函数。解析: TSK_Attrs * attrs任务参数指针struct TSK_Attrsint priority;Ptr stack;Uns stacksize;#ifdef _64_ to checkUns sysstacksize;#endifUns stac
26、kseg;Ptr environ;String name;bool exitflag;3. void TSK_delete(TSK_Handle task)从所有内部队列里面删除这个任务,并且调用 MEM_free释放任务对象和堆栈。 只能删除处于结束状态的任务,也可调用删除的钩子函数。void myDeleteFxn(TSK_Handle task);4. void TSK_deltatime(TSK_Handle task) 累计从任务准备好到执行此函数时候的时间差 如果未调用此函数,那么就算打开任务统计累加器选项,统计对象也不会更新 一般地,统计时先用 TSK_settime 函数记录起
27、始点,此函数记录终点。5. void TSK_settime(TSK_Handle task) 设定统计初始值 void task()-do some startup work-TSK_settime(TSK_self);for(;)SIO_get(.);-process data-TSK_deltatime(TSK_self);假如流式 IO 没有准备好,那么该 API函数会阻塞 (Blocked) ,任务切换,一段时 间后,流式 IO 数据准备好了,此时发出 READY信号,将本任务置为 ready 状态,此时 TSK_settime 会重新记录时间。6. void TSK_disable
28、(void) 全局关闭内核调度机制, Busy-Shutting-Down 状态。只有当前任务可行, 其余所 有任务禁止。此函数不会禁止中断, 所以在中断开始前需要调用此函数保证中断发生时不会发 生任务切换。可以嵌套,但是调用几次 TSK_disable ,就得相应调用几次 TSK_enable7. void TSK_enable(void)全局开启内核调度机制8. void TSK_exit(void)终止当前任务运行。 如果所有任务都被终止, 则 DSP/BIOS会调用 SYS_exit 终止 程序。无论什么时候,任务从顶层函数返回时,都是自动调用此函数。 可以注册一个退出辅助函数 voi
29、d myExitFxn(void) 这样,在任务被设置为 TSK_TERMINATE模D式之前,会调用这个辅助函数。9. Ptr environ = TSK_getenv(TSK_Handle task)返回任务环境指针,这个指针指向一个该任务可以访问的全局属性的结构。 若程序定义多个钩子对象,那么 HOOK_getenv函数可以获取设置的环境指针。10. void TSK_setenv(TSK_Handle task, Ptr environ)设置指定任务的环境指针。若程序定义多个钩子对象, 那么 HOOK_setenv函数可以为每个钩子和任务对象的 组合体设置独立的环境指针。11. int
30、 errno = TSK_geterr(TSK_Handle task)每个任务对象都有一个包含任务错误号的存储单元。初始值为 SYS_OK12. void TSK_seterr(TSK_Handle task, int errno)改变错误号13. String name = TSK_getname(TSK_Handle task)返回任务的名字。对于静态对象来说,必须打开 Allocate Task Name on Target 对于动态对象来说, TSK_getname返回字段14. int priority = TSK_getpri(TSK_Handle task)返回优先级15. i
31、nt oldpri = TSK_setpri(TSK_Handle task, int newpri)设置优先级设置优先级对于 TSK_BLOCKE状D态任务只是优先级改变,而不会改变状态; 对于 TSK_READ状Y 态的任务而言,可能会改变运行状态。16. STS_Handle sts = TSK_getsts(TSK_Handle task)获得统计对象句柄,以便查看数据17. void TSK_sleep(Uns nticks)暂停任务的时钟个数,此时钟数可能比真实的暂停时钟少一个时钟(告警时钟)18. void TSK_itick(void)对告警时钟加 1,以便让 TSK_slee
32、p 或者 SEM_pend函数暂停执行的任务恢复到 ready 。一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪。19. void TSK_tick(void)对告警时钟加 1,以便让 TSK_sleep 或者 SEM_pend函数暂停执行的任务恢复到 ready 。一些暂停的任务可能会随着告警时钟的增加而超时,从而就绪。 可以在中断服务程序和当前任务中调用,后者在控制超时非常有用。20. Uns currtime = TSK_time(void) 返回系统告警时钟的当前值。 ( 由于延迟,只能得到一个大概的系统时钟 )21. TSK_Handle currtask = TSK_sel
33、f(void) 返回当前任务对象的句柄22. void TSK_stat(TSK_Handle task,TSK_Stat * statbuf) 返回任务的属性参数和状态信息 struct TSK_StatTSK_Attrs attrs;void TSK_yield(void) 强制任务切换,请注意,任务可以被中断, 但是,任务之间必须依靠切换来进行, 就是说,即便当前有高优先级任务就绪,它不能被执行,除非切换。 此函数用于任务之间的同步。( 十 ) 任务管理 HOOK钩子函数管理模块HOOK模块管理者一组涉及钩子函数的对象。 DSP/BIOS初始化期间, 每一个 HOOK对 象都分配了一个数字标识符。每个 HOOK模块都有一个初始化函数,该函数会在钩子函数调用前运行。在调用初 始化函数是, DSP/BIOS内核会将 HOOK对象的标识符以参数的形式传给初始化函数。HOOK对象的数据是存放在 .bss 部分中的。关于 HOOK属性的设置,对应关系如下:Initialization function: TSK_createdelete function: TSK_deleteExit function: TSK_exit另外还有 Call swit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园毕业季教育活动
- 心血管护理会议后心得分享
- 小学生森林消防安全
- 康复医学的预防
- 安全宠物:可爱背后的隐患
- 2025装饰公司装修合同书
- 2025商业合作合同范文
- 2025茶叶买卖合同的范本
- 酒店经营模式的创新之道
- 财务用户满意度调查计划
- 2025年度爱读书学长主办的读书挑战赛组织合同
- 2024年沧州经济开发区招聘社区工作者笔试真题
- 中外美术史试题及答案
- 2025年安徽省铜陵市公安局交警支队招聘交通辅警14人历年高频重点提升(共500题)附带答案详解
- 公共政策分析 课件 第8章政策评估;第9章政策监控
- 人教版八年级上学期物理期末复习(压轴60题40大考点)
- 企业环保知识培训课件
- 2024年度管理评审报告
- 暨南大学《微观经济学》2023-2024学年第一学期期末试卷
- 医药销售合规培训
- DB51-T 5038-2018 四川省地面工程施工工艺标准
评论
0/150
提交评论