zoukankan      html  css  js  c++  java
  • uc/osII的启动流程

    uc/os-II的启动流程:

    1 在程序中分配工作堆栈:
    分配工作堆栈的主要目的是为工作执行时的参数,堆栈提供存放和访问空间。我们可以通过定义数组 unsigned int StackX[STACKSIZE],并

    在工作启动时传送该数组完成工作堆栈的初始化。
       eg :
    unsigned int StackX【STACKSIZE】;

    2 建立工作函数体:
    函数体中包含的内容有参数的定义以及初始化;功能函数或者是指令语句;设定工作挂起时间间隔。
       eg : 
    void Task4(void *Id)
        {
            变量的定义以及初始化
            功能函数或者指令语句
            OSTimerDly(100);//任务挂起时间间隔
        }

    3 描述启动工作:
       传送工作函数的地址,工作堆栈的地址,工作的优先顺序。
        eg :
    void TaskStart(void *Id)
        {
            .......
            char Id4='4';
            .......
            OSTaskCreate(Task4,(void *)0,&Stack4[STACKSIZE-1],5);
            .......
        }

    4 在main()函数体中完成启动流程:
       主要包括执行工作前硬件的初始化,作业系统的初始化,启动定时中断,启动工作等等。
        eg :
    void main(void)
        {
    初始化系统的硬件
    OSInit();//uCOS的初始化
    任务的建立,消息机制的建立
    OSStart();//开始多任务的调度,作业系统开始运作
        }

    一个简单的例子:

    //定义工作任务,并为任务堆栈分配内存空间
    #define STACKSIZE 64

    unsigned int Stack1[STACKSIZE];
    unsigned int Stack2[STACKSIZE];
    unsigned int Stack3[STACKSIZE];
    unsigned int StackMain[STACKSIZE];
    /**********************************************/
    *工作名称: Task1 
    *功能:     工作1完成LED指示灯的闪烁
    *参数:     Id---输入,工作标识
    /**********************************************/
    void Task1(void *Id)
    {
       while(1)
       {
        leds_on();
        OSTimeDly(300);
        leds_off();
        OSTimeDly(130);
       }
    }

    /**********************************************/
    *工作名称: Task2 
    *功能:     工作2完成8段数码管的循环显示
    *参数:     Id---输入,工作标识
    /**********************************************/
    void Task2(void *Id)
    {
       int i;
       while(1)
       {
        for(i=0;i<16;i++)
        {
         Digit_Led_Symbol(i);
         OSTimeDly(150);
        }
       }

    }

    /**********************************************/
    *工作名称: Task3 
    *功能:     工作3完成计数,并显示
    *参数:     Id---输入,工作标识
    /**********************************************/
    void Task3(void *Id)
    {
       int i=0;
       while(1)
       {
        i++;
        uHALr_printf(" %d \r",i);
        OSTimeDly(90);
       }
    }

    /**********************************************/
    *工作名称: TaskStart 
    *功能:     主工作完成启动三个工作的功能
    *参数:     Id---输入,工作标识
    /**********************************************/
    void TaskStart(void *Id)
    {
       char Id1='1';
       char Id2='2';
       char Id3='3';
      
       uHALr_InitTimers();//使能计时器计数中断

    //建立uc/OS工作,同时赋予工作的优先顺序,数字越小,优先级就越高
       OSTaskCreate(Task1,(void *)&Id1,&Stack1[STACKSIZE-1],2);
       OSTaskCreate(Task2,(void *)&Id2,&Stack2[STACKSIZE-1],3);
       OSTaskCreate(Task3,(void *)&Id3,&Stack3[STACKSIZE-1],4);

    //删除当前的任务
       OSTaskDel(OS_PRIO_SELF);

    }

    /**********************************************/
    *工作名称: Main
    *功能:     主函数完成硬件的初始化,作业系统的初始化,启动定时中断,启动工作
    /**********************************************/

    int Main(void)
    {
    char Id0='0';

    ARMTargeInit();//硬件的初始化,主要是指目标板的初始化

    OSInit();//uc/os的初始化

    OSTimeSet(0);//系统时间的设定

    //建立主工作
    OSTaskCreate(TaskStart,(void *)&Id0,&StackMain[STACKSIZE-1],0);

    ARMTargetStart();//启动定时中断

    OSStart();//启动作业系统,开始多任务的调度!

    return(0);
    }

  • 相关阅读:
    Scrapy 扩展中间件: 针对特定响应状态码,使用代理重新请求
    Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL
    Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误
    Scrapyd 改进第二步: Web Interface 添加 STOP 和 START 超链接, 一键调用 Scrapyd API
    简单示例理解神闭包
    ejs 模板使用方法
    我使用的开源组件汇总,以备学习使用
    了不起的Node.js--之五 TCP连接
    Windows7下Java运行时环境搭建
    了不起的Node.js--之四
  • 原文地址:https://www.cnblogs.com/skl374199080/p/3109266.html
Copyright © 2011-2022 走看看