μC/OS-II的多任务系统实时性分析与优先级分配
[11-20 15:54:31] 来源:http://www.88dzw.com arm嵌入式 阅读:8640次
文章摘要:每个任务必须有自己的任务栈,任务栈由系统物理栈拷贝区和模拟栈两部分组成,是μC/OS-II移植的核心内容[3-4],因此任务的多少直接影响数据RAM的需求。在本系统中,物理栈拷贝区为64字节,模拟栈可以安排16~64字节,这种可变大小任务栈稍后分析。C8051F120微处理器带有8 KB的RAM,系统没有扩展外部数据存储器。首先分析一下系统数据内存的需求情况:① 系统显示部分使用了240×128点阵的LCD模块和图形GUI,如果建立完整的显示缓冲区,需要240/8×128=3 840字节,约4 KB的RAM空间;② Flash除了用作程序存储器外,剩下的部分作为非易失性数据存储器。每个Flas
μC/OS-II的多任务系统实时性分析与优先级分配,标签:arm嵌入式系统,arm系统,http://www.88dzw.com每个任务必须有自己的任务栈,任务栈由系统物理栈拷贝区和模拟栈两部分组成,是μC/OS-II移植的核心内容[3-4],因此任务的多少直接影响数据RAM的需求。在本系统中,物理栈拷贝区为64字节,模拟栈可以安排16~64字节,这种可变大小任务栈稍后分析。
C8051F120微处理器带有8 KB的RAM,系统没有扩展外部数据存储器。首先分析一下系统数据内存的需求情况:
① 系统显示部分使用了240×128点阵的LCD模块和图形GUI,如果建立完整的显示缓冲区,需要240/8×128=3 840字节,约4 KB的RAM空间;
② Flash除了用作程序存储器外,剩下的部分作为非易失性数据存储器。每个Flash块为1 KB,故需要1 KB的RAM作为Flash的读写缓冲区;
③ GUI自身约占去了1 KB内存;
④ 传感器响应曲线需打印,其点坐标数据(对应打印机384个点行)约占1 KB。
以上共占用7 KB,最终仅剩下1 KB的RAM留给操作系统以及用户函数,这显然不够。可通过优化GUI的驱动,去掉LCD的显示缓冲区,增加4 KB的RAM,以满足系统需要。
3 可变任务栈和任务划分
3.1 可变大小任务栈
一般来说,一个嵌入式系统中不会建立60个以上的任务。从简单的角度考虑,应用μC/OS-II时,建立的所有任务均驻留不删除,使用足够大并且同样大小的堆栈。这种处理任务的方法会对内存数量提出较高要求。例如50个任务,每个任务栈均为128字节,则需要6 KB的RAM。
本着这样一个原则来改进任务划分:不需要驻留的任务运行完毕即删除,可以自身删除,也可以在别的任务里删除。这种任务处理不仅可以重用任务优先级,还可以重用任务堆栈,并且减少同时运行的任务数量。
删除任务的办法不仅可获得共享的任务栈资源,而且也是一个方便中止某些应用程序的手段,前面提及的任何测试阶段按Exit键退出所有测试的动作,就可以依靠删除任务来实现。
把任务看作有大小的,这里的“大小”指需要“重入”到任务堆栈的变量的数量。如果每一个任务都使用相同大小的任务栈,对小任务而言显然是在浪费宝贵的RAM,大小可变的任务栈才是经济合理的。
首先,在os_cfg.h头文件中增加大、小两个宏参数,如果需要更多不同的栈大小,还可以继续增加参数。
#define MaxStkSize128//大任务栈
#define MinStkSize80//小任务栈
然后定义任务栈时使用它们:
OS_STK TaskDelStk1[MinStkSize];
OS_STK TaskDelStk2[MaxStkSize];
TaskDelStk1和TaskDelStk2是两个可删除任务所使用的任务栈,一个80字节,另一个128字节。
接下来是关键,要在任务堆栈初始化函数OSTaskStkInit中进行处理:定义一个全局整型变量STK_SIZE,创建任务前给它赋值,任务创建时执行的OSTaskStkInit函数用它来初始化模拟栈的长度。
修改前,OSTaskStkInit中的?C_XBP仿真堆栈指针(即模拟栈指针)的初始化语句如下:
*stk++ = (INT16U) (ptos + MaxStkSize) >> 8;//MaxStkSize是固定的栈长度
*stk++ = (INT16U) (ptos + MaxStkSize) & 0xFF;
注意:ptos是任务栈栈底,模拟栈从任务堆栈的另一头开始。
修改后变为:
*stk++ = (INT16U) (ptos + STK_SIZE) >> 8;//指针高8位
*stk++ = (INT16U) (ptos + STK_SIZE) & 0xFF;//指针低8位
创建任务前要给STK_SIZE赋予堆栈定义匹配的栈长度值,否则,会因为堆栈不能正确初始化导致任务崩溃。不同大小的任务栈结构如图2所示,可以看出区别在于模拟栈不同。
图2 可变大小任务栈结构
利用可变大小任务栈创建一个小堆栈任务,示例如下:
STK_SIZE=MinStkSize;//提供堆栈大小值
/*创建带TimeLimit参数的,分配有任务栈TaskDelStk1,优先级为10的任务OverTime*/
《μC/OS-II的多任务系统实时性分析与优先级分配》相关文章
- › 驱动器和通信电路引脚及主要特性COM9004 同轴接收器/发送器
- › 芯片引脚及主要特性COP888CLMH,8位微控制器
- › 芯片引脚及主要特性COP888CGP/884CGP,8位微控制器
- › 芯片引脚及主要特性COP888CGMH,8位微控制器
- › 芯片引脚及主要特性COP888CFMH,8位微控制器
- › 芯片引脚及主要特性COP888CF,8位微控制器
- 在百度中搜索相关文章:μC/OS-II的多任务系统实时性分析与优先级分配
- 在谷歌中搜索相关文章:μC/OS-II的多任务系统实时性分析与优先级分配
- 在soso中搜索相关文章:μC/OS-II的多任务系统实时性分析与优先级分配
- 在搜狗中搜索相关文章:μC/OS-II的多任务系统实时性分析与优先级分配