DSP芯片TMS320DM642任务线程的使用
- 格式:doc
- 大小:46.50 KB
- 文档页数:5
DSP芯片TMS320DM642任务线程的使用任务也是DSP/BIOS内核中的一种线程。
所有任务的中断优先级都低于硬件中断和软件中断。
任务线程可以通过TSK_yield函数来切换运行。
1. 复制并打开工程文件该工程的文件在ti\turorial\evmDM642目录下,将所有文件复制到目标文件夹下,建立工程。
2. 修改DSP/BIOS配置工程在TSK中添加三个TSK对象。
如下表所示:对象名字任务函数任务参数参数0task0 _task 0task1 _task 1task2 _task 2这三个TSK对象的优先级水平都设为1。
设置LOG对象对线程进行和转换进行跟踪记录。
保存修改后的配置文件。
3. 查看源代码源代码有如下几个部分:1>头文件与变量声明:这部分程序包括了程序中使用到的API函数的原型,还包括tsktestcfg.h头文件,该头文件包含在配置文件中创建的DSP/BISO对象的外部声明,还定义了NLO OPS常量,该常量为任务函数中的循环时间常量。
2> Main函数:当main函数返回后即进入DSP/BIOS的idle循环。
DSP/BIOS内核将等待各种时间的发生。
3> Task函数:任务函数包含一个for循环,每次循环都发送一个消息到tarace窗口,然后通过调用TSK_yield函数实现任务切换。
在循环了NLOOP定义的次数后,该函数结束。
在DSP/BIOS配置文件中,我们定义了三个TSK任务对象task0,task1和task2,它们调用的函数都是task(),只是在调用时传递的参数不一样,分别为0,1和2。
4. 运行在task0运行时,它调用了TSK任务模块的一个API函数TSK_yield,这样当前任务task0将暂停,而其他就绪任务便可以依次执行。
同样,当task1调用任务切换函数后,task2便开始运行。
当task2产生任务切换时,task0继续运行。
所以,在TSK_yield的作用下,三个任务将交替执行,同时结束。
例子运行时LOG对象的输出信息如下:0 Loop 0: Task 0 Working1 Loop 0: Task 1 Working2 Loop 0: Task 2 Working3 Loop 1: Task 0 Working4 Loop 1: Task 1 Working5 Loop 1: Task 2 Working6 Loop 2: Task 0 Working7 Loop 2: Task 1 Working8 Loop 2: Task 2 Working10 Loop 3: Task 1 Working11 Loop 3: Task 2 Working12 Loop 4: Task 0 Working13 Loop 4: Task 1 Working14 Loop 4: Task 2 Working15 Task 0 DONE16 Task 1 DONE17 Task 2 DONE5. 对程序做一下修改。
当task0任务运行到第二次循环中时,增加一个改变任务线程优先级的函数调用,通过函数TSK_setpri将task2的优先级提高到2。
代码如下:V oid task(Arg id_arg){Int id=ArgToInt(id_arg);Int i;for(i=0;i<NLOOPS;i++){if((i==2)&&(id==0)){TSK_setpri(&task2,2);}LOG_printf(&trace,”Loop %d:Task %d Working”,i,id);TSK_yield();}LOG_printf(&trace,”Task %d Done”,id);}当for循环执行到第三个循环开始时,即i=2时,task2的优先级调整为2,高于其他两个任务的优先级,此时产生任务切换,task2会优先执行,待task2执行完之后,接着执行task 0和task1。
LOG对象的输出信息如下:0 Loop 0:Task 0 Working1 Loop 0:Task 1 Working2 Loop 0:Task 2 Working3 Loop 1:Task 0 Working4 Loop 1:Task 1 Working5 Loop 1:Task 2 Working6 Loop 2:Task 2 Working7 Loop 3:Task 2 Working8 Loop 4:Task 2 Working9 Task 2 Done10 Loop 2:Task 0 Working11 Loop 2:Task 1 Working12 Loop 3:Task 0 Working13 Loop 3:Task 1 Working14 Loop 4:Task 0 Working16 Task 0 Done17 Task 1 Done6.程序源代码如下:tsktestcfg.h代码/* Do *not* directly modify this file. It was */ /* generated by the Configuration Tool; any *//* changes risk being overwritten. */ /* INPUT tsktest.cdb */#define CHIP_DM642 1/* Include Header Files */#include <std.h>#include <hst.h>#include <swi.h>#include <tsk.h>#include <log.h>#include <sts.h>#ifdef __cplusplusextern "C" {#endifextern 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代码/* Do *not* directly modify this file. It was *//* generated by the Configuration Tool; any *//* changes risk being overwritten. *//* INPUT tsktest.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 5V oid task(Arg id_arg); /* Function for tasks created with Config Tool *//** ======== main ========*/V oid main(){}/** ======== task ========*/V oid 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); #elseLOG_printf(&trace, "Loop %d: Task %d Working", i, id);#endifTSK_yield();}#ifdef _28_LOG_printf(&trace, "Task %d DONE", (Arg)id);#elseLOG_printf(&trace, "Task %d DONE", id);#endif}。