网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C6000 >> 文章正文
  任务线程的使用         ★★★ 【字体:
任务线程的使用
作者:C003    文章来源:本站    点击数:    更新时间:2007-4-5    

任务也是DSP/BIOS内核中的一种线程。所有任务的中断优先级都低于硬件中断和软件中断。任务线程可以通过TSK_yield函数来切换运行。

 

 

1. 复制并打开工程文件

 

 

该工程的文件在ti\turorial\evmDM642目录下,将所有文件复制到目标文件夹下,建立工程。

 

 

2. 修改DSP/BIOS配置工程

 

TSK中添加三个TSK对象。如下表所示:

 

 对象名字     任务函数      任务参数参数0  Task0        _task              0  Task1      _task              1  Task2      _task              2 这三个TSK对象的优先级水平都设为1

 

 

设置LOG对象对线程进行和转换进行跟踪记录。

 

 

保存修改后的配置文件。

 

 

3. 查看源代码

 

 

源代码有如下几个部分:

 

1>头文件与变量声明:这部分程序包括了程序中使用到的API函数的原型,还包括tsktestcfg.h头文件,该头文件包含在配置文件中创建的DSP/BISO对象的外部声明,还定义了NLOOPS常量,该常量为任务函数中的循环时间常量。

 

 

2> Main函数:当main函数返回后即进入DSP/BIOSidle循环。DSP/BIOS内核将等待各种时间的发生。

 

 

3> Task函数:任务函数包含一个for循环,每次循环都发送一个消息到tarace窗口,然后通过调用TSK_yield函数实现任务切换。在循环了NLOOP定义的次数后,该函数结束。在DSP/BIOS配置文件中,我们定义了三个TSK任务对象task0task1task2,它们调用的函数都死活task(),只是在调用时传递的参数不一样,分别为012

 

 

4. 运行

 

task0运行时,它调用了TSK任务模块的一个API函数TSK_yield,这样当前任务task0将暂停,而其他就绪任务便可以依次执行。同样,当task1调用任务切换函数后,task2便开始运行。当task2产生任务切换时,task0继续运行。所以,在TSK_yield的作用下,三个任务将交替执行,同时结束。例子运行时LOG对象的输出信息如下:

 

 

0 Loop 0: Task 0 Working

1 Loop 0: Task 1 Working

2 Loop 0: Task 2 Working

3 Loop 1: Task 0 Working

4 Loop 1: Task 1 Working

5 Loop 1: Task 2 Working

6 Loop 2: Task 0 Working

7 Loop 2: Task 1 Working

8 Loop 2: Task 2 Working

9 Loop 3: Task 0 Working

10 Loop 3: Task 1 Working

11 Loop 3: Task 2 Working

12 Loop 4: Task 0 Working

13 Loop 4: Task 1 Working

14 Loop 4: Task 2 Working

15 Task 0 DONE

16 Task 1 DONE

17 Task 2 DONE

 

 

5. 对程序做一下修改。当task0任务运行到第二次循环中时,增加一个改变任务线程优先级的函数调用,通过函数TSK_setpritask1的优先级提高到3。代码如下:

 

 

TSK_Handle TSK1;

Void task(Arg id_arg)

{

Int id=ArgToInt(id_arg);

Int i;

if(id==1)

TSK1=TSK_self();

for(i=0;i<NLOOPS;i++){

if((i==2)&&(id==0))

{

TSK_setpri(TSK1,3);

}

LOG_printf(&trace,”Loop %d:Task %d Working”,i,id);

TSK_yield();

}

LOG_printf(&trace,”Task %d Done”,id);

}

 

 

for循环执行到第三个循环开始时,即i=2时,TSK1的优先级调整为3,高于其他两个任务的优先级, 此时产生任务切换,TSK1会优先执行,待TSK1执行完之后,接着执行TSK0TSK2LOG对象的输出信息如下:

 

 

0 Loop 0:Task 0 Working

1 Loop 0:Task 1 Working

2 Loop 0:Task 2 Working

3 Loop 1:Task 0 Working

4 Loop 1:Task 1 Working

5 Loop 1:Task 2 Working

6 Loop 2:Task 1 Working

7 Loop 3:Task 1 Working

8 Loop 4:Task 1 Working

9 Task 1 Done

10 Loop 2:Task 0 Working

