一、下载源码
选择 FreeRTOS 的最新版本:下载FreeRTOS
二、提取文件
创建文件夹如图所示:
将以下的源码文件拷贝到其中
1)在“FreeRTOSv10.0.1\FreeRTOS\Source”目录下找到所有的‘.c 文件’,拷贝到新建的 src 文件夹下
2)在“FreeRTOSv10.0.1\FreeRTOS\Source\portable”目录下找到“MemMang”文件夹与“RVDS”文件夹,将它们拷贝到新建的port 文件夹下
3)在“FreeRTOSv10.0.1\ FreeRTOS\Source”目录下找到“include”文件夹,将它直接拷贝到新建的 FreeRTOS 文件夹中
三、向工程中添加FreeRTOS
创立如图文件夹:FreeRTOS/src、FreeRTOS/port
向工程FreeRTOS/src中添加文件
向工程FreeRTOS/port中添加文件
添加heap_4.c文件,具体路径:【FreeRTOS】->【portable】->【MemMang】-> heap_4.c
添加port.c文件,具体路径:【FreeRTOS】->【portable】->【RVDS】->【ARM_CM4F】-> port.c
找到FreeRTOSv10.0.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK文件下的FreeRTOSConfig.h
拷贝 FreeRTOSConfig.h 文件到 我们新建的文件夹FreeRTOSv10.0.1\include下,如图
四、导入文件路径
五、完善移植
编译报错(1): 找不到FreeRTOS.h
在源码FreeRTOSv202104.00\FreeRTOSv202104.00\FreeRTOS\Demo文件夹中找到对应芯片工程的FreeRTOSConfig.h,比如STM32F407就需要找到并添加到工程的FREERTOS/include目录下。
编译报错(2):SystemCoreClock未定义将FreeRTOSConfig.h中的条件编译
#ifdef __ICCARM__
改为
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)
编译报错(3): 提示port.o与stm32f4xx_it.o有重复定义
注释掉stm32f4xx_it.c中的SVC_Handler(),PendSV_Handler(),SysTick_Handler()即可。
编译报错(4):提示4个hook函数未定义
修改FreeRTOSConfig.h中的HOOK宏的值为0。
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_MALLOC_FAILED_HOOK 0
六、创建任务
/*全局变量*/
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t LED2_Task_Handle = NULL;
/**
* @brief 黄灯闪烁
*
*/
void led1_task(void *pra)
{
while (1) {
bsp_yellow_led_on();
vTaskDelay(500);
bsp_alarm_led_off();
vTaskDelay(500);
}
}
/**
* @brief 绿灯闪烁
*
* @param pra --
*/
void led2_task(void *pra)
{
while (1) {
change_battery_led_alarm();
vTaskDelay(1000);
change_battery_led_charged();
vTaskDelay(1000);
}
}
/**
* @brief 任务创建
*
*/
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL(); // 进入临界区
/* 报警灯任务 */
xReturn = xTaskCreate((TaskFunction_t)flink,
(const char *)"flink_Task",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)2,
(TaskHandle_t *)&LED1_Task_Handle);
/* LED2 任务 */
xReturn = xTaskCreate((TaskFunction_t)LED2_Task,
(const char *)"LED2_Task",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)3,
(TaskHandle_t *)&LED2_Task_Handle);
vTaskDelete(AppTaskCreate_Handle); // 任务调度
taskEXIT_CRITICAL(); // 退出临界区
}
/* 主函数 */
int main()
{
HardWare_Init();
BaseType_t xReturn = pdPASS;
/* 创建任务AppTaskCreate*/
xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
(const char *)"AppTaskCreate",
(uint16_t)512,
(void *)NULL,
(UBaseType_t)1,
(TaskHandle_t *)&AppTaskCreate_Handle);
if (pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while (1);
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_66338176/article/details/134314216
|