[产品应用] 【CW32移植Free-RTOS】CW32开发者扶持计划

[复制链接]
 楼主| hhh电子爱好者 发表于 2023-4-18 14:25 | 显示全部楼层 |阅读模式
本帖最后由 hhh电子爱好者 于 2023-4-18 15:05 编辑

#技术资源# #申请原创# 前言

* 感谢由芯源半导体提供的物料与技术支持
* CW32是武汉芯源半导体生产的高性能低成本MCU,欢迎大家多多使用国产芯片,支持国产!!!
* 开发者扶持计划由CW32生态社区与立创EDA共同合作发起,更多详细内容:开始报名!CW32开发者扶持计划正式进行,将助力中国的大学教育及人才培养 - - 21ic电子技术开**坛
* 本次移植使用的硬件为官方CW32F030小蓝板,最终效果为点亮PC13的LED

1,Free-RTOS源码下载

* Free-RTOS源码链接
* 进入后点击 Get Updates;等待一会就自动下载了



* 下载解压后检查文件是否齐全
* 一定要有这个文件,后面的移植也主要用到这个文件



* 进去后会有四个文件夹,案例,库,源文件,测试文件



2,建立文件夹

*文件夹新建在你的工程里,与User同级
*新建一个RTOS文件夹,并添加 include protable source



3,copy系统源码进入新建的工程文件

一,FreeRTOS\\Source\\include :这个文件路径里的所有 **.h** 文件复制进新建的include文件夹中。**



二, 在 FreeRTOS\\Demo 这个路径中寻找到关于STM32F1 系列的 Keil文件


三,**在该路径中寻找到FreeRTOSConfig.h的文件,并将他复制进之前新建的include的文件夹中


四, 在 **FreeRTOS\\Source\\portable\\MemMang** 路径下寻找到heap文件,并将™全部复制进 新建的peotable文件中


五, 在 reeRTOS\\Source\\portable\\RVDS\\ARM_CM0** 该路径下寻找到**port文件,复制进新建的portble文件中**


六, 将在该路径下出现的 **.c文件都移动进新建source文件夹内。**
  移动后的效果


4,Keil的工程配置

* 下面是需要新建的组,以及添加的文件
* RTOS/source
* RTOS/port





5,添加工程路径

* 选择将 RTOS下的source路径添加入内


6,修改RTOS配置
  1. #define INCLUDE_xTaskGetCurrentTaskHandle 1

  2. #define xPortPendSVHandler PendSV_Handler
  3. #define vPortSVCHandler        SVC_Handler
  4. //#define        xPortSysTickHandler        SysTick_Handler



  5. #define configUSE_PREEMPTION                1
  6. #define configUSE_IDLE_HOOK                        0
  7. #define configUSE_TICK_HOOK                        0
  8. #define configCPU_CLOCK_HZ                        ( ( unsigned long ) 48000000 )        
  9. #define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
  10. #define configMAX_PRIORITIES                ( 5 )
  11. #define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
  12. #define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 4 * 1024 ) )
  13. #define configMAX_TASK_NAME_LEN                ( 16 )
  14. #define configUSE_TRACE_FACILITY        0
  15. #define configUSE_16_BIT_TICKS                0
  16. #define configIDLE_SHOULD_YIELD                1


* 在中断文件**interrupt_cw32f030.c** 内屏蔽以下函数,并添加:头文件

  1. #include "main.h"
  2. #include "interrupts_cw32f030.h"
  3. #include "cw32f030_gpio.h"
  4. #include "cw32f030_adc.h"
  5. #include "cw32f030_gtim.h"
  6. #include "FreeRTOS.h"
  7. #include "task.h"


**SysTick_Handler(void)**
  1. void SysTick_Handler(void)
  2. {
  3.         #if (INCLUDE_xTaskGetSchedulerState)
  4.                 if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  5.                 {
  6.         #endif
  7.                         xPortSysTickHandler();
  8.         #if (INCLUDE_xTaskGetSchedulerState)
  9.                 }
  10.                 #endif
  11. }


**屏蔽以下两个函数**



7,测试代码

