微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式智能仪表自动控制技术

嵌入式智能仪表自动控制技术

时间:08-16 来源:互联网 点击:

sK task; //tsk_tcb指向的任务

U8 state; //tsk.tcb任务目前的状态

U8 prior; //任务优先级

}TCB;

3.2.2 任务调度算法及实现

这种算法已在16位单片机Motorola MC9S12DP256B和8位单片机AT89C52上实现。一些与硬件相关的算法,主要给出在MC9S12DP256B上的算法实现。

①建立任务Os-Task-Create()算法。任务创建函数代码如下:

void 0s_Task_Create(0S_STACK*task_stack,

uW0rd task_id,pTASK task_func){

os_tcb[task_id].task=task_func;

os_tcb[task_id].stack=task_stack;

os_tcb[task_id].prior=task_id;

该程序表示了系统建立任务的过程。如上节所述每个任务对应一个优先级,所以任务ID也可表示任务的优先级。建立任务的过程就是,把任务控制块数组的任务入口地址对应ID(即任务优先级)的任务控制块的任务入口地址指向任务函数的地址,并初始化该任务的任务堆栈。

② 任务调度算法的功能是找到当前就绪列表中优先级最高的任务,并把这个任务切换到运行状态。在任务控制块列表中使用任务在列表中的相对位置表示优先级的高低,并不需要实际地对任务优先级进行比较。算法流程如图1所示。

从任务控制块队列的头部(即任务优先级为O的任务)开始依次检查任务就绪标志(os_tcb.state),如果当前任务标志≠1,表示当前任务为非就绪状态,继续检查下一优先级的任务。如果当前任务标志为1,则找到最高优先级任务退出循环,调用任务调度函数进行任务状态切换。

任务的调度算法如下:

void os_schedule_task(void){

int i ;

pCur_task=pHi_task;

for(i=O;i%26lt;TASKNUMos_tcb[i].state!=1;i++){

Hi_task=i;

if(pHi_task!=%26amp;os_tcb[i]){

pHi_task=%26amp;os_tcb[i];

os_sw_task();

}

}

任务级切换函数需要改变程序计数器(PC),所以必须通过软中断实现。在软中断服务函数中改变当前运行任务的TCB指针到最高优先级就绪任务,执行中断返回指令在新的任务堆栈中弹出最高优先级任务的PSW和PC指针,从而完成任务切换。

③ 任务状态转换主要是激活任务os_TasK_AcTIve()、挂起任务os_TasK_Suspend()和延迟任务os_TasK_Delay()。挂起任务使任务进入挂起状态,延迟任务使任务进入等待状态,而激活任务函数可以使任务从挂起状态或者等待状态直接进入就绪状态。任务的状态由任务控制块中的任务状态字(os_tcb.state)给出。当os_tcb.state=1时表示任务进入就绪状态;当os_tcb.state=O时表示任务处于挂起状态;当os_tcb.state%26gt;1时表示任务等待os_tcb.state-1个系统时钟间隔之后进入就绪状态。任务状态切换示意图如图2所示。

④由于这些中低端的仪器仪表每个任务的执行时间都比较短,为了避免优先级反转和死锁,采用非抢占式调度方式,进入就绪态的任务必须在当前任务执行完成后才能被调度。调度时处于就绪表中优先级最高的任务进入运行。

3.2.3 调度算法的时钟驱动

时间驱动需要硬件提供时钟节拍来实现任务的定时。时钟节拍信号源可以是专门的硬件定时器,比如AT89C52中的Timer2。也可以使用其他更精确的方式提供系统时钟节拍。在这里使用MC9S12DP256B捕获器的第7个通道来实现,时钟中断处理函数如下:

的捕获器中有一个自动增长主时钟,每一个硬件周期驱动TCNT+1,并与TC7相比较。设置TC7=TCNT+OS_TICK_OC_CNTS(在系统配置文件中定义),当度过OS_TICK_OC_CNTS个硬件周期时,TCNT=TC7则产生中断。在中断中调用系统时钟节拍函数提供精确的系统时钟节拍,并再次初始化TC7=TCNT+OS_TICK_OC_CNTS,产生下一个时钟节拍。

系统时钟节拍函数自动检查每个被延迟的任务,当任务的延迟周期结束后,自动将任务切换到就绪状态。具体算法如下:

① 从任务控制块列表头部开始顺序检查各任务状态字,将所有延迟任务的任务状态字减1。

② 当前延迟任务的状态字变为1时,该任务延时结束,置就绪任务列表改变标志位。

③ 恢复被中断任务状态,返回中断。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top