• UCOSIII 调不通的看过来,一个文件干到底,原理流程一目了然 STM32F103C8T6


    #include "stm32f10x.h"
    #include "includes.h"

    //定义启动任务的优先级
    #define START_TASK_PRIO                          3

    /*************************************************************************************************************/
    //UCOSIII中以下优先级用户程序不能使用,ALIENTEK
    //将这些优先级分配给了UCOSIII的5个系统内部任务
    //优先级0:中断服务服务管理任务 OS_IntQTask()
    //优先级1:时钟节拍任务 OS_TickTask()
    //优先级2:定时任务 OS_TmrTask()
    //优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
    //优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
    //定义任务的优先级
    #define  APP_TASK_1_PRIO                         4
    #define  APP_TASK_2_PRIO                         5
    #define  APP_TASK_3_PRIO                         6
    #define  APP_TASK_4_PRIO                         7
    #define  APP_TASK_5_PRIO                         8
    #define  APP_TASK_6_PRIO                         9
    #define  APP_TASK_7_PRIO                         10
    #define  APP_TASK_8_PRIO                         11
    #define  APP_TASK_9_PRIO                         12
    #define  APP_TASK_10_PRIO                        13
    #define  APP_TASK_11_PRIO                        14
    #define  APP_TASK_12_PRIO                        15

    //定义启动任务堆栈的大小
    #define START_TASK_SIZE                          64

    //定义任务堆栈的大小
    #define  APP_TASK_1_STK_SIZE                     64
    #define  APP_TASK_2_STK_SIZE                     64
    #define  APP_TASK_3_STK_SIZE                     64
    #define  APP_TASK_4_STK_SIZE                     64
    #define  APP_TASK_5_STK_SIZE                     128
    #define  APP_TASK_6_STK_SIZE                     128
    #define  APP_TASK_7_STK_SIZE                     128
    #define  APP_TASK_8_STK_SIZE                     128
    #define  APP_TASK_9_STK_SIZE                     256
    #define  APP_TASK_10_STK_SIZE                    256
    #define  APP_TASK_11_STK_SIZE                    512
    #define  APP_TASK_12_STK_SIZE                    512

    /*定义启动任务控制块*/
    static OS_TCB StartTaskTcb;

    /*定义任务控制块*/
    static OS_TCB       AppTask1TCB;
    static OS_TCB       AppTask2TCB;
    static OS_TCB       AppTask3TCB;
    static OS_TCB       AppTask4TCB;
    static OS_TCB       AppTask5TCB;
    static OS_TCB       AppTask6TCB;
    static OS_TCB       AppTask7TCB;
    static OS_TCB       AppTask8TCB;
    static OS_TCB       AppTask9TCB;
    static OS_TCB       AppTask10TCB;
    static OS_TCB       AppTask11TCB;
    static OS_TCB       AppTask12TCB;

    ////定义启动任务堆栈
    static CPU_STK START_TASK_STK[START_TASK_SIZE];

    /**定义任务堆栈     堆栈的大小一定要合适,太大会撑爆内存导致死机,但是至少64,否则这个任务也添加不成功不会执行 **/
    static CPU_STK      AppTask1STK[APP_TASK_1_STK_SIZE];
    static CPU_STK      AppTask2STK[APP_TASK_2_STK_SIZE];
    static CPU_STK      AppTask3STK[APP_TASK_3_STK_SIZE];
    static CPU_STK      AppTask4STK[APP_TASK_4_STK_SIZE];
    static CPU_STK      AppTask5STK[APP_TASK_5_STK_SIZE];
    static CPU_STK      AppTask6STK[APP_TASK_6_STK_SIZE];
    static CPU_STK      AppTask7STK[APP_TASK_7_STK_SIZE];
    static CPU_STK      AppTask8STK[APP_TASK_8_STK_SIZE];
    static CPU_STK      AppTask9STK[APP_TASK_9_STK_SIZE];
    static CPU_STK      AppTask10STK[APP_TASK_10_STK_SIZE];
    static CPU_STK      AppTask11STK[APP_TASK_11_STK_SIZE];
    static CPU_STK      AppTask12STK[APP_TASK_12_STK_SIZE];


    /*定义定时器1*/
    OS_TMR tmr1;

    /*定义定时器1*/
    OS_TMR tmr2;

    /*定义定时器1*/
    OS_TMR tmr3;

    //systick中断服务函数,使用ucos时用到
    void SysTick_Handler(void)
    {
        if (OSRunning == 1)  //OS是否运行标记,0,不运行;1,在运行 OS开始跑了,才执行正常的调度处理
        {
            OSIntEnter();           //进入中断
            OSTimeTick();            //调用ucos的时钟服务程序
            OSIntExit();              //触发任务切换软中断
        }
    }

    void led_init() {

        GPIO_InitTypeDef GPIO_InitStructure1;//定义结构体
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);//GPIOB外部时钟使能,特别重要!!!
        GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_All;//设置IO口
        GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_Out_PP;//设置为普通推挽输出
        GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;//频率50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure1);//初始化
        GPIO_SetBits(GPIOA, GPIO_Pin_All);

        GPIO_InitTypeDef GPIO_InitStructure2;//定义结构体
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);//GPIOB外部时钟使能,特别重要!!!
        GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_All;//设置IO口
        GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_Out_PP;//设置为普通推挽输出
        GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;//频率50MHz
        GPIO_Init(GPIOB, &GPIO_InitStructure2);//初始化
        GPIO_SetBits(GPIOB, GPIO_Pin_All);
    }

    //定时器1回调函数
    void tmr1_callback(void *p_tmr, void *p_arg)
    {
        if( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
            GPIO_SetBits(GPIOA, GPIO_Pin_0);
        else  GPIO_ResetBits(GPIOA, GPIO_Pin_0);
    }

    //定时器1回调函数
    void tmr2_callback(void *p_tmr, void *p_arg)
    {
        if( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
            GPIO_SetBits(GPIOA, GPIO_Pin_1);
        else  GPIO_ResetBits(GPIOA, GPIO_Pin_1);
    }

    //定时器1回调函数
    void tmr3_callback(void *p_tmr, void *p_arg)
    {
       if( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==0)
            GPIO_SetBits(GPIOA, GPIO_Pin_2);
        else  GPIO_ResetBits(GPIOA, GPIO_Pin_2);
    }

    /***********************************************void tmrx_callback(void *p_tmr, void *p_arg).......********************************************/


    /*Task1*/
    void task_1(void * parm) {
        OS_ERR err;// 错误的返回
        (void )parm;

        while(1) {
            OSTimeDly(15, OS_OPT_TIME_DLY, &err);
            GPIO_SetBits(GPIOB, GPIO_Pin_0); //  高电平
            OSTimeDly(15, OS_OPT_TIME_DLY, &err);
            GPIO_ResetBits(GPIOB, GPIO_Pin_0); //  低电平
        }
    }

    /*Task2*/
    void task_2(void * parm) {
        OS_ERR err;// 错误的返回
        (void )parm;

        while(1) {
            OSTimeDly(10, OS_OPT_TIME_DLY, &err);
            GPIO_SetBits(GPIOC, GPIO_Pin_1); //  高电平
            OSTimeDly(10, OS_OPT_TIME_DLY, &err);
            GPIO_ResetBits(GPIOC, GPIO_Pin_1); //  低电平
        }
    }

    /*Task3*/
    void task_3(void * parm) {
          OS_ERR err;// 错误的返回
        (void )parm;

        while(1) {
            OSTimeDly(5, OS_OPT_TIME_DLY, &err);
            GPIO_SetBits(GPIOC, GPIO_Pin_2); //  高电平
            OSTimeDly(5, OS_OPT_TIME_DLY, &err);
            GPIO_ResetBits(GPIOC, GPIO_Pin_2); //  低电平
        }
    }

    /***********************************************void task_x(void * parm) .......********************************************/


    //开始任务控制函数
    void start_task(volatile void *p_arg)
    {
        OS_ERR err;// 错误的返回
        p_arg = p_arg;

    #if OS_CFG_STAT_TASK_EN > 0u
        OSStatTaskCPUUsageInit(&err);   //统计任务
    #endif

    #ifdef CPU_CFG_INT_DIS_MEAS_EN  //如果使能了测量中断关闭时间
        CPU_IntDisMeasMaxCurReset();
    #endif

    #if OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候
        //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
        OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
    #endif

        CPU_SR_ALLOC();
        OS_CRITICAL_ENTER();//进入临界区代码保护

        /*创建软件定时器1*************************************************************************/
        OSTmrCreate ((OS_TMR             *)&tmr1,
                     (CPU_CHAR             *)"tmr1_led",
                     (OS_TICK               )0,//初始延迟为1*10ms
                     (OS_TICK               )50,//定时周期为50*10ms
                     (OS_OPT                )OS_OPT_TMR_PERIODIC,//周期模式
                     (OS_TMR_CALLBACK_PTR   )tmr1_callback,
                     (void                 *)0,
                     (OS_ERR               *)&err);
        OSTmrStart(&tmr1,&err);
        /*创建软件定时器1*************************************************************************/
            
            
        /*创建软件定时器1*************************************************************************/
        OSTmrCreate ((OS_TMR             *)&tmr2,
                     (CPU_CHAR             *)"tmr2_led",
                     (OS_TICK               )0,//初始延迟为1*10ms
                     (OS_TICK               )50,//定时周期为50*10ms
                     (OS_OPT                )OS_OPT_TMR_PERIODIC,//周期模式
                     (OS_TMR_CALLBACK_PTR   )tmr2_callback,
                     (void                 *)0,
                     (OS_ERR               *)&err);
        OSTmrStart(&tmr2,&err);
        /*创建软件定时器1*************************************************************************/
            
            
        /*创建软件定时器1*************************************************************************/
        OSTmrCreate ((OS_TMR             *)&tmr3,
                     (CPU_CHAR             *)"tmr3_led",
                     (OS_TICK               )0,//初始延迟为1*10ms
                     (OS_TICK               )2,//定时周期为50*10ms
                     (OS_OPT                )OS_OPT_TMR_PERIODIC,//周期模式
                     (OS_TMR_CALLBACK_PTR   )tmr3_callback,
                     (void                 *)0,
                     (OS_ERR               *)&err);
        OSTmrStart(&tmr3,&err);
        /*创建软件定时器1*************************************************************************/


        /*tast1**********************************************************************************/
        OSTaskCreate((OS_TCB     *)&AppTask1TCB, /**任务控制快*/
                     (CPU_CHAR   *)"start_task",/**任务名字*/
                     (OS_TASK_PTR ) task_1,/**任务函数*/
                     (void       *) 0,/**传递给任务函数的参数,通常不用这个参数,设置为0*/
                     (OS_PRIO     ) APP_TASK_1_PRIO,/**任务优先级*/
                     (CPU_STK    *)&AppTask1STK[0],/**任务堆栈基地址*/
                     (CPU_STK_SIZE) APP_TASK_1_STK_SIZE / 10,/**任务堆栈界限,一般为1/10*/
                     (CPU_STK_SIZE) APP_TASK_1_STK_SIZE,/**任务堆栈大小*/
                     (OS_MSG_QTY  ) 5u,/**任务内部消息队列可以接受的最大消息数目,为0时禁止接受,这个参数具体使用,看消息队列的讲解*/
                     (OS_TICK     ) 0u,/**时间片轮转时的时间片数,为0时为默认长度,具体看时间片的讲解*/
                     (void       *) 0,/**用户补充的存储区,一般不用*/
                     (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),/**任务选项*/
                     (OS_ERR     *)&err);/**保存错误返回值,当创建不成功时会返回错误类型*/
        /*tast1**********************************************************************************/

        /*tast2**********************************************************************************/
        OSTaskCreate((OS_TCB     *)&AppTask2TCB, /**任务控制快*/
                     (CPU_CHAR   *)"start_task",/**任务名字*/
                     (OS_TASK_PTR ) task_2,/**任务函数*/
                     (void       *) 0,/**传递给任务函数的参数,通常不用这个参数,设置为0*/
                     (OS_PRIO     ) APP_TASK_2_PRIO,/**任务优先级*/
                     (CPU_STK    *)&AppTask2STK[0],/**任务堆栈基地址*/
                     (CPU_STK_SIZE) APP_TASK_2_STK_SIZE / 10,/**任务堆栈界限,一般为1/10*/
                     (CPU_STK_SIZE) APP_TASK_2_STK_SIZE,/**任务堆栈大小*/
                     (OS_MSG_QTY  ) 5u,/**任务内部消息队列可以接受的最大消息数目,为0时禁止接受,这个参数具体使用,看消息队列的讲解*/
                     (OS_TICK     ) 0u,/**时间片轮转时的时间片数,为0时为默认长度,具体看时间片的讲解*/
                     (void       *) 0,/**用户补充的存储区,一般不用*/
                     (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),/**任务选项*/
                     (OS_ERR     *)&err);/**保存错误返回值,当创建不成功时会返回错误类型*/
        /*tast2**********************************************************************************/

        /*tast3**********************************************************************************/
        OSTaskCreate((OS_TCB     *)&AppTask3TCB, /**任务控制快*/
                     (CPU_CHAR   *)"start_task",/**任务名字*/
                     (OS_TASK_PTR ) task_3,/**任务函数*/
                     (void       *) 0,/**传递给任务函数的参数,通常不用这个参数,设置为0*/
                     (OS_PRIO     ) APP_TASK_3_PRIO,/**任务优先级*/
                     (CPU_STK    *)&AppTask3STK[0],/**任务堆栈基地址*/
                     (CPU_STK_SIZE) APP_TASK_3_STK_SIZE / 10,/**任务堆栈界限,一般为1/10*/
                     (CPU_STK_SIZE) APP_TASK_3_STK_SIZE,/**任务堆栈大小*/
                     (OS_MSG_QTY  ) 5u,/**任务内部消息队列可以接受的最大消息数目,为0时禁止接受,这个参数具体使用,看消息队列的讲解*/
                     (OS_TICK     ) 0u,/**时间片轮转时的时间片数,为0时为默认长度,具体看时间片的讲解*/
                     (void       *) 0,/**用户补充的存储区,一般不用*/
                     (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),/**任务选项*/
                     (OS_ERR     *)&err);/**保存错误返回值,当创建不成功时会返回错误类型*/
        /*tast3**********************************************************************************/

        OS_CRITICAL_EXIT();//退出临界区代码保护

        // OSTaskDel((OS_TCB*)&StartTaskTcb, (OS_ERR*)&err);//删除指定任务
        OSTaskDel(0, &err);//删除当前任务
    }


    int main(void)
    {
        OS_ERR err;// 错误的返回
        OSInit(&err);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

       // CPU_Init();
       // Mem_Init();
        OS_CPU_SysTickInit(BSP_CPU_ClkFreq()/(CPU_INT32U)OSCfg_TickRate_Hz);

        led_init();

        CPU_SR_ALLOC();
        OS_CRITICAL_ENTER();//进入临界区代码保护

        /*创建启动任务 由启动任务创建其他子任务*/
        OSTaskCreate((OS_TCB     *)&StartTaskTcb, /**任务控制快*/
                     (CPU_CHAR   *)"start_task",/**任务名字*/
                     (OS_TASK_PTR ) start_task,/**任务函数*/
                     (void       *) 0,/**传递给任务函数的参数,通常不用这个参数,设置为0*/
                     (OS_PRIO     ) START_TASK_PRIO,/**任务优先级*/
                     (CPU_STK    *)&START_TASK_STK[0],/**任务堆栈基地址*/
                     (CPU_STK_SIZE) START_TASK_SIZE / 10,/**任务堆栈界限,一般为1/10*/
                     (CPU_STK_SIZE) START_TASK_SIZE,/**任务堆栈大小*/
                     (OS_MSG_QTY  ) 5u,/**任务内部消息队列可以接受的最大消息数目,为0时禁止接受,这个参数具体使用,看消息队列的讲解*/
                     (OS_TICK     ) 0u,/**时间片轮转时的时间片数,为0时为默认长度,具体看时间片的讲解*/
                     (void       *) 0,/**用户补充的存储区,一般不用*/
                     (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),/**任务选项*/
                     (OS_ERR     *)&err);/**保存错误返回值,当创建不成功时会返回错误类型*/

        OS_CRITICAL_EXIT();//退出临界区代码保护
        OSStart(&err);//启动操作系统,开始调度

        // while(1);
    }

  • 相关阅读:
    P1541 乌龟棋
    P1725 琪露诺
    P1622 释放囚犯
    P1417 烹调方案
    积木大赛
    换教室
    C#文件和目录的操作
    C#应用程序所有已经打开的窗体的集合
    C#winform自定义滚动条
    C#ADO.NET基础二
  • 原文地址:https://www.cnblogs.com/gaobo543013306/p/11855677.html
Copyright © 2020-2023  润新知