打印
[STM32F1]

ucos-ii示例3:互斥型信号量测试

[复制链接]
679|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ideafor|  楼主 | 2016-4-22 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本:3.90

ucos版本:ucos-ii

mcu: stm32f103VE


说明:

本示例新建一个互斥型信号量,通过此信号量每次只能有1个任务使用资源函数resource


注意:

1.互斥型信号量的创建不能在内核初始化之前

2.互斥型信号量的请求和释放函数只能在同一个任务中执行,如果一个任务请求了信号量,另一个任务释放信号量的操作会失败

3.为了应对信号量导致的不同任务之间的优先级反转,互斥型信号量的创建需要设置一个优先级,且这个优先级必须是尚未使用的,否则会创建失败


效果图:


源码:

#define TASK_STK_SIZE       512  
                  
/*********************************************************************
*                           静态函数
**********************************************************************/  
  
static void task_start(void *pdata);  
static void task1(void *pdata);  
static void task2(void *pdata);  
  
static void resource(char *task_name);  
  
/*********************************************************************
*                           静态变量
**********************************************************************/  
  
/*********************************************************************
*                           任务堆栈空间
**********************************************************************/  
  
static OS_STK Task_Start_Stk[TASK_STK_SIZE];  
static OS_STK Task1_Stk[TASK_STK_SIZE];  
static OS_STK Task2_Stk[TASK_STK_SIZE];  
  
/*********************************************************************
*                           信号量
**********************************************************************/  
  
OS_EVENT *Semaphore;  
  
/*********************************************************************
*                           函数
**********************************************************************/  
  
int main(void)  
{     
    //初始化内核  
    OSInit();  
    //创建任务  
    OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);  
      
    //启动任务  
    OSStart();  
}  
  
/*********************************************************************
*                           任务函数
**********************************************************************/  
  
static void task_start(void *pdata)  
{     
    uint8_t err = 0;  
      
    //载入世界  
    world_load();  
      
    //设置背景色  
    GUI_SetBkColor(0xb07c17);  
    GUI_Clear();  
    GUI_SetColor(GUI_BLACK);  
      
    Semaphore = OSMutexCreate(0,&err);  
      
    //新建任务  
    OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);  
    OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);  
      
    while(1)  
    {  
        OSTimeDlyHMSM(0,0,3,0);  
    }  
}  
  
static void task1(void *pdata)  
{  
    char str[30] = {0};  
    uint8_t err = 0;  
  
    while(1)  
    {  
        //请求信号量  
        OSMutexPend(Semaphore,0,&err);  
         
        //显示  
        sprintf(str,"task1 time:%ds",OSTimeGet());  
        GUI_DispStringHCenterAt(str, 120, 5);  
        WM_Exec();  
        OSTimeDlyHMSM(0,0,1,0);  
         
        //使用资源  
        resource("task1");  
         
        //释放信号量  
        OSMutexPost(Semaphore);  
    }  
}  
  
static void task2(void *pdata)  
{  
    char str[30] = {0};  
    uint8_t err = 0;  
  
    while(1)  
    {  
        //请求信号量  
        OSMutexPend(Semaphore,0,&err);  
         
        //显示  
        sprintf(str,"task2 time:%ds",OSTimeGet());  
        GUI_DispStringHCenterAt(str, 120, 20);  
        WM_Exec();  
        OSTimeDlyHMSM(0,0,3,0);  
         
        //使用资源  
        resource("task2");  
         
        //释放信号量  
        OSMutexPost(Semaphore);  
    }  
}  
  
static void resource(char *task_name)  
{  
    char str[30] = {0};  
  
    //显示  
    sprintf(str,"%s use resource:%ds",task_name,OSTimeGet());  
    GUI_DispStringHCenterAt(str, 120, 40);  
    WM_Exec();  
}


沙发
neeringstu| | 2016-4-22 23:00 | 只看该作者
互斥信号量必须是二值信号量,普通信号量可以保护共享资源

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

149

帖子

1

粉丝