找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5063|回复: 2
收起左侧

stm32f031单片机完美移植freertos操作系统 附源程序

[复制链接]
ID:272602 发表于 2019-6-27 12:15 | 显示全部楼层 |阅读模式
本帖最后由 thinkingpadcui 于 2019-6-28 16:25 编辑

stm32031c6t6是一款小容量的,少资源的M0内核单片机,4K RAM ,32K flash。
搞了两天终于把freeRTOSTA操作系统完美移植到该单片机上面。
目前测试点灯和NRF24L01发送接收数据都是OK。
UARST打印printf目前没有测试成功 ,该单片机只有一个USART.这个是个小问题。后面解决了给大家分享一下。
仅供参考,希望能帮到正在学习os的朋友

0.png

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "include.h"

  3. //任务优先级
  4. #define START_TASK_PRIO                1
  5. //任务堆栈大小        
  6. #define START_STK_SIZE                 50  
  7. //任务句柄
  8. TaskHandle_t StartTask_Handler;
  9. //任务函数
  10. void start_task(void *pvParameters);

  11. //任务优先级
  12. #define LED0_TASK_PRIO                2
  13. //任务堆栈大小        
  14. #define LED0_STK_SIZE                 50  
  15. //任务句柄
  16. TaskHandle_t LED0Task_Handler;
  17. //任务函数
  18. void led0_task(void *pvParameters);

  19. //任务优先级
  20. #define LED1_TASK_PRIO                3
  21. //任务堆栈大小        
  22. #define LED1_STK_SIZE                 50  
  23. //任务句柄
  24. TaskHandle_t LED1Task_Handler;
  25. //任务函数
  26. void led1_task(void *pvParameters);

  27. ////任务优先级
  28. //#define FLOAT_TASK_PRIO                4
  29. ////任务堆栈大小        
  30. //#define FLOAT_STK_SIZE                 128
  31. ////任务句柄
  32. //TaskHandle_t FLOATTask_Handler;
  33. ////任务函数
  34. //void float_task(void *pvParameters);

  35. int main(void)
  36. {        
  37.         MCU_Init();
  38. //        NRF24L01_Init();
  39.                 delay_init();                                            //延时函数初始化         
  40. //        uart_init(115200);                                        //初始化串口
  41.         NRF24L01_Init();

  42.         //创建开始任务
  43.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  44.                 (const char*    )"start_task",          //任务名称
  45.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  46.                 (void*          )NULL,                  //传递给任务函数的参数
  47.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  48.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
  49.     vTaskStartScheduler();          //开启任务调度
  50. }

  51. //开始任务任务函数
  52. void start_task(void *pvParameters)
  53. {
  54.    // taskENTER_CRITICAL();           //进入临界区
  55.     //创建LED0任务
  56.     xTaskCreate((TaskFunction_t )led0_task,            
  57.                 (const char*    )"led0_task",           
  58.                 (uint16_t       )LED0_STK_SIZE,
  59.                 (void*          )NULL,                                
  60.                 (UBaseType_t    )LED0_TASK_PRIO,        
  61.                 (TaskHandle_t*  )&LED0Task_Handler);   
  62.     //创建LED1任务
  63.     xTaskCreate((TaskFunction_t )led1_task,     
  64.                 (const char*    )"led1_task",   
  65.                 (uint16_t       )LED1_STK_SIZE,
  66.                 (void*          )NULL,
  67.                 (UBaseType_t    )LED1_TASK_PRIO,
  68.                 (TaskHandle_t*  )&LED1Task_Handler);
  69.     //浮点测试任务
  70. //    xTaskCreate((TaskFunction_t )float_task,     
  71. //                (const char*    )"float_task",   
  72. //                (uint16_t       )FLOAT_STK_SIZE,
  73. //                (void*          )NULL,
  74. //                (UBaseType_t    )FLOAT_TASK_PRIO,
  75. //                (TaskHandle_t*  )&FLOATTask_Handler);                                                                 
  76.     vTaskDelete(StartTask_Handler); //删除开始任务
  77.     //taskEXIT_CRITICAL();            //退出临界区
  78. }

  79. //LED0任务函数
  80. void led0_task(void *pvParameters)
  81. {
  82.     while(1)
  83.     {
  84.                         test_RX_TX();
  85. //        LED1_ON;
  86. //        vTaskDelay(500);
  87. //                                LED1_OFF;
  88.         vTaskDelay(1000);
  89.     }
  90. }   

  91. //LED1任务函数
  92. void led1_task(void *pvParameters)
  93. {
  94.     while(1)
  95.     {
  96.         LED3_ON;
  97.         vTaskDelay(800);
  98.                                 LED3_OFF;
  99.         vTaskDelay(800);
  100.     }
  101. }
  102. //浮点测试任务
  103. //void float_task(void *pvParameters)
  104. //{
  105. //        static float float_num=0.00;
  106. //        while(1)
  107. //        {
  108. //                float_num+=0.01f;
  109. //                printf("float_num的值为: %.4f\r\n",float_num);
  110. //        vTaskDelay(1000);
  111. //        }
  112. //}
复制代码

全部资料51hei下载地址:

FreeRTOS_IMCharger_MDK.rar

3.81 MB, 下载次数: 136, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:272602 发表于 2019-6-29 05:32 | 显示全部楼层
从这两天应用的来看,对于4K小容量RAM的单片机移植了FreeRTOS,只能做一些任务量不大的项目,任务量太大 就必须要RAM比较大的单片机  这是这两天调试的心得
回复

使用道具 举报

ID:185611 发表于 2020-4-29 08:24 | 显示全部楼层
也想移植到051单片机里
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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