TA的每日心情 | 衰 2024-11-15 16:19 |
---|
签到天数: 3 天 [LV.2]偶尔看看I
管理员
- 积分
- 2978
|
一、下载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
|
|