最新日志

发表于:2008-5-23 11:06:04
标签:CCS  DSP/BIOS  

0

深入DSP/BIOS的API函数 - 周期函数PRD

        在我们的应用程序中,有一部分应用程序可以根据实时时钟来确定改函数运行的时间,也有一些应用需要根据I/O是否可用或者已经计划好的事件来确定运行的时间。这时,我们可以利用DSP/BIOS提供的PRD来完成这些要求。
 
一、PRD模块概述

        PRD函数大多被用于那些需要定时执行的函数,特别是一些需要周期性地执行而其执行频率很低地函数。如:键盘等慢速I/O设备地扫描,WATCHDOG地监控等。这些简单地应用情况我们仅仅需要在创建PRD模块时说明该PRD模块执行地时间间隔即可。而有些时候,我们需要根据条件来启动周期性函数,或对一些周期性函数进行延时操作,这是就可以调用PRD_start和PRD_stop等API函数来增强PRD模块地管理。
        PRD函数实际上是由内核的PRD_swi(SWI对象)来管理的。当用户在DSP/BIOS配置工具中建立一个PRD对象后,系统内核将自动创建一个软件中断模块PRD_swi。当PRD_tick函数计数达到预设值时,内核启动PRD_swi模块,并由该模块具体确定将哪个PRD对象放到执行队列中等待运行。
  
二、PRD模块配置
 
        1、根据实时时钟确定函数运行地时间
              打开PRD模块地属性修改窗口,勾选“Use CLK Manager to driver PRD”框,以启动运行周期函数管理程序。然后在每个PRD对象属性窗口中,设置该对象调用函数的执行频率。
 注意:当程序中有多个PRD对象时,所有的PRD对象都是由同一个周期计数器来驱动的。通常情况下,是由DSP/BIOS的时钟CL模块来管理的。每一个PRD对象在不同的周期内完成自己的功能。
        2、根据I/O地可用性或者一些其他事件确定函数运行时间
              如果用户想自己管理周期函数的计数器,则需勾除“Use CLK Manager to driver PRD”框,然后在程序中自己调用PRD_tick来对周期计数器加1,已保证周期函数能顺利启动。

三、PRD模块API函数说明

        1、PRD_getticks:返回周期性函数执行的计数值;
        2、PRD_start:启动该PRD模块计数器;
        3、PRD_stop:停止该PRD模块计数器;
        4、PRD_tick:系统内核或用户调用该函数完成对PRD管理模块的计数;

 

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 原创

评论(0) | 阅读(144)
发表于:2008-4-22 9:04:43
标签:CCS  DSP/BIOS  

1

深入DSP/BIOS的API函数 - 软件中断管理SWI


        SWI模块管理软件中断服务程序。这些中断服务程序与HWI硬件中断服务程序有密切关系。一般情况下,会将日常的大多数处理函数放到这些软件中断服务程序中管理运行。


