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

[复制链接]
 楼主| ideafor 发表于 2016-4-22 09:25 | 显示全部楼层 |阅读模式

环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本:3.90

ucos版本:ucos-ii

mcu: stm32f103VE


说明:

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


注意:

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

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

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


效果图:


源码:

  1. #define TASK_STK_SIZE       512  
  2.                   
  3. /*********************************************************************
  4. *                           静态函数
  5. **********************************************************************/  
  6.   
  7. static void task_start(void *pdata);  
  8. static void task1(void *pdata);  
  9. static void task2(void *pdata);  
  10.   
  11. static void resource(char *task_name);  
  12.   
  13. /*********************************************************************
  14. *                           静态变量
  15. **********************************************************************/  
  16.   
  17. /*********************************************************************
  18. *                           任务堆栈空间
  19. **********************************************************************/  
  20.   
  21. static OS_STK Task_Start_Stk[TASK_STK_SIZE];  
  22. static OS_STK Task1_Stk[TASK_STK_SIZE];  
  23. static OS_STK Task2_Stk[TASK_STK_SIZE];  
  24.   
  25. /*********************************************************************
  26. *                           信号量
  27. **********************************************************************/  
  28.   
  29. OS_EVENT *Semaphore;  
  30.   
  31. /*********************************************************************
  32. *                           函数
  33. **********************************************************************/  
  34.   
  35. int main(void)  
  36. {     
  37.     //初始化内核  
  38.     OSInit();  
  39.     //创建任务  
  40.     OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);  
  41.       
  42.     //启动任务  
  43.     OSStart();  
  44. }  
  45.   
  46. /*********************************************************************
  47. *                           任务函数
  48. **********************************************************************/  
  49.   
  50. static void task_start(void *pdata)  
  51. {     
  52.     uint8_t err = 0;  
  53.       
  54.     //载入世界  
  55.     world_load();  
  56.       
  57.     //设置背景色  
  58.     GUI_SetBkColor(0xb07c17);  
  59.     GUI_Clear();  
  60.     GUI_SetColor(GUI_BLACK);  
  61.       
  62.     Semaphore = OSMutexCreate(0,&err);  
  63.       
  64.     //新建任务  
  65.     OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);  
  66.     OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);  
  67.       
  68.     while(1)  
  69.     {  
  70.         OSTimeDlyHMSM(0,0,3,0);  
  71.     }  
  72. }  
  73.   
  74. static void task1(void *pdata)  
  75. {  
  76.     char str[30] = {0};  
  77.     uint8_t err = 0;  
  78.   
  79.     while(1)  
  80.     {  
  81.         //请求信号量  
  82.         OSMutexPend(Semaphore,0,&err);  
  83.          
  84.         //显示  
  85.         sprintf(str,"task1 time:%ds",OSTimeGet());  
  86.         GUI_DispStringHCenterAt(str, 120, 5);  
  87.         WM_Exec();  
  88.         OSTimeDlyHMSM(0,0,1,0);  
  89.          
  90.         //使用资源  
  91.         resource("task1");  
  92.          
  93.         //释放信号量  
  94.         OSMutexPost(Semaphore);  
  95.     }  
  96. }  
  97.   
  98. static void task2(void *pdata)  
  99. {  
  100.     char str[30] = {0};  
  101.     uint8_t err = 0;  
  102.   
  103.     while(1)  
  104.     {  
  105.         //请求信号量  
  106.         OSMutexPend(Semaphore,0,&err);  
  107.          
  108.         //显示  
  109.         sprintf(str,"task2 time:%ds",OSTimeGet());  
  110.         GUI_DispStringHCenterAt(str, 120, 20);  
  111.         WM_Exec();  
  112.         OSTimeDlyHMSM(0,0,3,0);  
  113.          
  114.         //使用资源  
  115.         resource("task2");  
  116.          
  117.         //释放信号量  
  118.         OSMutexPost(Semaphore);  
  119.     }  
  120. }  
  121.   
  122. static void resource(char *task_name)  
  123. {  
  124.     char str[30] = {0};  
  125.   
  126.     //显示  
  127.     sprintf(str,"%s use resource:%ds",task_name,OSTimeGet());  
  128.     GUI_DispStringHCenterAt(str, 120, 40);  
  129.     WM_Exec();  
  130. }


neeringstu 发表于 2016-4-22 23:00 | 显示全部楼层
互斥信号量必须是二值信号量,普通信号量可以保护共享资源
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

149

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

30

主题

149

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部