单片机
返回首页

ucos-ii示例7:内存管理测试

2016-12-18 来源:eefocus

环境:

主机:WIN8

开发环境:MDK4.72

ucgui版本:3.90

ucos版本:ucos-ii

mcu: stm32f103VE


说明:

本示例中task2请求内存分区,然后往分区内写数据,再将数据通过邮箱发送给task1


效果图:


源码:


  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. /********************************************************************* 

  12. *                           静态变量 

  13. **********************************************************************/  

  14.   

  15. /********************************************************************* 

  16. *                           任务堆栈空间 

  17. **********************************************************************/  

  18.   

  19. static OS_STK Task_Start_Stk[TASK_STK_SIZE];  

  20. static OS_STK Task1_Stk[TASK_STK_SIZE];  

  21. static OS_STK Task2_Stk[TASK_STK_SIZE];  

  22.   

  23. /********************************************************************* 

  24. *                           信号量 

  25. **********************************************************************/  

  26.   

  27. OS_EVENT *Semaphore;  

  28.   

  29. /********************************************************************* 

  30. *                           消息队列数组 

  31. **********************************************************************/  

  32.   

  33. void *Msg_Group[10];  

  34.   

  35. char Msg_Arr[10][30];  

  36. uint8_t Index_Msg_Arr = 0;  

  37.   

  38. /********************************************************************* 

  39. *                           内存分区 

  40. **********************************************************************/  

  41.   

  42. OS_MEM *Buffer_Ptr;  

  43. uint8_t Buffer[10][30];  

  44.   

  45. /********************************************************************* 

  46. *                           函数 

  47. **********************************************************************/  

  48.   

  49. int main(void)  

  50. {     

  51.     //初始化内核  

  52.     OSInit();  

  53.     //创建任务  

  54.     OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);  

  55.       

  56.     //启动任务  

  57.     OSStart();  

  58. }  

  59.   

  60. /********************************************************************* 

  61. *                           任务函数 

  62. **********************************************************************/  

  63.   

  64. static void task_start(void *pdata)  

  65. {     

  66.     uint8_t err = 0;  

  67.       

  68.     //载入世界  

  69.     world_load();  

  70.       

  71.     //设置背景色  

  72.     GUI_SetBkColor(0xb07c17);  

  73.     GUI_Clear();  

  74.     GUI_SetColor(GUI_BLACK);  

  75.       

  76.     //新建邮箱  

  77.     Semaphore = OSMboxCreate((void *)0);  

  78.       

  79.     //创建内存分区  

  80.     Buffer_Ptr = OSMemCreate(Buffer,10,30,&err);  

  81.       

  82.     //新建任务  

  83.     OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);  

  84.     OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);  

  85.       

  86.     while(1)  

  87.     {  

  88.         OSTimeDlyHMSM(0,0,3,0);  

  89.     }  

  90. }  

  91.   

  92. static void task1(void *pdata)  

  93. {  

  94.     char str[30] = {0};  

  95.     uint8_t err = 0;  

  96.     uint8_t *mail;  

  97.   

  98.     while(1)  

  99.     {  

  100.         //请求信号量  

  101.         mail = OSMboxPend(Semaphore,0,&err);  

  102.         //显示  

  103.         sprintf(str,'task1 receive:%d,%d,%d',mail[0],mail[1],mail[2]);  

  104.         GUI_DispStringHCenterAt(str, 120, 40);  

  105.           

  106.         //显示  

  107.         sprintf(str,'task1 time:%ds',OSTimeGet());  

  108.         GUI_DispStringHCenterAt(str, 120, 5);  

  109.         WM_Exec();  

  110.         OSTimeDlyHMSM(0,0,1,0);  

  111.     }  

  112. }  

  113.   

  114. static void task2(void *pdata)  

  115. {  

  116.     char str[30] = {0};  

  117.     uint8_t err = 0;  

  118.     uint8_t *ptr;  

  119.     static uint8_t a = 0;  

  120.   

  121.     while(1)  

  122.     {  

  123.         //请求内存分区  

  124.         ptr = OSMemGet(Buffer_Ptr,&err);  

  125.           

  126.         //赋值  

  127.         ptr[0] = a++;  

  128.         ptr[1] = a++;  

  129.         ptr[2] = a++;  

  130.         //用邮箱发送  

  131.         OSMboxPost(Semaphore,ptr);  

  132.           

  133.         //释放内存分区  

  134.         OSMemPut(Buffer_Ptr,ptr);  

  135.           

  136.         //显示  

  137.         sprintf(str,'task2 time:%ds',OSTimeGet());  

  138.         GUI_DispStringHCenterAt(str, 120, 20);  

  139.         WM_Exec();  

  140.         OSTimeDlyHMSM(0,0,3,0);  

  141.     }  

  142. }  



进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 非常简单的150W功放电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 一个简单的立体声平衡指示器电路

  • 分享一个电网倾角计电路

    相关电子头条文章