![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 任务线程的使用 | |||||
作者: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/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 1 2 3 4 5 6 7 8 9 10 11 12 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_setpri将task1的优先级提高到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执行完之后,接着执行TSK0和TSK2。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 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, " #else LOG_printf(&trace, " #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条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|