[CW32L083系列] 基于CW32L083的FreeRTOS的移植

[复制链接]
2193|18
 楼主| 1308365377 发表于 2022-10-8 10:54 | 显示全部楼层 |阅读模式
本帖最后由 1308365377 于 2022-10-8 10:53 编辑

现在FreeRTOS做为大规模使用的实时操作系统,因为其开源,结构完整简单的优点被大量运用于物联网,工业检测与控制等领域。
现在我们就CW32L083的FreeRTOS做简单的介绍。
首先我们可以从官网下载最新的FreeRTOS的资料,FreeRTOS的官方网站为https://www.freertos.org/
1.jpg
Freetos book文件夹是官方的参考文档
2.jpg
FreeRTOS文件夹是官方提供的代码资源,Plus版本是在FreeRTOS的基础上增加了一些功能,这里我们就FreeRTOS为例进行移植。
3.jpg
Demo是FreeRTOS官方提供的一些不同内核的芯片例程,而我们的重点在于Source这个文件夹,这里包含着FreeRTOS的内核代码。
4.jpg
将这个文件夹整体复制到你建立的例程下,如在CW32L083GPIO_blink这个例程下新建了一个FreeRTOS的文件夹,把刚刚复制的Source放在这个文件夹下。
5.jpg
然后打开Source这个文件夹,下面的C文件就是FreeRTOS的源码,include文件夹中的是FreeRTOS的头文件,接下来打开portable文件夹
6.jpg
Portable文件夹下是不同编译软件所需要的资源,由于本例程是在keil下运行的,所以除了KEIL,MenMang和RVDS这三个文件,其他的文件都删除,MemMang文件中存放的是5种内存管理的方式,RVDS文件夹下存放的是不同的ARM架构的内核。
7.jpg 8.jpg
9.jpg
除此之外,我们还需要一个重要文件,FreeRTOSConfig.h,这个文件是可以通过配置一些宏定义来对我们的实时系统进行一个裁剪,那么这个头文件在哪呢,可以在FreeRTOS发布的例程Demo中找到,然后将这个头文件复制到我们的例程中来就行。
10.jpg


11.jpg

12.jpg

13.jpg
然后打开CW32L083的例程,将FreeRTOS的资源加入到例程中来。

14.jpg
主要的程序代码如下:
  1. #include  "main.h"
  2. #include  "cw32l083_flash.h"
  3. #include  <stdio.h>
  4. #include  "FreeRTOS.h"
  5. #include  "task.h"
  6. #include  "cw32l083_gpio.h"
  7. #include  "cw32l083_rcc.h"
  8. #include  "task.h"
  9. //#include  "usart.h"
  10. #define  led1_tog()     PC02_TOG()   
  11. #define  led2_tog()     PC03_TOG()

  12. TaskHandle_t StartTask_Handler;
  13. TaskHandle_t LedTask_Handler;

  14. void start_task(void *pvParameters)
  15. {
  16.          while(1)
  17.          {
  18.                    led1_tog();
  19.                    vTaskDelay(1000);
  20.           }
  21. }

  22. void led_task(void *pvParameters)
  23. {
  24.            while(1)
  25.            {        
  26.                     led2_tog();
  27.                     vTaskDelay(500);
  28.             }
  29. }

  30. void rcc_config(void)
  31. {
  32.         uint8_t  res =0U;
  33.         RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH,ENABLE);
  34.         //RCC_HCLK_OUT();
  35.         //通过PA04观察HCLK频率
  36.         RCC_HSI_Enable( RCC_HSIOSC_DIV6 );                                   //设置HSI = HSIOSC/6
  37.        //开启HSI

  38.         RCC_PLL_Enable( RCC_PLLSOURCE_HSI, 8000000, RCC_PLL_MUL_8 );    //开启PLL,PLL源为HSI
  39.         FLASH_SetLatency(FLASH_Latency_3);    //频率大于48M需要配置FlashWait=3,
  40.         res = RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL );                    //切换系统时钟到PLL
  41.         if( res == 0x00 )                                                //切换系统时钟成功
  42.         {
  43.             PC02_SETHIGH();
  44.             PC03_SETHIGH();
  45.             FirmwareDelay( 600000 );
  46.         }
  47.         else
  48.         {
  49.             while(1)
  50.             {
  51.                 PC03_TOG();
  52.                 PC02_TOG();
  53.                 FirmwareDelay( 10000000 );
  54.             }
  55.                                         }
  56.       RCC_SystemCoreClockUpdate(64000000);
  57. }
  58.                     
  59. int32_t main(void)
  60. {
  61.             rcc_config();
  62. //          uart_init(115200);
  63.             GPIO_InitTypeDef GPIO_InitStruct = {0};
  64.                                                  __RCC_GPIOC_CLK_ENABLE();

  65.             GPIO_InitStruct.IT = GPIO_IT_NONE;
  66.             GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  67.             GPIO_InitStruct.Pins = GPIO_PIN_2 | GPIO_PIN_3;

  68.             GPIO_Init(CW_GPIOC, &GPIO_InitStruct);


  69.             xTaskCreate((TaskFunction_t)start_task,
  70.                                (const char*    )"start_task",           
  71.                                (uint16_t       )128,
  72.                                (void*          )NULL,                                
  73.                                (UBaseType_t    )1,        
  74.                                (TaskHandle_t*  )&StartTask_Handler);   
  75.             xTaskCreate((TaskFunction_t)led_task,  
  76.                                (const char*    )"led_task",   
  77.                                (uint16_t       )128,
  78.                                (void*          )NULL,
  79.                                (UBaseType_t    )2,
  80.                                (TaskHandle_t*  )&LedTask_Handler);         
  81.                                vTaskStartScheduler();          //开启任务调度
  82. }
