MicroCos操作系统及其实际应用【1】
0赞我的开发环境:Quartus II 13.1 (64-Bit) + Nios II 13.1 Software Build Tools for Eclipse
由于工程项目比较复杂,需要在nios里进行的较复杂的操作,要进行一些非实时的计算操作、对指令进行解析等等。Microcos(后面简称ucos)是一个实时多任务内核,如果将工程项目的操作分多个,程序的调试维护会方便很多,下面先对ucos作简单的介绍,在此基础上,分析Eclipse中提供的Ucos例程。
Ucos是在1992年提出的一个嵌入式多任务实时系统,该系统是由c和汇编编写的,由于该系统的安全性和稳定性,目前已应用于上百个商业应用场合,并且已被移植到多个不同结构的处理器中。Altera公司将ucos移植到nios处理器上,Ucos内核在Nios的HAL(硬件抽象层,咱们自己写的c程序也是在HAL之上运行的)库之上进行操作。
前面已经说过,ucos是一个实时多任务操作系统,一个任务,可以理解为一个简单的程序。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行。运行态的任务是指该任务掌握CPU的控制权,正在运行中。挂起状态也可以叫做等待事件态WAITING,指该任务在等待,等待某一事件的发生,(例如等待某外设的I/O操作,等待某共享资源由暂不能使用变成能使用状态,等待定时脉冲的到来或等待超时信号的到来以结束目前的等待,等等)。最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。
对于ucos的使用,往往是在Eclipse中新建ucos的模板工程,如下图所示。
编译下载后,NIOS界面中打印出来
对工程稍作修改,可得到如下图所示效果。
工程模板对应.c源程序如下图所示
#include <stdio.h> #include "includes.h" /* Definition of Task Stacks */ #define TASK_STACKSIZE 2048 OS_STK task1_stk[TASK_STACKSIZE]; OS_STK task2_stk[TASK_STACKSIZE]; /* Definition of Task Priorities */ #define TASK1_PRIORITY 1 #define TASK2_PRIORITY 2 /* Prints "Hello World" and sleeps for three seconds */ void task1(void* pdata) { while (1) { printf("Hello from task1\n"); OSTimeDlyHMSM(0, 0, 3, 0); } } /* Prints "Hello World" and sleeps for three seconds */ void task2(void* pdata) { while (1) { printf("Hello from task2\n"); OSTimeDlyHMSM(0, 0, 3, 0); } } /* The main function creates two task and starts multi-tasking */ int main(void) { OSTaskCreateExt(task1, NULL, (void *)&task1_stk[TASK_STACKSIZE-1], TASK1_PRIORITY, TASK1_PRIORITY, task1_stk, TASK_STACKSIZE, NULL, 0); OSTaskCreateExt(task2, NULL, (void *)&task2_stk[TASK_STACKSIZE-1], TASK2_PRIORITY, TASK2_PRIORITY, task2_stk, TASK_STACKSIZE, NULL, 0); OSStart(); return 0; }
需介绍几个与任务相关的函数,结合前面对任务的描述,知道这几个函数的意思后,就可以很好地理解上述代码了。
(1) 建立任务,OSTaskCreateExt()
(2) 挂起任务,OSTaskSuspend()
指该任务在等待,等待某一事件的发生恢复任务
(3) OSTaskResume()
(4) 按时分秒延时函数OSTimeDlyHMSM()
下面再专门写博客对代码进行解析,并结合我的实际工程,讲讲如何应用ucos到实际系统中。