关 闭

新闻中心

EEPW首页>工控自动化>设计应用> 调度器在DSP编程中的应用

调度器在DSP编程中的应用

——
作者:乔显华 李文 时间:2006-06-28 来源: 收藏
摘要: DSP在自动控制系统领域得到广泛的应用。它的性能远远强于单片机,在控制系统中所完成的功能也较为复杂。若基于简单的超循环结构来完成软件设计,则编写的程序繁琐而且困难,更为重要的是系统有的任务精确时限得不到满足;若使用简单嵌入式操作系统,则会占用非常多的资源(CPU与RAM),系统的实时性还有可能不满足要求。为了把一个复杂系统中的任务组织起来,并且尽量减少资源的损耗,本文提出了一种软件设计方法可满足上述要求。

  关键字:DSP ,单片机 , 嵌入式操作系统


  Attemper Application in DSP Program

  Abstract:DSP is widely used in automation system field. Its performances are much stronger than SCM, so it can complete complex functions in automation system field. If accomplish the software based on simple infinite circle, the designing is complex and difficult, more important thing is that time limit of tasks is not met; if used embedded OS , it will take up more resources(CPU and RAM) and real time quality of the system probably can not be met. In order to organize the tasks in complex system and reduce wastage of resources, this paper put forward a method of designing software that could meet above requests.

  Keywords: DSP, SCM , embedded OS




  一. DSP介绍

  DSP芯片,也称数字信号处理器,是一种具有特殊结构的微处理器。它的内部采用程序和数据分开的哈佛结构,具有专门的乘法器,广泛采用流水线结构,提供特殊的DSP指令,在一个周期内完成一次乘法和一次加法。在国外,DSP芯片已经被广泛地应用于当今技术革命的各个领域;在我国,DSP技术也正以极快的速度被应用在通信、电子系统、信号处理系统、自动控制、雷达、军事、航空航天、医疗、家用电器、电力系统等许多领域中,而且新的应用领域在不断地被发掘。因此基于DSP技术的开发应用正成为数字时代的应用技术潮流。相对于单片机,它速度更快,外设集成度更高,程序存储器更大。在《时间触发嵌入式系统设计模式》一书中详细介绍了基于单片机的软件设计方法,而本文基于DSP对这种设计进行了扩展,使这种设计方法更为灵活,有效。


  二.调度器介绍

  可以从两方面来看调度器:一方面:调度器可以看作是一个简单的操作系统,允许以周期性或单次方式调用任务;另一方面:从底层角度来看,调度器可以看作是一个由许多不同任务共享的定时器中断服务程序。

  1. 调度器的组成

  (1)调度器数据结构

  调度器的核心是调度器数据结构。这是一种用户自定义的数据类型,集中了每个任务所需的信息。


  typedef struct
    {
     void ( * pTask)(void); 指向任务的指针(必须是一个void(void)函数)。
     unsigned int Delay; 延时时标数:直到任务将下一次运行所剩时标数。       时标,是硬件定时器周期中断设定的时间间隔,它是调度器的驱动者。
     unsigned int Period; 周期时标数:任务连续运行所间隔的时标数。
     unsigned int DelCounter; 若不为周期任务,表示任务运行次数;若为周期函数,则无意义。
     char PrdOrTemp; 若PrdOrTemp=1,则为周期任务;若PrdOrTemp=0,则为非周期任务。
     char RunMe; 当任务需要运行时(由调度器)加1
    } sTask;

  另外,还需要定义一些全局变量:unsigned int Task_Index 记录当前所添加任务索引变量,对于每一个任务都要定义一个任务索引变量,以便对任务进行查找。例如:可以利用任务索引变量对任务进行删除。任务队列sTask SCH_tasks_G [SCH_MAX_TASKS]记录所有任务数据结构的全局变量,其中SCH_MAX_TASKS为定义的最大任务数。虽然在系统运行时,任务有添加或删除,但系统不是很复杂,给出的SCH_MAX_TASKS一定要大于运行的任务数。


  (2) 初始化函数(void SCH_Init_T(void))

  这个函数主要的作用是设置定时器,用来产生驱动调度器的定期时标。一般的DSP都有多个定时器,它们中的任何一个都可以用来驱动调度器。对于调度器来说,要在不同地微处理器运行,主要是初始化函数不同(即微处理器的定时器初始化不同)。时标设定的大小关系到CPU的利用率和系统的精度,它的大小与具体的系统有关,例如微处理器的速度,执行任务的大小,执行任务周期的大小等。TI 公司推出的2000 系列的DSP与一般51系列的单片机时标的设定有所不同:DSP的CPU频率可达到40M,而且采用流水线结构,基本上一个时钟周期执行一条指令;一般单片机频率为10M,而且远不能达到一个时钟周期执行一条指令。在《时间触发嵌入式系统设计模式》一书中,单片机时标设定为1ms,可获得很高的CPU利用率;而调度器应用在交流数据采集和控制系统中(采用TMS320LF2407), 时标设定为200us,CPU利用率也不小于百分之九十五。


  (3) 添加任务的函数

  unsigned int SCH_Add_Task(void ( * pFunction)( DELAY, PERIOD, DELCOUNTER, PRDORTEMP)

  添加任务函数首先开始检查任务队列sTask SCH_tasks_G[SCH_MAX_TASKS]记录所有任务数据结构的全局变量哪一个空闲,然后将所添加任务的地址,延时执行时标数,周期时标数,任务运行次数,周期任务指示标志赋给任务队列那一个空闲全局变量。再记录下当前任务索引变量,以便在需要的情况下赋给任务自身索引变量,对任务进行跟踪。


  (4) 删除任务的函数

  void SCH_Del_Task(const unsigned int TASK_INDEX)

  删除任务函数从 TASK_INDEX得到所要删除任务的任务索引变量。然后将对应的任务数据结构的全局变量清除。删除任务时,对应的任务数据结构的全局变量的内容清除,但变量并没有撤销,当再次执行添加任务函数时,此任务数据结构的全局变量有可能分配给其他任务。


  (5) 刷新函数 void SCH_Update(void)

  刷新函数是调度器的中断服务程序,用一定的时间间隔刷新调度器。它是由定时器溢出激活的,刷新函数并不复杂。当刷新函数确定某个任务需要运行时,将这个任务Runme标志加一,然后该任务将由调度函数执行。刷新函数的执行流程如图1所示。


  (6) 调度函数 void SCH_Dispatch_Tasks(void)

  调度函数是用来执行任务的函数,而刷新函数并不执行任务。我们之所把刷新函数与调度函数分开,是处于与系统安全考虑的。如果刷新函数与调度函数合并,而一个任务出现异常在一个时标中没有执行完,那么定时器中断将被忽略,下一个任务将不能在预定的时间内执行。调度函数不仅可以运行所需要运行的任务,而且可以删除运行完毕的非周期任务。在调度函数中可加入一些其他功能,可以是系统在任务执行完毕后没有任务执行是进入低功耗状态,以节省电能。调度函数的执行流程如图2所示。




            图1刷新函数流程图       图2调度函数流程图



  2. 任务的运行

  任务的运行过程也是调度器运行的过程。这里调度LED两秒闪烁一次的任务来说明任务
void LED_Flash(void)的运行过程。设定时标为200us。系统初始化System_Init( ),对于任务LED_Flash(),DSP仅仅设置时钟和相应的I/O引脚;SCH_Init_T()前已详细讲明;添加任务函数


图3任务运行流程图
图3任务运行流程图



  SCH_Add_Task(LED_Flash, 0, 5000,0,PERIOD_TASK ),其中LED_Flash为任务的地址,第一个零表示从系统运行第一个时标就开始执行任务,5000表示每5000个时标(5000


评论


相关推荐

技术专区

关闭