打印
[开发资料]

CW32移植FreeRTOS

[复制链接]
17|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-11-6 17:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、下载FreeRTOS

        FreeRTOS下载地址

1、进入官网,选择V9.0.0版本进入



2、选择FreeRTOSv9.0.0.zip下载,点进去等待数秒钟后自动下载



3、将下载后的文件解压,我们需要的是里面一个名为FreeRTOS的文件夹



二、移植FreeRTOS

1、我们需要打开一个例程来移植FreeRTOS,并在该工程下创建一个FreeROTS的文件夹



2、在新建的FreeRTOS文件夹里面再创建三个文件夹:src、port、include



3、将刚才下载的FreeRTOSv9.0.0\FreeRTOS\Source里面的.c文件复制到新建的FreeRTOS\src文件夹下面



4、将刚才下载的FreeRTOSv9.0.0\FreeRTOS\Source\portable里面的RVDS跟MemMang文件夹复制到新建的FreeRTOS\port文件夹下面



5、将刚才下载的FreeRTOSv9.0.0\FreeRTOS\Source\include里面的所有文件复制到新建的FreeRTOS\include文件夹下面



6、因为使用的是CW32L083VxTx StartKit REV01开发板,接下来找到刚才下载的FreeRTOSv9.0.0\FreeRTOS\Demo里面的CORTEX_STM32F103_Keil文件夹,将FreeRTOSConfig.h文件复制到新建的FreeRTOS\include文件夹下面



7、打开工程的Manage Project Items,添加FreeRTOS\port,并为其添加FreeRTOS\port\MemMang里面的heap_4.c和FreeRTOS\port\RVDS\ARM_CM0里面的port.c文件



8、添加FreeRTOS,并为其添加FreeRTOS\src里面的6个.c文件



9、点击魔术棒,将相关的头文件路径添加进来



10、修改FreeRTOSConfig.h文件

#define configUSE_PREEMPTION                1
#define configUSE_IDLE_HOOK                        0
#define configUSE_TICK_HOOK                        0
#define configCPU_CLOCK_HZ                        ( ( unsigned long ) 48000000 )       
#define configTICK_RATE_HZ                        ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES                ( 5 )
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE                ( ( size_t ) ( 4 * 1024 ) )
#define configMAX_TASK_NAME_LEN                ( 16 )
#define configUSE_TRACE_FACILITY        0
#define configUSE_16_BIT_TICKS                0
#define configIDLE_SHOULD_YIELD                1

#define xPortPendSVHandler                         PendSV_Handler
#define vPortSVCHandler                                SVC_Handler
11、打开interrupts_cw32l083.c文件,添加头文件,实现SysTick_Handler(void)函数,屏蔽掉SVC_Handler(void)和PendSV_Handler(void)函数



void SysTick_Handler(void)
{
        #if (INCLUDE_xTaskGetSchedulerState)
                if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
                {
        #endif
                        xPortSysTickHandler();
        #if (INCLUDE_xTaskGetSchedulerState)
                }
                #endif
}



至此就算移植结束了,接下来测试一下移植是否成功

三、代码测试

修改main.c,实现led1跟led2闪烁

#include "../inc/main.h"
#include "FreeRTOS.h"
#include "task.h"

#define LED_GPIO_PORT CW_GPIOC
#define LED_GPIO_PINS GPIO_PIN_3 | GPIO_PIN_2

void Led1Funtion(void* param);
void Led2Funtion(void* param);

int32_t main(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __RCC_GPIOC_CLK_ENABLE();

    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = LED_GPIO_PINS;

    GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
       
        TaskHandle_t xHandleLed1;
        TaskHandle_t xHandleLed2;
       
        xTaskCreate(Led1Funtion,"LED1", 100, NULL, 1, &xHandleLed1);
        xTaskCreate(Led2Funtion,"LED2", 100, NULL, 1, &xHandleLed2);
       
        vTaskStartScheduler();
       
        return 0;
}
void Led1Funtion(void* param)
{
        while(1)
        {
                PC03_TOG();
                vTaskDelay(100);
        }
}
void Led2Funtion(void* param)
{
        while(1)
        {
                PC02_TOG();
                vTaskDelay(100);
        }
}

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_72801483/article/details/134026794

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1896

主题

15567

帖子

11

粉丝