11 Loop 2:Task 2 Working

12 Loop 3:Task 0 Working

13 Loop 3:Task 2 Working

14 Loop 4:Task 0 Working

15 Loop 4:Task 2 Working

16 Task 0 Done

17 Task 2 Done

 

 

程序源代码如下:

tsktestcfg.h代码

/*

* Copyright 2003 by Texas Instruments Incorporated.

* All rights reserved. Property of Texas Instruments Incorporated.

* Restricted rights to use, duplicate or disclose this code are

* granted through contract.

*

*/

/* "@(#) DSP/BIOS 4.90.270 06-11-03 (barracuda-m10)" */

/* Do *not* directly modify this file. It was */

/* generated by the Configuration Tool; any */

/* changes risk being overwritten. */

 

/* INPUT tsktest_sim64.cdb */

 

#define CHIP_6416 1

 

/* Include Header Files */

#include <std.h>

#include <hst.h>

#include <swi.h>

#include <tsk.h>

#include <log.h>

#include <sts.h>

 

#ifdef __cplusplus

extern "C" {

#endif

 

extern far HST_Obj RTA_fromHost;

extern far HST_Obj RTA_toHost;

extern far SWI_Obj KNL_swi;

extern far TSK_Obj TSK_idle;

extern far TSK_Obj task0;

extern far TSK_Obj task1;

extern far TSK_Obj task2;

extern far LOG_Obj LOG_system;

extern far LOG_Obj trace;

extern far STS_Obj IDL_busyObj;

extern far void CSL_cfgInit();

 

#ifdef __cplusplus

}

#endif /* extern "C" */

 

tsktestcfg_c.c代码

/*

* Copyright 2003 by Texas Instruments Incorporated.

* All rights reserved. Property of Texas Instruments Incorporated.

* Restricted rights to use, duplicate or disclose this code are

* granted through contract.

*

*/

/* "@(#) DSP/BIOS 4.90.270 06-11-03 (barracuda-m10)" */

/* Do *not* directly modify this file. It was */

/* generated by the Configuration Tool; any */

/* changes risk being overwritten. */

 

/* INPUT tsktest_sim64.cdb */

 

/* Include Header File */

#include "tsktestcfg.h"

 

 

#ifdef __cplusplus

#pragma CODE_SECTION(".text:CSL_cfgInit")

#else

#pragma CODE_SECTION(CSL_cfgInit,".text:CSL_cfgInit")

#endif

 

 

#ifdef __cplusplus

#pragma FUNC_EXT_CALLED()

#else

#pragma FUNC_EXT_CALLED(CSL_cfgInit)

#endif

 

/* Config Structures */

/* Handles */

 

 

/*

* ======== CSL_cfgInit() ========

*/

void CSL_cfgInit()

{

}

 

tsktest.c代码

/*

* Copyright 2003 by Texas Instruments Incorporated.

* All rights reserved. Property of Texas Instruments Incorporated.

* Restricted rights to use, duplicate or disclose this code are

* granted through contract.

*

*/

/* "@(#) DSP/BIOS 4.90.270 06-11-03 (barracuda-m10)" */

/*

* ======== tsktest.c =======

* In this example, 3 tasks have been created with the Configuration

* Tool. Each task has a computation loop consisting of a LOG_printf()

* followed by a TSK_yield(). This causes a round robin scheduling for

* these tasks of equal priority.

*/

 

#include <std.h>

 

#include <log.h>

#include <tsk.h>

 

#include "tsktestcfg.h"

 

#define NLOOPS 5

 

Void task(Arg id_arg); /* Function for tasks created with Config Tool */

 

/*

* ======== main ========

*/

Void main()

{

}

 

/*

* ======== task ========

*/

Void task(Arg id_arg)

{

Int id = ArgToInt (id_arg);

Int i;

 

for (i = 0; i < NLOOPS ; i++) {

#ifdef _28_

LOG_printf(&trace, "Loop %d: Task %d Working", (Arg)i, (Arg)id);

#else

LOG_printf(&trace, "Loop %d: Task %d Working", i, id);

#endif

TSK_yield();

}

#ifdef _28_

LOG_printf(&trace, "Task %d DONE", (Arg)id);

#else

LOG_printf(&trace, "Task %d DONE", id);

#endif

}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号