- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多任务编程
三种编程方式;While(1)大循环;定时器 中断编程;多任务编程;void tsk1()
{
led1=~led1;
tsk1_time=10;
}
void tsk2()
{
led2=~led2;
tsk2_time=20;
}
void tsk3()
{
led3=~led3;
tsk3_time=100;
};void tsk1()
{
led1=~led1;
tsk1_time=10;
}
void tsk2()
{
led2=~led2;
tsk2_time=20;
}
void tsk3()
{
led3=~led3;
tsk3_time=100;
};void tsk2()
{
switch(step2)
{
case 0:
step2=1;
步骤1
break;
case 1:
step2=0;
步骤2
break;
}
tsk2_time=10;
}
;?;#define TSK_MAX 10 //任务最大个数
typedef void (*FUNC)(int* step); //任务函数指针
typedef struct
{
unsigned char FLAG; //任务存在标志位,1任务存在,0
FUNC func;
int CNT; //节拍计数器
int step; //步骤计数器
}TSK; //任务参数结构体
TSK tsk[TSK_MAX];
unsigned char tsk_cnt; //任务计数器;
void TSK_STEP_Init() //节拍时钟初始化 1ms为节拍
{
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCR0 = 32;
TA0CTL = TASSEL__ACLK + MC__UP + TACLR; // SMCLK, upmode, clear TAR
}
void TSK_CLEAR() //任务清零
{
unsigned char i;
for(i=0;iTSK_MAX;i++)
{
tsk[i].FLAG=0;
tsk[i].func=0;
tsk[i].CNT=0;
tsk[i].step=0;
}
}
void TSK_Init() //初始化
{
tsk_cnt=0;
TSK_CLEAR();
TSK_STEP_Init();
};void register_TSK(FUNC func,unsigned char PRIO) //注册任务 func 是任务 的回调函数 PRIO是优先级
{ //优先级就是任务在结构体数组的位置,排得越前优先级越高
if(PRIOTSK_MAX)
if(!tsk[PRIO].FLAG)
{
tsk[PRIO].FLAG=1; //任务存在标志位置1,表明该任务以存在
tsk[PRIO].func=func;
tsk[PRIO].step=0;
}
}
void DELET_TSK(TSK* tsk) //删除某个任务
{
if(tsk-FLAG)
{
tsk-FLAG=0;
tsk-func=0;
tsk-CNT=0;
tsk-step=0;
}
};void delay_step(int time) //节拍延时函数等价于将该任务的节拍计数器CNT置为N
{
tsk[tsk_cnt].CNT=time;
}
void TSK_SW() //从优先级最高的任务(第0个任务)到优先级最低的任务(第TSK_MAX-1个任务)依次扫描,
{ //若该任务存在(FLAG=1),同时该任务的节拍计数器CNT=0,调用该任务的回调函数。
for(tsk_cnt=0;tsk_cntTSK_MAX;tsk_cnt++)
{
if(tsk[tsk_cnt].FLAG)
{
if(tsk[tsk_cnt].CNT=0)
tsk[tsk_cnt].func(tsk[tsk_cnt].step);
}
}
}
文档评论(0)