• 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);
    }

  • 相关阅读:
    使用element-ui的table组件时,渲染为html格式
    vue-quill-editor富文本编辑器,添加了汉化样式却汉化不了
    MySQL版本问题导致的SQLException
    MySQL中 ORDER BY 与 LIMIT 的执行顺序
    MySQL 测试数据批量导入
    CentOS 7 安装 Maven
    CentOS 7 安装 Gradle
    CentOS 7 安装 RabbitMQ
    CentOS 7 安装 Tomcat 8.5.43
    CentOS 7 配置网络
  • 原文地址:https://www.cnblogs.com/skl374199080/p/3109266.html
Copyright © 2020-2023  润新知