lemonHe

主要关注FPGA信号处理和数字图像处理技术,欢迎交流 邮箱:heliminlemon@163.com

MicroCos操作系统及其实际应用【1】

0
阅读(1013)

我的开发环境: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的模板工程,如下图所示。

clip_image002

编译下载后,NIOS界面中打印出来

clip_image004

对工程稍作修改,可得到如下图所示效果。

clip_image006

工程模板对应.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到实际系统中。