找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2744|回复: 1
打印 上一主题 下一主题
收起左侧

STM32 FREERTOS移植教程与源码

[复制链接]
跳转到指定楼层
楼主
ID:379138 发表于 2018-7-25 20:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原子FREERTOS移植教程,包括例程源码

全部资料51hei下载地址:
STM32F103 FreeRTOS开发手册V1.1.pdf (10.79 MB, 下载次数: 35)
FreeRTOS任务挂起和恢复.rar (1.23 MB, 下载次数: 31)


单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "sdram.h"
  7. #include "key.h"
  8. #include "FreeRTOS.h"
  9. #include "task.h"

  10. //任务优先级
  11. #define START_TASK_PRIO                1
  12. //任务堆栈大小       
  13. #define START_STK_SIZE                 128  
  14. //任务句柄
  15. TaskHandle_t StartTask_Handler;
  16. //任务函数
  17. void start_task(void *pvParameters);

  18. //任务优先级
  19. #define TASK1_TASK_PRIO                2
  20. //任务堆栈大小       
  21. #define TASK1_STK_SIZE                 128  
  22. //任务句柄
  23. TaskHandle_t Task1Task_Handler;
  24. //任务函数
  25. void task1_task(void *pvParameters);

  26. //任务优先级
  27. #define TASK2_TASK_PRIO                3
  28. //任务堆栈大小       
  29. #define TASK2_STK_SIZE                 128  
  30. //任务句柄
  31. TaskHandle_t Task2Task_Handler;
  32. //任务函数
  33. void task2_task(void *pvParameters);

  34. //任务优先级
  35. #define KEY_TASK_PRIO                4
  36. //任务堆栈大小       
  37. #define KEY_STK_SIZE                 128  
  38. //任务句柄
  39. TaskHandle_t KeyTask_Handler;
  40. //任务函数
  41. void key_task(void *pvParameters);

  42. int main(void)
  43. {
  44.     HAL_Init();                     //初始化HAL库   
  45.     Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
  46.         delay_init(180);                //初始化延时函数
  47.         uart_init(115200);              //初始化串口
  48.     LED_Init();                     //初始化LED
  49.         KEY_Init();                                                //初始化按键
  50.        
  51.     //创建开始任务
  52.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  53.                 (const char*    )"start_task",          //任务名称
  54.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  55.                 (void*          )NULL,                  //传递给任务函数的参数
  56.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  57.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄               
  58.     vTaskStartScheduler();          //开启任务调度
  59. }

  60. //开始任务任务函数
  61. void start_task(void *pvParameters)
  62. {
  63.     taskENTER_CRITICAL();           //进入临界区
  64.         //创建KEY TASK任务
  65.     xTaskCreate((TaskFunction_t )key_task,            
  66.                 (const char*    )"key_task",           
  67.                 (uint16_t       )KEY_STK_SIZE,        
  68.                 (void*          )NULL,                  
  69.                 (UBaseType_t    )KEY_TASK_PRIO,        
  70.                 (TaskHandle_t*  )&KeyTask_Handler);
  71.                                
  72.     //创建TASK1任务
  73.     xTaskCreate((TaskFunction_t )task1_task,            
  74.                 (const char*    )"task1_task",           
  75.                 (uint16_t       )TASK1_STK_SIZE,        
  76.                 (void*          )NULL,                  
  77.                 (UBaseType_t    )TASK1_TASK_PRIO,        
  78.                 (TaskHandle_t*  )&Task1Task_Handler);   
  79.     //创建TASK2任务
  80.     xTaskCreate((TaskFunction_t )task2_task,     
  81.                 (const char*    )"task2_task",   
  82.                 (uint16_t       )TASK2_STK_SIZE,
  83.                 (void*          )NULL,
  84.                 (UBaseType_t    )TASK2_TASK_PRIO,
  85.                 (TaskHandle_t*  )&Task2Task_Handler);
  86.     vTaskDelete(StartTask_Handler); //删除开始任务
  87.     taskEXIT_CRITICAL();            //退出临界区
  88. }

  89. //key任务函数
  90. void key_task(void *pvParameters)
  91. {
  92.         u8 key;
  93.        
  94.         while(1)
  95.         {
  96.                 key=KEY_Scan(0);
  97.                 switch(key)
  98.                 {
  99.                         case WKUP_PRES:
  100.                                 vTaskSuspend(Task1Task_Handler);
  101.                                 printf("Task1 Suspend!!!\r\n");
  102.                                 break;
  103.                         case KEY1_PRES:
  104.                                 vTaskResume(Task1Task_Handler);
  105.                                 printf("Task1 Resume!!!\r\n");
  106.                                
  107.                 }
  108.                        
  109.                 vTaskDelay(10);
  110.         }
  111. }

  112. //task1任务函数
  113. void task1_task(void *pvParameters)
  114. {
  115.         u8 task1_num=0;
  116.        
  117.         while(1)
  118.         {
  119.                 task1_num++;        //任务执1行次数加1 注意task1_num1加到255的时候会清零!!
  120.                 LED0=!LED0;
  121.                 printf("任务1已经执行:%d次\r\n",task1_num);

  122.         vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍       
  123.         }
  124. }

  125. //task2任务函数
  126. void task2_task(void *pvParameters)
  127. {
  128.         u8 task2_num=0;
  129.        
  130.         while(1)
  131.         {
  132.                 task2_num++;        //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
  133.         LED1=!LED1;
  134.                 printf("任务2已经执行:%d次\r\n",task2_num);
  135.         vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍       
  136.         }
  137. }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:20672 发表于 2018-9-22 11:27 | 只看该作者
谢谢分享~~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表