一、实验说明:

  信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节。当系统中的多个任务

在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互

相加以必要的限制的制约才保证任务的顺利进行。信号量就像是一种上锁机制,一旦执行至上锁

代码段则一直等待,直到获得相应的钥匙才能进入被锁部分的代码。使用信号量的最初目的是为了

给共享资源设立一个标志,该标志表示共享资源的占用情况。当一个任务在访问共享资源之前,就

可以先对这个标志进行查询,从而在了解资源被占用的情况之后,再来准定自己的行为。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/1eSQ6IXW密码:vg2c

四、核心代码:

  1. /*
  2. * Name : main
  3. * Description : ---
  4. * Author : liu.
  5. *
  6. * History
  7. * --------------------
  8. * Rev : 0.00
  9. * Date : 07/12/2017
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. /*实验现象:
  15. 红灯和绿灯同时以固定频率闪烁,打开串口工具,可以看到有数据显示。
  16. */
  17. int main(void)
  18. {
  19. system_clock.initialize(); //系统时钟初始化
  20. led.initialize(); //LED初始化
  21. usart6.initialize(); //串口初始化
  22. usart6.printf("\x0c"); //清屏
  23. usart6.printf("\033[1;32;40m"); //设置字体终端为绿色
  24. usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");
  25.  
  26. OSInit();
  27.  
  28. //UCOS初始化
  29. OSTaskCreate(start_task, //创建开始任务
  30. (void*), //任务参数
  31. (OS_STK*)&START_TASK_STK[START_STK_SIZE-], //任务堆栈
  32. START_TASK_PRIO); //任务优先级
  33. OSStart(); //开启UCOS
  34. }
  1. /*
  2. * Name : start_task
  3. * Description : ---
  4. * Author : liu.
  5. *
  6. * History
  7. * --------------------
  8. * Rev : 0.00
  9. * Date : 07/12/2017
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. void start_task(void *pdata)
  15. {
  16. OS_CPU_SR cpu_sr;
  17.  
  18. TaskSem = OSSemCreate(); //创建信号量
  19.  
  20. OSStatInit();//初始化统计任务
  21.  
  22. OS_ENTER_CRITICAL();//关中断
  23.  
  24. OSTaskCreate(AppTask1_task,(void*),(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-],AppTask1_TASK_PRIO);//创建AppTask1任务
  25. OSTaskCreate(AppTask2_task,(void*),(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-],AppTask2_TASK_PRIO);//创建AppTask2任务
  26. OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务
  27.  
  28. OS_EXIT_CRITICAL();//开中断
  29. }
  1. /*
  2. * Name : led0_task
  3. * Description : ---
  4. * Author : liu.
  5. *
  6. * History
  7. * --------------------
  8. * Rev : 0.00
  9. * Date : 07/12/2017
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. void AppTask1_task(void *pdata)
  15. {
  16. u8 err;
  17. unsigned char task1_mes[] = "The first task is running and the red LED is flashing!"; //任务一运行的信息
  18.  
  19. while(){
  20. usart6.printf("\r\n TASK 1:\r");
  21. OSSemPend(TaskSem,,&err); //请求信号量
  22. memcpy(array, task1_mes, sizeof(task1_mes)); //将任务一信息放到共享资源中
  23. usart6.printf("\r\n %s\r",array);
  24. OSSemPost(TaskSem); //发送信号量
  25.  
  26. LED_RED_ON; //红灯亮
  27. OSTimeDlyHMSM(,,,); //延时500ms
  28. LED_RED_OFF; //红灯灭
  29. OSTimeDlyHMSM(,,,); //延时500ms
  30. }
  31. }
  32. /*
  33. * Name : led_task
  34. * Description : ---
  35. * Author : liu.
  36. *
  37. * History
  38. * --------------------
  39. * Rev : 0.00
  40. * Date : 07/12/2017
  41. *
  42. * create.
  43. * --------------------
  44. */
  45. void AppTask2_task(void *pdata)
  46. {
  47. u8 err;
  48. unsigned char task2_mes[] = "The second task is running and the green LED is flashing!"; //任务一运行的信息
  49.  
  50. while(){
  51. usart6.printf("\r\n TASK 2:\r");
  52. OSSemPend(TaskSem,,&err); //请求信号量
  53. memcpy(array, task2_mes, sizeof(task2_mes));//将任务二信息放到共享资源中
  54. usart6.printf("\r\n %s\r",array);
  55.  
  56. OSSemPost(TaskSem); //发送信号量
  57.  
  58. LED_GREEN_ON; //绿灯亮
  59. OSTimeDlyHMSM(,,,); //延时1000ms
  60. LED_GREEN_OFF; //绿灯灭
  61. OSTimeDlyHMSM(,,,); //延时1000ms
  62. }
  63. }

