![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
任务延时是指任务执行完毕处于挂起等待状态到下一次重新运行之间的时间间隔,它的单位是时钟中断节拍。由于OS_TICKS_PER_SEC为1000,每一拍为lms。每个任务的调用间隔不能小于一个节拍,它将影响模拟量的采样频率。
各个任务的属性定义如表1所示。
表1 各个任务的属性定义
任务名称 优先级 内存空间(字) 延时(节拍) 任务功能
Task_FEBACK 12 80 1 回馈运行
Task_AD 13 120 1 AD采集
Task_NORAML 14 80 2 电动运行
Task_SHOW 15 100 5 实时显示
1.4 任务间的通信
各个任务是通过抢占CPU的使用权来运行的,它们之间存在一定的逻辑关系,彼此互相联系又互相制约。信号量、邮箱、消息队列等功能为实现任务间通信提供了有力工具,它们的使用方法灵活多变,如用信号量设置事件标志,唤醒任务、用邮箱在任务间传递参数、用消息队列的循环寻址功能进行模拟通道的数据采集等。本文设计了两个信号量,在系统运行开始后,任务TASK_AD检测直流侧电压的大小。当电压未超过设定值时,发出信号DC_NORM唤醒任务Task_NORMAL;当电压高出设定值时,发出信号DC_OVER唤醒任务Task_FEBACK。虽然这两个任务基于不同的控制结构,采用不同的算法,但都要使用PWM输出和SPI通信口,所以在唤醒一个任务的同时必须让另外一个任务挂起。这里引入了互斥型信号量T_MUTEX实现这个功能。得到T_MUTEX信号的任务将独自占有共享资源的使用权,两个任务不会因资源冲突而同时挂起,解决了任务间优先级反转问题,避免了系统功能失效。任务间逻辑关系如图2所示。
操作系统为任务间通信提供了多种途径,但最简单有效的方法是共享全局变量。本文使用共享全局变量的方法实现了显示任务与键盘中断服务之间的通信,代码如下:
键盘中断:
static void KeyboardISR(void)
{
UWoMl6 cpu_sr;
OS_ENTER_CRITICAL();//临界区代码保护
asm{
move X:$0FB7,A1 //读键盘中断状态表
move A1,state1 //将中断状态放入全局变量
};
OS_EXIT_CRITICAL(); //临界区代码保护结束
}
这里statel是全局变量,键盘中断的工作仅仅是将PORTA口中断状态寄存器(IESR,地址$0FB8) 读入statel中。为防止其他任务在此期间对statel的修改,使用了临界区代码保护。
显示任务的部分代码:
switch(statel)
{case 1: //PTA_0对应的键被按下
…… //相应的服务程序,略
case 128: //PTA_7对应的键被按下
break;}
asm{move$00,X:$OFB8}; //清键盘中断状态,以备下次中断
显示任务中采用多分支结构,根据statel=2n,(n=0,1,2,3,,4,5,6,7),不同的值代表不同的键被按下,程序进行相应的处理;最后将IESR寄存器清零。用同样的方法,两位之间互相组合可扩展形成16个按键。这样只用一个全局变量就完成了中断与任务间的通信,程序用内嵌汇编的C来写,简捷高效。 |
|