**注意:因为CW32F030.h内可以没有包含管脚等的.h文件** ,因此新建了一个**mian.h 文件**
  1. `**文件main.h**`
  1. #ifndef __MAIN_H
  2. #define __MAIN_H


  3. #include "base_types.h"
  4. #include "cw32f030.h"
  5. #include "system_cw32f030.h"
  6. #include "interrupts_cw32f030.h"
  7. #include "cw32f030_gpio.h"
  8. #include "cw32f030_rcc.h"
  9. #include "cw32f030_systick.h"
  10. #include "interrupts_cw32f030.h"
  11. #include "system_cw32f030.h"
  12. #endif /* __MAIN_H */


  1. `**文件main.c**`
  1. #include "CW32F030.h"                   // Device header
  2. #include "FreeRTOS.h"
  3. #include "main.h"
  4. #include "task.h"
  5. #include "queue.h"

  6. //code 代码空间 ro-data 常量空间 rw-data 已全局变量 zi-data 未全局变量等
  7. //**********************************
  8. //                 宏定义
  9. #define LED_TASK_NVIC                2                                //任务优先级
  10. #define LED_TASK_Size          50                                //任务堆栈大小
  11. TaskHandle_t LED_Task_Handler;                //句柄

  12. //*******************************
  13. //                        函数申明
  14. void LED_task(void *pvParameters);




  15. void LED_init()
  16. {
  17.     GPIO_InitTypeDef GPIO_InitStruct;
  18.                 __RCC_GPIOC_CLK_ENABLE();
  19.                 PC13_AFx_GPIO();
  20.                
  21.                 GPIO_InitStruct.IT = GPIO_IT_NONE;                        //控制脚初始化
  22.                 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  23.                 GPIO_InitStruct.Pins = GPIO_PIN_13;
  24.                 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  25.                 GPIO_Init(CW_GPIOC, &GPIO_InitStruct);

  26. }


  27. void LED1(void *pvParameters)
  28. {
  29.    int i;
  30.         
  31.     while(1)
  32.     {
  33.         PC13_SETLOW();
  34.                           vTaskDelay(100);
  35.                                 PC13_SETHIGH();
  36.                                 vTaskDelay(100);
  37.     }
  38. }

  39. int main()
  40. {
  41.         
  42.           LED_init();
  43.                 PC13_SETLOW();
  44.     xTaskCreate(LED1, "LED1", 128, NULL, 1, &LED_Task_Handler);
  45.     /* 启动调度器 */
  46.     vTaskStartScheduler();
  47.     /* 如果程序运行到了这里就表示出错了, 一般是内存不足 */
  48.     return 0;

  49. }


**工程下载链接:正在审核**








 楼主| hhh电子爱好者 发表于 2023-4-18 15:20 | 显示全部楼层
怎么上传的图片不见了,传了两次传麻了,csdn链接:https://blog.csdn.net/qq_48997726/article/details/129696316?spm=1001.2014.3001.5501
primojones 发表于 2023-6-8 15:44 | 显示全部楼层
如何在CW32上移植Freertos
maudlu 发表于 2023-6-8 22:42 | 显示全部楼层
freertos和ucos哪个更适合于学习
wilhelmina2 发表于 2023-6-8 22:47 | 显示全部楼层
FreeRTOS是一款免费、可移植、高效的实时操作系统,广泛应用于各种嵌入式系统和物联网设备中。
jimmhu 发表于 2023-6-8 22:53 | 显示全部楼层
FreeRTOS的移植工作较为复杂,需要熟悉嵌入式系统、RTOS和相关硬件平台的知识,并具备一定的编程技能和调试能力。
adolphcocker 发表于 2023-6-10 10:11 | 显示全部楼层
freertos 能移植 ucgui吗
alvpeg 发表于 2023-6-10 11:31 | 显示全部楼层
freertos 占多少内存空间
albertaabbot 发表于 2023-6-10 11:51 | 显示全部楼层
freertos任务切换需要多少个时钟周期
eefas 发表于 2023-6-10 13:44 | 显示全部楼层
FreeRTOS这是一个开源的项目,属于轻量级内核,API比较全
OKAKAKO 发表于 2023-6-11 21:41 | 显示全部楼层
楼主这个RTOS确实很精髓,芯源MCU能够对时实系统有了参考
szt1993 发表于 2023-6-13 15:11 | 显示全部楼层
内核ROM和耗费RAM都比uCOS小,特别是RAM。这在单片机里面是稀缺资源,uCOS至少要5K以上,而FreeRTOS用2~3K也可以跑的很好
lulugo 发表于 2023-6-13 16:10 | 显示全部楼层
安富莱电子的H7-TOOL开发工具可以仿真烧录芯源的单片机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部