1. 程式人生 > >NIOS2隨筆——uCOS-II實時操作系統

NIOS2隨筆——uCOS-II實時操作系統

ucos-ii nios2

1. 概述

本設計采用NIOS2 32位處理器,實現uCOS-II實時操作系統的使用,實現兩個任務同時運行,一個LED閃爍,一個串口打印。硬件平臺采用ETree的開發板(某寶提供),如下圖所示:

技術分享

2. uCOS-II簡介

μC/OS 和μC/OS-II 是專門為計算機的嵌入式應用設計的, 絕大部分代碼是用C語言編寫的。

uC/OS-II中最多可以支持64個任務,分別對應優先級0~63,其中0 為最高優先級。系統保留了4個最高優先級的任務和4個最低優先級的任務,所有用戶可以使用的任務數有56個。

uC/OS-II提供了任務管理的各種函數調用,包括創建任務,刪除任務,改變任務的優先級,任務掛起和恢復等。

要使uC/OS-II正常運行,處理器必須滿足以下要求:

  • 處理器的C編譯器能產生可重入型代碼;

  • 處理器支持中斷,並且能產生定時器中斷;

  • 用C語言可以開/關中斷;

  • 處理器有一定數量的數據存儲器;

  • 處理器有將堆棧指針以及其他CPU寄存器的內容讀出、並存儲到堆棧或內存中的指令。

顯然NIOS2處理器符合上述要求,從處理器硬件角度看Nios2需要一定數量的內存空間(SDRAM的空間足夠大)、需要一個定時器(添加定時器組件)。

3. Qsys平臺搭建

在Qsys平臺上添加Interval Timer組件,配置相關參數,如下圖所示。

技術分享

添加完Timer組件的Qsys系統如下圖所示。

技術分享

4. NIOS2軟件設計

新建NIOS SBT工程,輸入軟件工程名‘nios2_ucos’,在project template中選擇‘Hello-MicroC/OS-II’,如下圖所示。

技術分享

軟件設計兩個任務,一個任務使LED每隔一秒閃一次,另一個任務每隔一秒在串口終端打印一次"Hello from task2\n",具體代碼如下:

#include <stdio.h>
#include "includes.h"
#include <io.h>
#include <system.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)
  { 
      IOWR(PIO_0_BASE,0,1);         //LED ON
      OSTimeDlyHMSM(0, 0, 0, 500);  //hour/minute/second/millisecond
      IOWR(PIO_0_BASE,0,0);         //LED OFF
      OSTimeDlyHMSM(0, 0, 0, 500);  //hour/minute/second/millisecond
  }
}
/* Prints "Hello World" and sleeps for three seconds */
void task2(void* pdata)
{
  while (1)
  { 
    printf("Hello from task2\n");
    OSTimeDlyHMSM(0, 0, 1, 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;
}

5. 編譯運行

右擊工程nios2_ucos,選擇Build Project。編譯完後,下載FPGA配置文件,再右擊工程nios2_ucos,選擇Run As | Nios II Hardware。FPGA開發板LED每隔一秒閃一次,Nios II Console每隔一秒打印一次“Hello from task2”。

技術分享



本文出自 “shugenyin的博客” 博客,請務必保留此出處http://shugenyin.blog.51cto.com/4259554/1970272

NIOS2隨筆——uCOS-II實時操作系統