除此之外我们还需要将上文中提到的FreeRTOSConfig.h的一些宏定义更改一下,下述的两个宏定义一个是CPU的时钟频率,因为我们主程序的时钟频率设置的
为64Mhz的时钟,所以在FreeRTOSConfig.h这个文件中将时钟频率改为64Mhz,然后因为我们使用了动态内存管理,所以我们需要设置堆的大小。具体修改如下图所示
15.jpg
在具体的编译之后,没有错误,下载到开发板上,LED1以1S改变一次状态,LED2灯500ms改变一次状态。
16.jpg




海滨消消 发表于 2022-10-10 14:21 来自手机 | 显示全部楼层
心源也能用这种操作系统,也为客户多提供一种选择
primojones 发表于 2022-11-1 20:12 | 显示全部楼层
详细论述了FreeRTOS在基于ARM体系结构的嵌入式微控制器CW32L083上移植的实现过程
caigang13 发表于 2022-11-2 07:34 来自手机 | 显示全部楼层
现在物联网,小型系统应用很多都是采用的freertos。
sanfuzi 发表于 2022-11-2 17:24 | 显示全部楼层
基于FreeRTOSv9.0.0版本的实时系统资料有吗   
xiaoyaodz 发表于 2022-11-2 17:44 | 显示全部楼层
最近大家都在谈论物联网,人人都在做智能硬件,FreeRTOS也似乎被推到了风口浪尖。
wilhelmina2 发表于 2022-11-2 18:11 | 显示全部楼层
如何讲述FreeRTOS操作系统的移植过程,原理
abotomson 发表于 2022-11-2 18:52 | 显示全部楼层
把 FreeRTOS 从一个平台移植到另外一个完全不同 的、还未被支持的处理器内核体系并不是一件容易的工作。
elsaflower 发表于 2022-11-2 19:34 | 显示全部楼层
系统地分析了CW32L083 和FreeRTOS的体系结构
kmzuaz 发表于 2022-11-2 20:28 | 显示全部楼层
哪位大侠有移植的相关资料?               
abotomson 发表于 2022-11-2 21:19 | 显示全部楼层
FreeRTOS与LwlP联合移植吧  
pmp 发表于 2022-11-3 20:38 | 显示全部楼层
CW32L083是否可以使用gcc++, 是否支持C++11?  
vivilyly 发表于 2022-11-3 21:37 | 显示全部楼层
重点是 FreeRTOS 的移植,性能还可以吧。
pentruman 发表于 2022-12-2 21:36 | 显示全部楼层
可以直接使用keil自带的RTOS吗?
wengh2016 发表于 2022-12-2 21:44 | 显示全部楼层
FreeRTOS感觉不如裸机好用,可能用不习惯的吧。
minzisc 发表于 2022-12-2 22:23 | 显示全部楼层
FreeRTOS的移植需要注意哪些方面呢?
biechedan 发表于 2022-12-5 21:07 | 显示全部楼层
CW32L083的ram和rom是多大的?
timfordlare 发表于 2022-12-6 16:10 | 显示全部楼层
FreeRTOS会占用多大的内存呢?
Undshing 发表于 2022-12-26 12:19 | 显示全部楼层
很多物联网都是用的freertos
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

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