假设某仪器要实现A/D采样、输入控制、显示等功能.uC/OS-Ⅱ操作系统将对这三个任务进行管理,协调各自工作.任务描述:
统计任务:每做完例行统计后执行一次显示输出;初始任务:每隔10节拍进行一次A/D采样;用户任务:每秒判断一次是否有输入控制信号.
实验中为了测量与观察方便,采用对89C51的P1口每次取反的操作来模拟仪器执行的任务,由于关心的是操作系统的性能,而非任务本身,因此简化是可行的.
设置时钟节拍:50Hz三个任务(包含系统空闲任务):
任务名优先级操作空闲任务63空操作统计任务62每秒做一次统计并对P1.2取反初始任务4每秒对P1.0取反一次用户任务5每10个节拍对P1.1取反一次设计中须注意以下两点:
(1)任务的现场保护:除PUSH到堆栈的CPU寄存器外,还应包括任务运行过程中保存到堆栈的信息,所以每次保存的信息量是变化的.
(2)任务堆栈的大小应根据实际情况充分估计,避免过大或者不足.
在这个例子中定义了TASK STK SIZE(任务堆栈)为64个字节,故在内部RAM中预留出64个字节作为操作系统的系统堆栈,用全局变量定义如下:
INT8U idata sp[64] at 0x30;该语句表示系统堆栈从30H开始.
(1)开始多任务调度每个任务堆栈初始化情况:
堆栈指针SP=48-1+8+5+2+2+sizeof(void*),即系统堆栈放入以上信息后SP指针所指的位置.
下面开始多任务调度:
系统堆栈指针SP初始值30H,将初始任务的任务堆栈内容(在xdata段)Load到系统堆栈内,完成后SP应指向系统堆栈栈顶,然后运用pop指令切换到初始任务.
(2)在任务运行中进行任务切换切换前系统堆栈为:
将系统堆栈中从当前SP开始一直到30H的堆栈信息保存到当前任务堆栈中,然后把新任务的任务堆栈的内容Load到系统堆栈中来.
然后用POP指令将任务切换到新任务中去.
(3)在中断返回时切换任务须保存的信息在中断时应保存,切换任务时,只要将SP减去由于调用OSIntExit()和OSIntCtxSw()两个函数而使SP指针增加的4个字节,其他与任务级切换一样.
共0条 [查看全部] 网友评论