iCore4链接:

【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源的更多相关文章

  1. 【iCore4 双核心板_uC/OS-II】例程七:互斥信号量

    一.实验说明: 在介绍互斥信号量前,我们先简单地描述一下什么是优先级反转.使用实时内核心,优先级反转问题是实时系统中出现得最多的问题.假设任务H优先级高于任务M,任务M优先级高于任务L.任务H和任务M ...

  2. 【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步

    一.实验说明: 信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源 的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任 务,或者同 ...

  3. 【iCore4 双核心板_uC/OS-II】例程四:软件定时器

    一.实验说明: 一些应用程序执行它们的任务时需要延迟一段特定的时间,因此uC/OS-II为我们提供了一些相应的 延时函数,本例程我们使用软件定时器定时500ms点亮相应的LED实现三色LED循环闪烁. ...

  4. 【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除

    一.实验说明: 本例程建立三个任务,通过任务寄存器来实现任务的建立与删除功能.红灯和绿灯同时以固定 频率闪烁,当任务寄存器为5时,删除绿灯闪烁的任务LED1,此时只有红灯闪烁,当任务寄存器的 值为10 ...

  5. 【iCore4 双核心板_uC/OS-II】例程十一:内存管理

    一.实验说明: 应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间.而作为比较完善的操作系统uC/OS-II,也具有动态分配内存的能力. uC/OS-II对内存进行两级管理:把连续内存分成 ...

  6. 【iCore4 双核心板_uC/OS-II】例程十:信号量集

    一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...

  7. 【iCore4 双核心板_uC/OS-II】例程九:消息队列

    一.实验说明: 前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需 ...

  8. 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱

    一.实验说明: 消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量.通常该指针指向一个包含了“消息”的特定数据结构.   二.实验截图:   ...

  9. 【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复

    一.实验说明: 当一个任务正在运行的时候,由于某种情况可能需要终止运行一段时间,终止的这段时间就是 所谓的任务的挂起,可以由该任务自身或者其他任务来挂起一个任务.当被挂起的任务需要再次运 行的时候,可 ...

随机推荐

  1. 大数据 时间同步问题 解决hbase集群节点HRegionServer启动后自动关闭

    1)在hbase-site.xml文件中 修改增加 ,将时间改大点<property><name>hbase.master.maxclockskew</name>& ...

  2. Touch事件详解及区别,触屏滑动距离计算

    移动端有四个关于触摸的事件,分别是touchstart.touchmove.touchend.touchcancel(比较少用), 它们的触发顺序是touchstart-->touchmove- ...

  3. Markdown指南

    Markdown 指南 前几天学习了markdown,然后一直在用,很喜欢这种格式即内容的写作形式.在简书写了几篇,对固定链接的格式很不满意,于是寻找能够支持markdown.固定链接显格式.支持自定 ...

  4. BZOJ2596 : [Wc2007]疯狂赛车

    根据光路最快原理以及斯涅尔定律,可以得到从定点$P$进入某条直线的最佳入射角. 求出每个端点到每条线段的最佳点,建图求最短路即可. 时间复杂度$O(n^2\log n)$. #include<c ...

  5. JS Function类型

    每个函数都是Function类型的实例,由于函数是对象,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定. 1.函数的声明: (1)函数声明语法: function sum (num1,num ...

  6. ae:org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms. Please ensure

    看问题是说要保证有一个realm正确,但是之前运行就一直成功,后来就不行了.有可能是:以为自己输入了正确的用户名和密码,结果是因为用户名前面添加了空格导致了这个错误发生. 实质问题是:你输入的用户名和 ...

  7. Java 多线程 ReadWriteLock

    ReadWriteLock是JDK 1.5提供的读写分离锁,可以减少锁竞争.例如,线程A1.A2和A3进行写操作,线程B1.B2和B3进行读操作,如果使用重入锁或者内部锁,那么理论上所有读之间.读与写 ...

  8. 几个例子弄懂JS 的setInterval的运行方式

    这篇文章主要介绍了js的setInterval方法的用法以及示例,非常的有用,这里推荐给小伙伴们. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口 ...

  9. js权威指南笔记

    //如setTimeout的delay参数为0毫秒,那么指定的函数不会立即执行.只会把它放到队列中,等到前面处于等待状态的事件处理 //程序全部执行完成后,再调用它. function invoke( ...

  10. #define LT(a,b) ((a)<(b))

    就是带参数的宏定义 LT是函数名 (a,b )是参数表((a)<(b))是表达式返回一个布尔类型的值