一、SWI模块概述


        在DSP/BIOS内核中,系统管理并运行的线程分为四个等级:硬件中断服务程序、软件中断服务程序、任务和后台空闲函数,优先级依次降低。每个软件中断服务程序都对应一个函数,当然,每个软件中断夜可以单独设置优先级。高优先级的软件中断会抢占正在执行的低优先级的软件中断(因此可以说DSP/BIOS是一个基于优先级的抢占式实时内核)。                                                                                        
        所有软件中断都是通过DSP/BIOS内核的API调用来启动。一旦启动了一个SWI对象,此时,系统将为该SWI对象中的函数创建一个运行时间表。因此,当一个软件中断被启动后,其对象函数不一定会立即执行,而是会按照时间表在执行队列中根据优先级排队等候运行。DSP/BIOS根据软件中断优先级来判断是否要暂停当前运行的线程。
        为了便于控制,系统为每个SWI对象都设置有一个16位的邮箱(Mailbox),可以利用邮箱的值有条件的启动这个软件中断。系统内核会自动维护邮箱的管理。DSP/BIOS内核提供了SWI_disable和SWI_enable操作来禁止或允许软件中断。同时还为软件中断设置有15个优先级,最高优先级为SWI_MAXPRI(14),最低优先级为SWI_MINPRI(0),0优先级为KNL_swi对象保留,KNL_swi对象的任务是执行任务调度程序,该对象由内核自动创建,高优先级的软件中断会打断正在运行的低优先级的软件中断。如果启动的两个软件中断的优先级相同,那么先启动的软件中断会先执行。

        中断线程(包括硬件中断和软件中断)都是使用相同的堆栈来执行的。当中断发生时,新的线程就会添加到栈顶,系统会执行一次任务切换(Context Switch)。由于高优先级软件中断会打断低优先级的软件中断的运行,所以SWI模块在运行高优先级软件中断前会自动保存寄存器中的内容。在高优先级软件中断运行完成后,寄存器会恢复原来的内容,以便继续运行原来的低优先级中断。如果没有启动其他高优先级的软件中断,低优先级的软件中断就会运行。DSP/BIOS内核虽然具有抢占的特点,但如果没有导致任务切换的API函数调用,系统则不会主动切换道其他线程去执行的。(理解这点在实际应用中很重要,即如果现在运行的是低优先级软中断对应的函数,如果你不在函数中调用如SWI_post()启动更高优先级的软件中断或启动了比自身低的优先级中断,则当前软中断就不会被打断,执行直到退出)。

       个人经验:尽量不要在一个软中断对应的函数中去启动另一个比其本身优先级高的软件中断,因为根据抢占原则,其本身将被打断,从而CPU转去执行高优先级软中断对应的函数,低优先级的实时性将得不到保证,当有多级优先级及系统复杂情况下甚至引起系统瘫痪。也不要设置很多的优先级。当然这也不是绝对的,如果系统规划的好,利用好软中断的基于优先级抢占式的特点会大大简化你的设计。

二、LOG模块配置


        软件中断可以在DSP/BIOS的配置文件中静态说明。打开DSP/BIOS配置文件,展开“Scheduling”选项,即可选择SWI模块。
        comment:添加一段注解来说明该SWI对象。
        function:该软件中断对象将调用的函数名。
        priority:显示SWI对象的优先级。
        mailbox:设置邮箱的初始值。
        arg0,arg1:软件中断函数的两个指针类型变量。该变量可以在启动运行软件函数时由内核传递给该函数。

三、LOG模块API函数说明


        1、SWI_andn:该函数提供的参数与邮箱值做“与”运算,若邮箱为0,则启动该软件中断;
        2、SWI_dec:邮箱值减1,若邮箱值为0,则启动该软件中断,并恢复邮箱到初始值;
        3、SWI_disble:禁止软件中断;
        4、SWI_enable:允许软件中断;
        5、SWI_getmbox:返回邮箱的值,注意该函数只能在软件中断函数中调用;
        6、SWI_getpri:返回软件中断优先级;
        7、SWI_inc:启动该软件中断,并对邮箱值加1;
        8、SWI_or:启动该软件中断,并且邮箱值与该函数提供的参数做“或”运算;
        9、SWI_post:启动软件中断;
      10、SWI_raisepri:将软件中断优先级升高;
      11、SWI_restorepri:恢复软件中断的优先级;
      12、SWI_self:返回SWI对象的地址。

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 原创

评论(0) | 阅读(403)
发表于:2008-3-28 15:22:00
标签:CCS  DSP/BIOS  

1

深入DSP/BIOS的API函数 - 信息输出管理LOG

       

        CCS(Code Composer Studio)是一个完整的DSP集成开发环境,其不仅集成了常规的开发工具如源程序编辑器、代码生成工具(编译、链接器)以及调试环境外,还提供了DSP/BIOS开发工具。DSP/BIOS是一个简易的嵌入式操作系统,其可以大大方便用户编写多任务应用程序。从今天开始,我会结合个人在项目中对DSP/BIOS的使用,将全部或者部分模块的说明、使用及关键技术与大家分享。

        在用CCS开发及调试项目时,总是会需要当程序运行到某一位置或者当某一错误出现时时打印一段消息给开发者,以便于其调试及排错。DSP/BIOSD提供的强大的LOG模块可以很好的帮助开发者完成这些工作,以下是LOG模块的介绍及本人在使用过程中的注意事项。                                                                                                    


