uC/OS-II(又名Micro C/OS)是基于嵌入式系统的完整的,可移植、可固化、可裁剪的可剥夺型实时内核,其已经广泛应用在航空飞行器、医疗设备、工业控制等可靠性和稳定性要求较高的场合。该内核的代码也是完全开源的,如果不做商业用途,完全免费。因此对于广大的嵌入式爱好者与工程师们而言,了解OS从uC/OS-II开始不失为一个很好的选择。
         特权同学最近在一边狂啃邵贝贝翻译的《嵌入式实时操作系统uC/OS-II》,一边动手在NIOS II上做一些实践,加深理解和认识。
         拿来自己设计的SF-NIOS2开发套件,使用第3个工程实例(《爱上FPGA开发》第6章的SOPC工程)进行了EDS上的uC/OS-II样板工程测试,对uC/OS-II有一个更感性的认识和体验。废话少说,简单的描述下整个实例过程,也算给手头拥有SF-NIOS2套件的朋友一个参考吧。
 
SOPC硬件修改
         第3个SOPC工程硬件框图如图1所示。在此基础上,咱们需要添加一个10ms定时器,用于作为uC/OS-II的时钟节拍(Clock tick)。
图1
         首先复制第3个工程实例,修改工程文件夹名为nios2ucosii,接着打开工程的SOPC Builder编辑界面,添加一个Interval Timer外设,设置该Timer的定时Period为10ms,如图2所示。
图2
         修改该Timer外设名称为ucosii_timer。
图3
         重新分配地址,如图4所示,点击SystemàAssign Base Addresses。接着点击右下角的Generate生成新的系统。
图4
         完成SOPC新系统的Generate,接着重新编译Quartus II的project。自此,硬件的修改已经就绪。
 
软件工程创建
         如图5所示,打开EDS后,点击FileàNewàNios II Application and BSP from Template新建模板工程。
图5
         如图6所示,在新建工程向导中,选择SOPC Information File name为当前工程目录下的sopcinfo文件。Project name命名为myucosii_prj,选择Project template为Hello MicroC/OS II。最后点击Finish创建工程。
图6
         新建工程出现在工程管理窗口后,右键单击myucosii_prj文件夹,选择NIOS IIàBSP Editor,如图7所示。
图7
         确定Main页面中Common里面的stderr/stdin/stdout均为jtag_uart,sys_clk_timer为ucosii_timer即可。点击Generate更新设置。
图8
         右键点击应用工程,选择Build Project进行软件工程编译。完成后Console窗口打印如图9所示的信息,可见这个uC/OS-II内核以及软件的HAL占用了大约101KB的存储空间,uC/OS-II其实还是很小的,只不过NIOS II各种外设的HAL比较大,不过也都是可以裁剪的。
图9
 
uC/OS-II运行调试
         首先将Quartus II工程产生的sof硬件配置文件烧录到FPGA中。
         接着如图10所示,在线运行uC/OS-II实例工程。
图10
         这个uC/OS-II工程的实验目的只是创建两个task分别打印一串字符,正如readme所描述:
Readme - Hello MicroC/OS-II Hello Software Example
 
Hello_uosii is a simple hello world program running MicroC/OS-II. The
purpose of the design is to be a very simple application that just
demonstrates MicroC/OS-II running on NIOS II. The design doesn't account
for issues such as checking system call return codes. etc.
 
         在NIOS II Console中,我们可以看到最终运行的效果,如图11所示,两个任务所打印的字符串”Hello from task1”和”Hello from task2”循环出现。
图11
 
         主要实例源码如下:
#include
#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;
}
 
         源码中,一个标准的uC/OS-II工程,实际上应该是初始化时调用OSInit();函数,最后调用OSStart();函数。这里的main函数里虽然没有调用OSInit();函数,实际上在HAL后台外设初始化时候肯定调用了。中间是任务的创建,这里创建两个任务task1和task2,优先级分别为1和2,并且分配了相应的堆栈空间。在两个任务中,分别打印字符串”Hello from task1”和”Hello from task2”,字符串打印后调用OSTimeDlyHMSM(0, 0, 3, 0);函数做了3s的延时。如果修改这个延时时间,打印效果会发生改变,根据延时的情况,Console窗口出现的打印字样频率和速度会不一样。
         NIOS II上的uC/OS-II移植,就这么简单。

每天进步一点点------SOPC的uC/OS-II应用(一)的更多相关文章

  1. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  2. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  3. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  4. uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

    1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.    ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

  7. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  8. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  9. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

随机推荐

  1. CF1237F Balanced Domino Placements

    题意 给定一个 \(h\) 行 \(w\) 列的方格图,上面已经放置了一些 \(1\times 2\) 的多米诺骨牌. 我们称一个放置多米诺骨牌的方案是好的,当且仅当任何两个多米诺骨牌不占用相同的行与 ...

  2. 论文阅读笔记(八)【IEEEAccess2019】:High-Resolution and Low-Resolution Video Person Re-Identification: A Benchmark

    Introduction (1)Motivation: 监控视频中的行人,有的比较清晰,有的因为距离较远非常模糊. 在高低分辨率方面的行人重识别缺乏数据集和研究. (2)Contribution: ① ...

  3. 两个html页面之间传值

    参考网址:https://blog.csdn.net/csdn_ds/article/details/78393564?locationNum=8&fps=1

  4. react-native构建基本页面2---轮播图+九宫格

    配置首页的轮播图 轮播图官网 运行npm i react-native-swiper --save安装轮播图组件 导入轮播图组件import Swiper from 'react-native-swi ...

  5. mysql 服务

    1.以管理员身份运行cmd:C:\Windows\System32\cmd.exe  右键以管理员身份运行 2.“具体路径” --install   “D:\programme installatio ...

  6. mysql批量插入数据uuid去重

    update base_problem set uuid=replace(uuid(),'-',''); update base_problem set uuid = UUID() where uui ...

  7. 解决Office2016输入失效密钥之后无法输入的问题

    第一步: 以管理员的身份运行cmd 第二步输入以下命令: cscript "C:\Program Files (x86)\Microsoft Office\Office16\OSPP.VBS ...

  8. numpy 一些知识

    import numpy as np 什么类型的相加,返回的还是什么类型的,所以在累加小类型的数值时会出现问题如下: a=np.array([123,232,221], dtype=np.uint8) ...

  9. 如何在vivado中调用ultraedit 编辑器

    ISE下点击菜单Edit -> Preferences -> Editor. 在Editor选项框里选择Custom,在Command line syntax文本框里输入: {C:/Pro ...

  10. codeforces 1284C. New Year and Permutation(组合数学)

    链接:https://codeforces.com/problemset/problem/1284/C 题意:定义一个framed segment,在区间[l,r]中,max值-min值 = r - ...