- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DSP BIOS 4:线程调度( part 2 ) 4.6 信号灯(信号量) (1) 应用环境:信号灯经常用于在一组竞争的任务间协助访问共享资源。 DSP/BIOS提供了一组基于信号灯的用于任务间同步和通讯的函数。SEM模块提供了一组用于访问信号灯对象的函数。SEM对象是计数信号灯(counting semaphores),既可以实现任务同步,也可以实现互斥访问。 使用方法:计数信号灯对象有一个内部计数器,计数值对应资源的有效性,如果计数值大于0,任务在请求信号灯时不会阻塞。 4.6 信号灯(2) 创建和删除:动态创建和删除,SEM_create,SEM_delete 配置工具创建 SEM_pend:SEM_pend用于等待一个信号灯。如果信号灯计数值大于0,则SEM_pend只是简单的将计数值减1并返回。否则,SEM_pend等到另一个线程调用SEM_post触发(post)这个信号灯(即释放资源)。SEM_pend函数的超时参数允许任务等待一段时间,也可以无限等待(取值SYS_FOREVER),或不等待(取值0)。 SEM_post:给一个信号灯发信号(signal),如果有一个任务正在等待这个信号灯,SEM_post将这个任务从信号灯队列中移去,并将它放入就绪任务队列等待调度。如果没有任务等待这个信号灯,SEM_post简单地将计数值加1并返回。 4.6.1· 信号灯的例子 4.7 邮箱 应用场合:任务同步,把消息从一个任务传递给另外一个任务。 邮箱由MBX模块管理(SWI对象中的邮箱则是独立管理的) 邮箱的创建:与信号灯类似 邮箱的使用:可代替 队列+信号灯MBX_pend(mbx, msg, TIMEOUT)MBX_post(mbx, msg, TIMEOUT) 4.8 定时器、中断和系统时钟 定时器和它产生的硬件中断:一般的DSPs都有一个或多个片上定时器(timers)可以按一定的周期产生硬件中断。DSP/BIOS通常使用其中一个定时器作为系统时钟(system clock)源。 CLK模块和CLK对象:CLK模块使用片上硬件定时器可以实现接近CPU指令周期的时间分辨率。在配置工具中指定系统时钟参数,还可以添加更多的CLK对象在每次定时器中断时调用函数。 4.8 定时器、中断和系统时钟 DSP/BIOS两种计时方式(1)高、低分辨率计时 (2)系统时钟 高分辨率计时:timer的计数值 低分辨率计时:时钟中断的次数,时钟HWI中加1 系统时钟(在在配置工具中设置):默认低分辨率计时和系统时钟,系统时钟还可由其它事件驱动。系统时钟驱动PRD模块。 周期PRD函数:一到多个系统时钟计数才执行一次。 4.8.1 高精度和低精度时钟 设置:在CLK管理器的属性页中可以设置是否让DSP/BIOS使用片上定时器驱动高、低分辩计时。在C6000平台上这是不可选择的。在C54x平台上这是可选的。在C6000平台上还可以选择使用那个定时器。 时钟HWI函数CLK_F_isr 的操作:(1)低分辩计时加1 (2)在中断服务程序的上下文中依次调用每个 CLK对象的函数 CLK_getltime可以得到低分辩时间 CLK_gethtime可以得到高分辩时间 注意:CLK函数不能调用HWI_enter和HWI_exit, 因为DSP/BIOS在调用CLK_F_isr时已经内 部调用了这对函数。 4.8.2 系统时钟 概念:系统时钟是一个32位计数器,在每次调用PRD_tick函数时这个计数器加1。 系统时钟的驱动:系统时钟可以由低分辩计时驱动,也可以由外部事件驱动。 超时参数:很多DSP/BIOS函数都有一个超时参数。DSP/BIOS使用系统时钟决定超时时间是否到期。如:TSK_sleep(1000); 时钟HWI中断调用PRD_clock时钟对象的函数PRD_F_tick,PRD_F_tick会调用PRD_tick使系统时钟加1。 4.9 周期函数管理器和系统时钟 PRD管理器中可以建立对象来周期地执行函数 PRD模块的驱动:DSP/BIOS使用系统时钟驱动PRD模块 多个PRD对象:可以同时有多个PRD对象被系统时钟驱动。 PRD对象的周期:PRD对象的周期决定了函数被调用的频率,PRD对象的周期是按系统时钟计数定义的。 4.9.1 调用PRD对象的函数(1) 调用PRD_tick时执行的操作:(1)系统时钟计数器PRD_D_tick加1 (2)触发一个PRD_swi软件中断 PRD_swi的周期:各个PRD对象的周期的最大公约数且是2的幂。比如:有3个PRD对象,它们的周期分别12、24和36,那么PR
文档评论(0)