一、下载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
|