一、LOG模块概述


        目标程序执行时,可以使用LOG模块中的事件日志来记录实时的事件。我们可以使用系统日志,也可以创建用户自定义的日志。如果日志类型是循环的,那么缓存区始终保存的是最后一次记录的信息。如果日志类型是固定的,那么缓存区始终保存了第一次记录的信息。LOG模块的系统日志存储与系统事件有关的消息,这些系统消息应该是我们在TRC跟踪模块中激活了的事件。
 为了减少运行时间,日志数据的格式化处理总是在主机上完成。也就是说,由运行CCS的主机而不是DSP目标系统来处理这些日志数据,理解这点很重要。我们通常使用LOG_printf函数来替代标准C语言中的printf函数,以便更快的在CCS中显示需要打印的信息。
        日志缓存区是在数据存储器中一段固定大小的存储空间。在日志缓存区里,一个消息占用4个字的存储空间。第一个字用来存储序号,这些序号控制事件日志用正确的顺序显示日志。剩下的3个字记录数据,它们是调用API函数时写进日志的。


二、LOG模块配置


        打开DSP/BIOS配置文件,然后展开“Instrumentation”选项,LOG - Event Log Manager菜单下:“LOG_system”对象是系统创建该配置文件时自动添加的,用于系统事件记录;“LOG_msg”是用户自定义。鼠标右键单击该对象名称,在弹出的菜单中选择“Properties”激活属性窗口。
         comment:添加一段注解来说明该LOG对象。
         bufseg:选择日志缓冲区的存储段的名称。
         buflen:说明日志缓冲区的大小(以字为单位)。
         logtype:说明日志类型,循环或者固定。在缓冲区内,原有的循环类型的日志可以被新的事件覆盖,但是固定类型的日志不能被覆盖。因此,当你的日志消息可以正常显示但不更新时,请设置日志类型。
                     fixed(固定):只存储其最先接收的信息,当消息缓冲区满时就会拒绝接收新的信息。
                     circular(循环):当消息缓冲区满时,新日志会自动覆盖原有的日志。
         datatype:如使用LOG_printf函数来打印输出日志信息时,请选择“printf”类型。如使用LOG_event函数记录日志信息,请选择“raw data”。
         format:当datatype选择“raw data”即原始数据作为数据类型,那么就要写一段“printf风格”的格式串。                                                                                                


三、LOG模块API函数说明 


         1、LOG_disable:关闭指定对象的日志记录功能,此时日志缓冲区的内容将不会被更新。
         2、LOG_enable:允许日志记录事件。DSP/BIOS默认日志记录功能为打开状态。
         3、LOG_error:将一个事件、数据或者出错信息按指定的格式串写入系统日志。
         4、LOG_event:将一个为格式化的事件消息吸入日志中。
         5、LOG_message:功能及用法与LOG_error相同,只是它要受跟踪管理模块的影响。
         6、LOG_printf:在指定的LOG窗口中显示消息,等效于标准C的printf()函数。
         7、LOG_reset:复位日志缓冲区。

点击此处查看原文 >>

系统分类: DSP   |    用户分类:    |    来源: 原创

评论(0) | 阅读(316)
发表于:2008-3-18 12:20:36
标签:嵌入式人生  

1

