#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h"

//任务1控制块
OS_TCB Task1_TCB;

void task1(void *parg);

CPU_STK task1_stk[128];            //任务1的任务堆栈,大小为128字,也就是512字节



//任务2控制块
OS_TCB Task2_TCB;

void task2(void *parg);

CPU_STK task2_stk[128];            //任务2的任务堆栈,大小为128字,也就是512字节


OS_SEM    SYNC_SEM;                //定义一个信号量,用于任务同步

//主函数
int main(void)
{
    OS_ERR err;

    delay_init(168);                                                      //时钟初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                        //中断分组配置
    uart_init(9600);                                                   //串口初始化
    LED_Init();                                                         //LED初始化    


    //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
    OSInit(&err);


    //创建任务1
    OSTaskCreate(    (OS_TCB *)&Task1_TCB,                                    //任务控制块
                    (CPU_CHAR *)"Task1",                                    //任务的名字
                    (OS_TASK_PTR)task1,                                        //任务函数
                    (void *)0,                                                //传递参数
                    (OS_PRIO)3,                                                 //任务的优先级        
                    (CPU_STK *)task1_stk,                                    //任务堆栈基地址
                    (CPU_STK_SIZE)128/10,                                    //任务堆栈深度限位,用到这个位置,任务不能再继续使用
                    (CPU_STK_SIZE)128,                                        //任务堆栈大小            
                    (OS_MSG_QTY)0,                                            //禁止任务消息队列
                    (OS_TICK)0,                                                //默认时间片长度                                                                
                    (void  *)0,                                                //不需要补充用户存储区
                    (OS_OPT)OS_OPT_TASK_NONE,                                //没有任何选项
                    &err                                                    //返回的错误码
                );


    //创建任务2
    OSTaskCreate(    (OS_TCB *)&Task2_TCB,                                    //任务控制块
                    (CPU_CHAR *)"Task2",                                    //任务的名字
                    (OS_TASK_PTR)task2,                                        //任务函数
                    (void *)0,                                                //传递参数
                    (OS_PRIO)2,                                                 //任务的优先级        
                    (CPU_STK *)task2_stk,                                    //任务堆栈基地址
                    (CPU_STK_SIZE)128/10,                                    //任务堆栈深度限位,用到这个位置,任务不能再继续使用
                    (CPU_STK_SIZE)128,                                        //任务堆栈大小            
                    (OS_MSG_QTY)0,                                            //禁止任务消息队列
                    (OS_TICK)0,                                                //默认时间片长度                                                                
                    (void  *)0,                                                //不需要补充用户存储区
                    (OS_OPT)OS_OPT_TASK_NONE,                                //没有任何选项
                    &err                                                    //返回的错误码
                );

    //创建一个信号量
    OSSemCreate ((OS_SEM*    )&SYNC_SEM,
                 (CPU_CHAR*    )"SYNC_SEM",
                 (OS_SEM_CTR)0,        
                 (OS_ERR*    )&err);


    //启动OS,进行任务调度
    OSStart(&err);
    
}


void task1(void *parg)
{
    OS_ERR err;

    printf("task1 is create ok\r\n");

    while(1)
    {

        OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量

        printf("task1 is running ...\r\n");

    }

}

void task2(void *parg)
{
    OS_ERR err;

    printf("task2 is create ok\r\n");

    while(1)
    {
        //连续发送3个信号量
        OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);                    //发送信号量
        OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);                    //发送信号量
        OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);                    //发送信号量

        printf("task2 is running ...\r\n");

    
        OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);         //延时10ms  
    }
}
信号量

相关文章:

  • 2021-11-19
  • 2021-10-29
  • 2022-12-23
  • 2021-05-02
  • 2021-06-02
  • 2021-06-24
  • 2021-11-06
  • 2022-12-23
猜你喜欢
  • 2021-05-07
  • 2021-09-16
  • 2022-12-23
  • 2022-01-26
  • 2021-09-04
  • 2022-01-07
  • 2021-11-29
相关资源
相似解决方案