嵌入式实时操作系统ucosII的学习(一)

嵌入式系统的开发领域,实时操作系统ucosii占据着相对比较重要的作用。为了深入了解实时操作系统的基本原理,开始认真学习下ucosii。主要是ucosii是开源的,并且网络资料相当丰富,学习起来很方便。

拿到开源的ucos的源码包之后,需要对编译环境进行配置,我使用Ubuntu16.04的操作系统,编译器使用交叉编译工具arm-linux-gcc,目标平台是友善之臂的mini2440开发板。配置交叉编译环境很简单,网上下载工具包,解压到相应位置,修改profile,export环境变量即可。

在mini2440开发板调试,需要移植ucos到mini2440平台,这里暂且忽略。

程序总是从hello world开始!哈哈。

编写一个简单的ucos应用程序:

#include "../include/includes.h"

#define TaskHelloStkLen 100

OS_STK TaskHelloStk[TaskHelloStkLen];

OS_STK  TaskMainStk[100];

#define TASK_HELLO_PRIO 5

int main(int argc, char **argv)
{
    BoardInit(); //board init;
    OSInit();    //ucos init;
    OSTimeSet(0);  //set system timetick count 0;
    OSTaskCreate(TaskMain, (void *)0, &TaskMainStk[99], 4);//create main task;
    OSStart(); //start schedule task;


    return 0;
}

void TaskMain(void *pdata)
{

#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif

  OS_ENTER_CRITICAL();
  Timer0Init(); /* Init Timer0,start timer0 */
  OS_EXIT_CRITICAL();

  OSTaskCreate(TaskHello, (void *)0, &TaskHelloStk[TaskHelloStkLen-1],TASK_HELLO_PRIO);
  while (1) {
    // Uart_SendString("\n running in main function\n");
    OSTimeDly(OS_TICKS_PER_SEC);
  }
}

void TaskHello (void *pdata)
{
  pdata = pdata;
  while (1) {
    Uart_Printf("hello world!\n");
    OSTimeDly(OS_TICKS_PER_SEC);
  }
}

编译成bin文件,下载到开发板,运行

结果:每秒钟输出一次hello world!

一个简单的ucos程序完成。

转载于:https://www.cnblogs.com/jamesLawblog/p/7792462.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  u C / O S 是一种公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,商业应用需要付费。   μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。   用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。   严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。   uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS-II工作原理   uC/OS-II是一种基于优先级的可抢先的硬实时内核。   要实现多任务机制,那么目标CPU必须具备一种在运行期更改PC的途径,否则无法做到切换。不幸的是,直接设置PC指针,目前还没有哪个CPU支持这样的指令。但是一般CPU都允许通过类似JMP,CALL这样的指令来间接的修改PC。我们的多任务机制的实现也正是基于这个出发点。事实上,我们使用CALL指令或者软中断指令来修改PC,主要是软中断。但在一些CPU上,并不存在软中断这样的概念,所以,我们在那些CPU上,使用几条PUSH指令加上一条CALL指令来模拟一次软中断的发生。   在uC/OS-II里,每个任务都有一个任务控制块(Task Control Block),这是一个比较复杂的数据结构。在任务控制快的偏移为0的地方,存储着一个指针,它记录了所属任务的专用堆栈地址。事实上,再uC/OS-II内,每个任务都有自己的专用堆栈,彼此之间不能侵犯。这点要求程序员再他们的程序中保证。一般的做法是把他们申明成静态数组。而且要申明成OS_STK类型。当任务有了自己的堆栈,那么就可以将每一个任务堆栈再那里记录到前面谈到的任务控制快偏移为0的地方。以后每当发生任务切换,系统必然会先进入一个中断,这一般是通过软中断或者时钟中断实现。然后系统会先把当前任务的堆栈地址保存起来,仅接着恢复要切换的任务的堆栈地址。由于哪个任务的堆栈里一定也存的是地址(还记得我们前面说过的,每当发生任务切换,系统必然会先进入一个中断,而一旦中断CPU就会把地址压入堆栈),这样,就达到了修改PC为下一个任务的地址的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值