工程师的发展之路

 

       一、中长期职业发展的自我准备 

       1、心态上随时做好准备 机会是给有准备的人的------“有准备”是你在做准备的过程中让“别人”认为你“有准备”!别人是包括你现在的老板和别的老板,以及你身边的人!他们对你的赏识程度决定了你的机会
       2、专注于自己的优势  70%专注于长处,25%专注于学新事物,5%专注于避免短处
       3、不断修正自己的技术方向,扩大自己的知识与能力的金字塔  增强自己的核心竞争力,但尽量别改变太多太快(今天做手机、明天做电视、后天做空调,这样很乱的,大大不利)
       4、积极争取机会 柳传志说,杨元庆就是“哭着喊着要进步”,实际上,就是争取自己的机会;当然,这种强烈的进步欲望,也是领导看重的地方。每一步都走在前面,积累多了,你就有了比其他人更多的机会了。要积极争取如下机会:
          a、做新项目的机会  
             b、到新部门的机会  
             c、带新人的机会 如果公司不安排带,那就自己主动去帮助新人,做半个师傅。
             d、管理项目的机会  
             e、管理团队的机会(卡位非常非常重要) 
      5、做多揽活干的傻子    与工作相关的事情,没人做就主动去做;别人没干好就主动帮他们干好  要乐意去干工作职责范围以外的事情
      6、使自己变得不可替代  最重要的就是,别人做到的你要做得更加好,别人做不到的你就要做到,要不断超越老板的期望!才能赢得老板或者别的老板的信任,才能得到更多的机会与回报!
      7、 关注技术、公司及相关行业的发展,达到对技术、技术发展趋势、团队管理、行业情况与发展趋势等能吹能侃的地步
   
       二、中长期规划时间表(想升官的想发大财的朋友): 
      
     0-2年内  多干蓝领的工作,多学习多积累技术经验
     2-4年内  多看技术发展趋势方面文章,多交与本职岗位相关的朋友 
     4-6年内  多看技术发展趋势与行业发展趋势文章,多交与本部门业务相关的朋友 
     6年以后   多看管理书籍,多了解行业发展趋势,多交与本行业相关的朋友
     8年后--        多与产业链的朋友及资本相关的朋友交流

       如果不想操心太多,就想走技术专家路线的朋友,请把0-6年的3个阶段继续延续下去。

       三、需要纠正的几个观念: 

       1、不是每个工程师都适合做管理的        走技术路必然会和走管理路分开
       2、不是人人都可以做市场做销售的        性格、亲和力、知识结构等影响很大
       3、不是人人都可以做老板开公司的       小老板辛苦程度高,其实还不如高级白领滋润(特别是IC,最适合工程师打工的)
   
       四、螺旋式上升方式修改完善职业之路  

        大公司与小公司循环,职位与薪水自然跟着循环,职业生涯平台自然跟着上(当然能在公司内部上升自然最好) 

作者:眉间尺    时间:2008-01-28    来源:  嵌入式在线社区

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(154)
发表于:2008-3-18 11:18:44
标签:嵌入式人生  

1

开博宣言

 

开博宣言


        很早,大概是Blog刚开始在网络上盛行时,我就有想把自己在工作和实验中的点点滴滴写到Blog上的打算。也是因为研发工作较忙及个人爱好广泛原因,一直没有时间。最近开始开发一个基于TMS320C6713B的气体超声流量计的项目,而说实话,以前只知道DSP是Digital Signal Processor的缩写,从来没有真正使用过。开始接触之后才知道和单片机是有很大区别的,以前一直在网络上汲取别人的果实,也该是回报的时候了。成就谈不上,只是把从大学毕业开始从事嵌入式开始到现在,一路走来的些许经验及技术分享给各位同行,同时也累积些开发过程中的东西,衷心的希望大家批评指正,更希望大家互相探讨、共同进取。                                            


博主简介


        本人2003年7月毕业于辽宁工业大学信息科学与工程学院自动化系,工作后主要从事51、96、MSP430的开发,期间独立使用P87LPC767成功开发出温、湿度控制器;使用AT89S52成功开发出智能压力显示仪等小的项目,也部分参与了基于Intel 80C196KC的ZKD-5型真空检漏仪、基于TI MSP430F169的气体流量采集板卡等项目。并获得上海市计量检定员(压力表)、初、中级工程师职称。使用过的开发工具:Protel 99se、Keil C、IAR EW、TI CCS、VB等。现主要研发方向:TI TMS320C6000系列DSP应用于的气体超声流量数据的采集与处理。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(131)
总共 , 当前 /