【11】从0到1教你写uC/OS-III————>综合例程,任务创建测试

  1. 功能描述:
    1. 两个任务不停运行,flag1,flag2交替翻转,任务结束,切换另一任务;
  2. 主函数例程代码:
    #include "os.h"
    #include "ARMCM3.h"
    
    /*
    ************************************************************************************************************************
    *                                                  全局变量
    ************************************************************************************************************************
    */
    uint32_t    flag1;
    uint32_t    flag2;
    
    /*
    ************************************************************************************************************************
    *                                                  TCB & STACK & 任务声明
    ************************************************************************************************************************
    */
    #define TASK1_STK_SIZE      20      //任务栈大小
    #define TASK2_STK_SIZE      20
    
    static  CPU_STK     Task1Stk[TASK1_STK_SIZE];       //栈存储在数组里,地址自增/减
    static  CPU_STK     Task2Stk[TASK2_STK_SIZE];
    
    static  OS_TCB      Task1TCB;
    static  OS_TCB      Task2TCB;
    
    void Task1(void *p_arg);
    void Task2(void *p_arg);
    
    int main(void)
    {
        OS_ERR  err;
        
        OSInit(&err);   //初始化相关的全局变量
        
        OSTaskCreate(
                        (OS_TCB *)        &Task1TCB,
                        (OS_TASK_PTR)    Task1,
                        (void *)         0,
                        (CPU_STK*)       &Task1Stk[0],
                        (CPU_STK_SIZE)   TASK1_STK_SIZE,
                        (OS_ERR *)      &err
                     );
    
        OSTaskCreate(
                        (OS_TCB *)        &Task2TCB,
                        (OS_TASK_PTR)    Task2,
                        (void *)         0,
                        (CPU_STK*)       &Task2Stk[0],
                        (CPU_STK_SIZE)   TASK2_STK_SIZE,
                        (OS_ERR *)      &err
                     );
                                      
        OSRdyList[0].HeadPtr = &Task1TCB;
        OSRdyList[1].HeadPtr = &Task2TCB;
                    
             
        OSStrart(&err); //启动OS,无返回值  
    }
    
    void delay(uint32_t count)
    {
        for(;count!=0;count--);
    }
    
    void Task1(void *parg)
    {
        for(;;)
        {
            flag1 = 0;
            delay(100);
            flag1 = 1;
            delay(100);
            
            OSSched();
        }
    }
    
    void Task2(void *parg)
    {
        for(;;)
        {
            flag2 = 0;
            delay(100);
            flag2 = 1;
            delay(100);
            
            OSSched();
        }
    }

     

  3. 实现现象:
    1. 添加flag1,flag2到逻辑分析中:
    2.  
  4. 总结:
    1. 仿真时应把任务的堆栈、TCB、OSTCBCurPtr、OSTCBHighRdyPtr这些变量都添加到观察窗口,然后单步执行程序,看看这些变量是如何变化的,让机器执行代码的过程在自己的脑子里面过一遍;
    2. 推荐看“李述铜老师的《自己动手从0到1写嵌入式操作系统》”,思路清晰、过程简洁明了,非常适合想要深入学习RTOS的,附链接:https://edu.csdn.net/course/play/4605/82618?utm_source=blog2edu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值