一、实验说明:

  前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需要额外的消息队列,这样不公优化了代码,而且比用一个单独的外部消息队列更有效率。任务消息队列建立在每一个任务的内部,如下图。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/1ggDoXYr 密码:lm3y

四、核心代码:

  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. 打开串口工具putty.exe,终端显示当前消息队列大小,按下ARM.KEY按键,
  16. 显示消息队列大小和消息。
  17. */
  18. int main(void)
  19. {
  20. system_clock.initialize(); //系统时钟初始化
  21. led.initialize(); //LED初始化
  22. usart6.initialize(); //串口初始化
  23. key.initialize();
  24.  
  25. usart6.printf("\x0c"); //清屏
  26. usart6.printf("\033[1;32;40m"); //设置字体终端为绿色
  27. usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");
  28. LED_RED_ON;
  29.  
  30. OSInit();
  31.  
  32. //UCOS初始化
  33. OSTaskCreate(start_task, //创建开始任务
  34. (void*), //任务参数
  35. (OS_STK*)&START_TASK_STK[START_STK_SIZE-], //任务堆栈
  36. START_TASK_PRIO); //任务优先级
  37. OSStart(); //开启UCOS
  38. }
  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. TaskQ = OSQCreate(&msg[], );//创建消息队列
  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 : AppTask1_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. int i = ;
  18. INT8U buf[];
  19.  
  20. while(){
  21. i++;
  22. buf[] = i;
  23. buf[] = i + ;
  24. if(ARM_KEY_STATE == KEY_DOWN){ //按键按下
  25. err = OSQPost(TaskQ, (void *)&buf[]);//发送消息队列
  26. switch(err){
  27. case OS_ERR_NONE:
  28. break;
  29. case OS_ERR_Q_FULL:
  30. break;
  31. }
  32. }
  33. OSTimeDlyHMSM(,,,); //延时500ms
  34. }
  35. }
  36. /*
  37. * Name : AppTask2_task
  38. * Description : ---
  39. * Author : liu.
  40. *
  41. * History
  42. * --------------------
  43. * Rev : 0.00
  44. * Date : 07/12/2017
  45. *
  46. * create.
  47. * --------------------
  48. */
  49. void AppTask2_task(void *pdata)
  50. {
  51. u8 err;
  52. INT8U *s;
  53.  
  54. while(){
  55. usart6.printf("The queue size : %d\r\n",((OS_Q*)(TaskQ->OSEventPtr))->OSQEntries);//消息队列当前的大小
  56. s = OSQPend(TaskQ, , &err); //请求消息队列
  57. if(err == OS_ERR_NONE){
  58. usart6.printf("maseege[0] = %d\r\n",s[]);
  59. usart6.printf("maseege[1] = %d\r\n",s[]);
  60. }
  61. OSTimeDlyHMSM(,,,); //延时500ms
  62. }
  63. }

iCore4链接:

【iCore4 双核心板_uC/OS-II】例程九:消息队列的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

    一.实验说明: 信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节.当系统中的多个任务 在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互 相加以必要的限制 ...

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

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

随机推荐

  1. CC NOV17

    PERPALIN 可以考虑最后的状态可以是两个非常长而且相同的前缀和后缀中间再加一小段,然后就是不断缩小区间至出解 CHEFHPAL 发现当字符集大于等于3的时候abc循环一定是没有大于1的回文子串的 ...

  2. 关于多线程之GCD的一些学习要点

    GCD是当前多线程使用最方便的,也是使用比较多的. 学习GCD主要集中在一下几点: 一.队列,同步,异步 1.主队列:dispatch_get_main_queue(); 2.串行队列:dispatc ...

  3. python之列表和生成器表达式篇

    一.协程函数的应用 写一个装饰器用于让协程函数不需要输入再执行一次next()函数 分析: 在装饰器中生成该协程函数的生成器, 并且执行一次next()函数 def firstNext(func): ...

  4. JSP(1)—基础知识

    JSP(1)-基本知识 起源 在很多动态网页中绝大多数网页都是固定不变的只有局部内容需要动态产生和改变,如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的的静态内容,也需要程序 ...

  5. pygame-KidsCanCode系列jumpy-part13-改进跳跃

    这节研究下跳跃如何做得更自然,先看看之前的跳跃有什么问题,我们把settings.py里的初始化参数调整下: # starting platform # PLATFORM_LIST = [(5, HE ...

  6. JIRA、Confluence中文官方技术博客

    JIRA.Confluence中文官方技术博客 http://blog.csdn.net/atlassian2013

  7. 近期 Unity 提交苹果审核被拒的问题

    游戏提交苹果审核,被打回.在 bugly 上没有查到崩溃信息,苹果给了 crash 日志也说明. 拒绝原因如下: Your app crashed on iPad or iPhone running ...

  8. DBS:CUPhone

    ylbtech-DBS:CUPhone 1.返回顶部 1. USE master GO -- Drop the database if it already exists IF EXISTS ( SE ...

  9. 资源贴——以备时时查询用

    目录区 AI教程   AI教程 1.AI教程!教你绘制小清新巴士   2.AI教程!如何使用基础图形来绘制消防插画   3.AI教程!教你绘制秋日插画   4.AI教程!教你制作色彩分明的街边场景插画 ...

  10. from __future__ import print_function的作用

    阅读代码的时候会看到下面语句: from __future__ import print_function 该语句是python2的概念,那么python3对于python2就是future了,也就是 ...