首先附上CCS自带的DSP/BIOS例程 tsk example:
#include
#include
#include
#include "tskcfg.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++) {
LOG_printf(&trace, "Loop %d: Task %d Working", i, id);
TSK_yield();
}
LOG_printf(&trace, "Task %d DONE", id);
}
程序运行结果为:
个人对程序流程的理解:
首先我们先看下建立的四个任务线程
这四个任务线程的优先级是相同的,因此其执行顺序就是哪个任务先建立就先执行哪个任务,任务执行顺序也就是:task0->task1->task2。现在我们来看下程序的任务语句:
Void task(Arg id_arg)
{
Int id = ArgToInt (id_arg);
Int i;
for (i = 0; i < NLOOPS ; i++) {
LOG_printf(&trace, "Loop %d: Task %d Working", i, id);
TSK_yield();
}
LOG_printf(&trace, "Task %d DONE", id);
}
程序执行到 for 语句时,第一次先打印出 Loop 0:Task 0 working。紧接着遇到TSK_yield 函数,这里解释下 TSK_yield 函数的作用:TSK_yield函数可以把程序的控制权转给相同级别的下一个任务,也就是说打印完第一句话后程序的控制权交给了task 1了,程序就会重新调用task函数,故会输出Loop 0:Task 1 working。紧接着下一次切换到任务2,输出oop 0:Task 2 working。紧接着又会进行一次任务切换,输出Loop 1:Task 0 working。以此类推,就可以得到前面输出的结果了。