NIOS2随笔——uCOS-II实时操作系统

简介:

1. 概述

本设计采用NIOS2 32位处理器,实现uCOS-II实时操作系统的使用,实现两个任务同时运行,一个LED闪烁,一个串口打印。硬件平台采用ETree的开发板(某宝提供),如下图所示:

wKioL1nS7XvzbilaAADr3SzO-vA834.jpg-wh_50

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组件,配置相关参数,如下图所示。

wKiom1nS7syyOzRjAACB0GUPRxQ001.jpg-wh_50

添加完Timer组件的Qsys系统如下图所示。

wKiom1nS7yHhDC4FAAD5RVbGNuY808.jpg

4. NIOS2软件设计

新建NIOS SBT工程,输入软件工程名‘nios2_ucos’,在project template中选择‘Hello-MicroC/OS-II’,如下图所示。

wKioL1nS71njytQ0AAEVDmO85AA375.jpg

软件设计两个任务,一个任务使LED每隔一秒闪一次,另一个任务每隔一秒在串口终端打印一次"Hello from task2\n",具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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”。

wKiom1nS8H6Sa_AuAAByeZHymrw510.jpg-wh_50


本文转自 shugenyin 51CTO博客,原文链接:http://blog.51cto.com/shugenyin/1970272


相关文章
|
12月前
|
API
FreeRTOS学习笔记—FreeRTOS移植
本文学习了如何移植FreeRTOS到自己的STM32工程。最后,根据正点原子提供的测试main函数,测试了移植效果。
454 0
FreeRTOS学习笔记—FreeRTOS移植
|
Linux
Linux驱动开发(按键驱动)
Linux驱动开发(按键驱动)
142 0
|
存储 Linux 数据安全/隐私保护
ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析
ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析
970 0
ZYNQ - 嵌入式Linux开发 -10- ZYNQ启动流程分析
|
物联网 Java 编译器
嵌入式操作系统——uCOS
嵌入式操作系统——uCOS
580 0
|
Ubuntu Linux 编译器
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
190 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
|
Linux 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十四)具体单板的GPIO操作方法
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十四)具体单板的GPIO操作方法
154 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十四)具体单板的GPIO操作方法
|
Linux 调度 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十七)多线程编程(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十七)多线程编程
294 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十七)多线程编程(上)
|
Linux API 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十七)多线程编程(下)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十七)多线程编程
354 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十七)多线程编程(下)
|
Ubuntu Linux Shell
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程
412 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十八)串口编程(上)
|
存储 缓存 异构计算
ZYNQ裸板:BRAM篇
在 ZYNQ SOC 开发过程中, PL 和 PS 之间经常需要做数据交互。对于传输速度要求较高、数据量大、地址连续的场合,可以通过 AXI DMA 来完成。而对于数据量较少、地址不连续、长度不规则的情况,此时 AXIDMA 便不再适用了。针对这种情况,可以通过 BRAM 来进行数据的交互。
864 0