news 2026/2/27 7:51:41

windows clion MingW cmake 编译运行 FreeRTOS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
windows clion MingW cmake 编译运行 FreeRTOS

说明

在 windows 平台上,使用 clion IDE,cmake 方式编译 FreeRTOS,编译工具链使用 MingW gcc

下载 FreeRTOS

  • 可以只下载FreeRTOS-Kernel,也可以下载整个 FreeRTOS(包括 git 子模块,体积较大)

  • https://github.com/FreeRTOS/FreeRTOS-Kernel.git

clion 工程目录

  • 目录如下,FreeRTOS-Kernel为 FreeRTOS 内核代码, port 为 FreeRTOS 适配, sim 为 main 函数入口,用户应用。
CMakeLists.txt FreeRTOS-Kernel port sim

编写CMakeLists.txt

  • 当前不直接使用FreeRTOS-Kernel自带的CMakeLists.txt,内容如下
cmake_minimum_required(VERSION3.15)project(rtos-sim)add_definitions(-DprojCOVERAGE_TEST=0)include_directories(port)include_directories(FreeRTOS-Kernel/include FreeRTOS-Kernel/portable/MSVC-MingW port)set(FREERTOS_SOURCES FreeRTOS-Kernel/croutine.c FreeRTOS-Kernel/event_groups.c FreeRTOS-Kernel/list.c FreeRTOS-Kernel/queue.c FreeRTOS-Kernel/stream_buffer.c FreeRTOS-Kernel/tasks.c FreeRTOS-Kernel/timers.c)set(FREERTOS_PORT_SOURCES FreeRTOS-Kernel/portable/MSVC-MingW/port.c FreeRTOS-Kernel/portable/MemMang/heap_4.c port/rtos_port.c)add_executable(rtos-sim sim/main.c${FREERTOS_SOURCES}${FREERTOS_PORT_SOURCES})target_link_libraries(rtos-sim winmm)
  • 【注意】PC端使用FreeRTOS-Kernel/portable/MSVC-MingW

  • port/rtos_port.c内容如下,主要为 FreeRTOS 需要适配的几个函数,其中 HOOK 函数可以为空函数

#include<stdio.h>#include"FreeRTOS.h"voidvAssertCalled(unsignedlongulLine,constchar*constpcFileName){}voidvApplicationGetIdleTaskMemory(StaticTask_t**ppxIdleTaskTCBBuffer,StackType_t**ppxIdleTaskStackBuffer,uint32_t*pulIdleTaskStackSize){staticStaticTask_t xIdleTaskTCB;staticStackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE];*ppxIdleTaskTCBBuffer=&xIdleTaskTCB;*ppxIdleTaskStackBuffer=uxIdleTaskStack;*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;}voidvApplicationGetTimerTaskMemory(StaticTask_t**ppxTimerTaskTCBBuffer,StackType_t**ppxTimerTaskStackBuffer,uint32_t*pulTimerTaskStackSize){staticStaticTask_t xTimerTaskTCB;staticStackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH];*ppxTimerTaskTCBBuffer=&xTimerTaskTCB;*ppxTimerTaskStackBuffer=uxTimerTaskStack;*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;}unsignedlongulGetRunTimeCounterValue(void){#if0LARGE_INTEGER liCurrentCount;unsignedlongulReturn;/* What is the performance counter value now? */QueryPerformanceCounter(&liCurrentCount);/* Subtract the performance counter value reading taken when the application started to get a count from that reference point, then scale to (simulated) 1/100ths of a millisecond. */if(llTicksPerHundedthMillisecond==0){/* The trace macros are probably calling this function before the scheduler has been started. */ulReturn=0;}else{ulReturn=(unsignedlong)((liCurrentCount.QuadPart-llInitialRunTimeCounterValue)/llTicksPerHundedthMillisecond);}returnulReturn;#endifreturn0;}voidvApplicationIdleHook(void){}voidvApplicationDaemonTaskStartupHook(void){}voidvConfigureTimerForRunTimeStats(void){#if0LARGE_INTEGER liPerformanceCounterFrequency,liInitialRunTimeValue;/* Initialise the variables used to create the run time stats time base. Run time stats record how much time each task spends in the Running state. */if(QueryPerformanceFrequency(&liPerformanceCounterFrequency)==0){llTicksPerHundedthMillisecond=1;}else{/* How many times does the performance counter increment in 1/100th millisecond. */llTicksPerHundedthMillisecond=liPerformanceCounterFrequency.QuadPart/100000LL;/* What is the performance counter value now, this will be subtracted from readings taken at run time. */QueryPerformanceCounter(&liInitialRunTimeValue);llInitialRunTimeCounterValue=liInitialRunTimeValue.QuadPart;}#endif}voidvApplicationTickHook(void){}voidvApplicationMallocFailedHook(void){printf("%s : memory alloc failed\n",__func__);}
  • port/FreeRTOSConfig.h,这个来自 FreeRTOS 的 demo,FreeRTOS\FreeRTOS\Demo\WIN32-MingW,基本可以不改动,如下
/* * FreeRTOS V202212.00 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * https://www.FreeRTOS.org * https://github.com/FreeRTOS * */#ifndefFREERTOS_CONFIG_H#defineFREERTOS_CONFIG_H/*----------------------------------------------------------- * Application specific definitions. * * These definitions should be adjusted for your particular hardware and * application requirements. * * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. See * https://www.FreeRTOS.org/a00110.html *----------------------------------------------------------*/#defineconfigUSE_PREEMPTION1#defineconfigUSE_PORT_OPTIMISED_TASK_SELECTION1#defineconfigUSE_IDLE_HOOK1#defineconfigUSE_TICK_HOOK1#defineconfigUSE_DAEMON_TASK_STARTUP_HOOK1#defineconfigTICK_RATE_HZ(1000)/* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */#defineconfigMINIMAL_STACK_SIZE((unsignedshort)70)/* In this simulated case, the stack only has to hold one small structure as the real stack is part of the win32 thread. */#defineconfigTOTAL_HEAP_SIZE((size_t)(100*1024))#defineconfigMAX_TASK_NAME_LEN(12)#defineconfigUSE_TRACE_FACILITY1#defineconfigIDLE_SHOULD_YIELD1#defineconfigUSE_MUTEXES1#defineconfigCHECK_FOR_STACK_OVERFLOW0#defineconfigUSE_RECURSIVE_MUTEXES1#defineconfigQUEUE_REGISTRY_SIZE20#defineconfigUSE_APPLICATION_TASK_TAG1#defineconfigUSE_COUNTING_SEMAPHORES1#defineconfigUSE_ALTERNATIVE_API0#defineconfigUSE_QUEUE_SETS1#defineconfigUSE_TASK_NOTIFICATIONS1#defineconfigSUPPORT_STATIC_ALLOCATION1/* Tick type width is defined based on the compiler type (32bit or 64bit). */#ifdef__x86_64__#defineconfigTICK_TYPE_WIDTH_IN_BITSTICK_TYPE_WIDTH_64_BITS#else#defineconfigTICK_TYPE_WIDTH_IN_BITSTICK_TYPE_WIDTH_32_BITS#endif/* Software timer related configuration options. The maximum possible task priority is configMAX_PRIORITIES - 1. The priority of the timer task is deliberately set higher to ensure it is correctly capped back to configMAX_PRIORITIES - 1. */#defineconfigUSE_TIMERS1#defineconfigTIMER_TASK_PRIORITY(configMAX_PRIORITIES-1)#defineconfigTIMER_QUEUE_LENGTH20#defineconfigTIMER_TASK_STACK_DEPTH(configMINIMAL_STACK_SIZE*2)#defineconfigMAX_PRIORITIES(7)/* Run time stats gathering configuration options. */unsignedlongulGetRunTimeCounterValue(void);/* Prototype of function that returns run time counter. */voidvConfigureTimerForRunTimeStats(void);/* Prototype of function that initialises the run time counter. */#defineconfigGENERATE_RUN_TIME_STATS1#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS()vConfigureTimerForRunTimeStats()#defineportGET_RUN_TIME_COUNTER_VALUE()ulGetRunTimeCounterValue()/* Co-routine related configuration options. */#defineconfigUSE_CO_ROUTINES0#defineconfigMAX_CO_ROUTINE_PRIORITIES(2)/* This demo can use of one or more example stats formatting functions. These format the raw data provided by the uxTaskGetSystemState() function in to human readable ASCII form. See the notes in the implementation of vTaskList() within FreeRTOS/Source/tasks.c for limitations. */#defineconfigUSE_STATS_FORMATTING_FUNCTIONS0/* Enables the test whereby a stack larger than the total heap size is requested. */#defineconfigSTACK_DEPTH_TYPEuint32_t/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. In most cases the linker will remove unused functions anyway. */#defineINCLUDE_vTaskPrioritySet1#defineINCLUDE_uxTaskPriorityGet1#defineINCLUDE_vTaskDelete1#defineINCLUDE_vTaskCleanUpResources0#defineINCLUDE_vTaskSuspend1#defineINCLUDE_vTaskDelayUntil1#defineINCLUDE_vTaskDelay1#defineINCLUDE_uxTaskGetStackHighWaterMark1#defineINCLUDE_uxTaskGetStackHighWaterMark21#defineINCLUDE_xTaskGetSchedulerState1#defineINCLUDE_xTimerGetTimerDaemonTaskHandle1#defineINCLUDE_xTaskGetIdleTaskHandle1#defineINCLUDE_xTaskGetHandle1#defineINCLUDE_eTaskGetState1#defineINCLUDE_xSemaphoreGetMutexHolder1#defineINCLUDE_xTimerPendFunctionCall1#defineINCLUDE_xTaskAbortDelay1#defineconfigINCLUDE_MESSAGE_BUFFER_AMP_DEMO0#if(configINCLUDE_MESSAGE_BUFFER_AMP_DEMO==1)externvoidvGenerateCoreBInterrupt(void*xUpdatedMessageBuffer);#definesbSEND_COMPLETED(pxStreamBuffer)vGenerateCoreBInterrupt(pxStreamBuffer)#endif/* configINCLUDE_MESSAGE_BUFFER_AMP_DEMO */externvoidvAssertCalled(unsignedlongulLine,constchar*constpcFileName);/* projCOVERAGE_TEST should be defined on the command line so this file can be used with multiple project configurations. If it is */#ifndefprojCOVERAGE_TEST#errorprojCOVERAGE_TEST should be defined to1or0on the command line.#endif#if(projCOVERAGE_TEST==1)/* Insert NOPs in empty decision paths to ensure both true and false paths are being tested. */#definemtCOVERAGE_TEST_MARKER()__asmvolatile("NOP")/* Ensure the tick count overflows during the coverage test. */#if(configTICK_TYPE_WIDTH_IN_BITS==TICK_TYPE_WIDTH_64_BITS)#defineconfigINITIAL_TICK_COUNT0xffffffffffffd800ULL#else#defineconfigINITIAL_TICK_COUNT0xffffd800UL#endif/* Allows tests of trying to allocate more than the heap has free. */#defineconfigUSE_MALLOC_FAILED_HOOK0/* To test builds that remove the static qualifier for debug builds. */#defineportREMOVE_STATIC_QUALIFIER#else/* It is a good idea to define configASSERT() while developing. configASSERT() uses the same semantics as the standard C assert() macro. Don't define configASSERT() when performing code coverage tests though, as it is not intended to asserts() to fail, some some code is intended not to run if no errors are present. */#defineconfigASSERT(x)if((x)==0)vAssertCalled(__LINE__,__FILE__)#defineconfigUSE_MALLOC_FAILED_HOOK1/* Include the FreeRTOS+Trace FreeRTOS trace macro definitions. */// #include "trcRecorder.h"#endif#endif/* FREERTOS_CONFIG_H */
  • 接下来就是sim/main.c,也就是主程序 main 函数,当前创建一个 FreeRTOS 的 task,如果 task 正常运行,就说明 FreeRTOS 在 PC 端适配初步成功
#include<stdio.h>#include"FreeRTOS.h"#include"task.h"#defineTEST_01_TASK_PRIORITY2#defineTEST_01_STACK_SIZE1024staticvoidtest_01(void*pvParameters){uint32_tcnt=0;while(1){vTaskDelay(2000*portTICK_PERIOD_MS);printf("%s : cnt = %d\n",__func__,cnt++);}}intmain(intargc,char*argv[]){xTaskCreate(test_01,"test_01",TEST_01_STACK_SIZE,NULL,TEST_01_TASK_PRIORITY,NULL);/* Start the scheduler itself. */vTaskStartScheduler();return0;}

编译与运行

  • clion 中 【同步】Cmake,然后进行编译,如果链接失败,注意确认
target_link_libraries(rtos-sim winmm)
  • windows 上链接winmmlib

  • 正常编译链接后,运行效果如下

  • 说明 FreeRTOS clion cmake 编译,然后成功运行在 windows 上了。后续一些 FreeRTOS 的开发与调试,比如开发一些组件,可以基于 windows 进行【模拟】调试验证,非常的方便,不需要实际的硬件开发板与调试器。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 3:46:50

金融领域大数据文本挖掘实战案例解析

金融领域大数据文本挖掘实战案例解析&#xff1a;从海量噪音中提炼真金白银一、引言 钩子&#xff1a; “昨夜&#xff0c;某科技巨头财报中出现一个词&#xff1a;‘利润率承压’。瞬间&#xff0c;全球交易员屏幕飘红&#xff0c;万亿市值灰飞烟灭。而在另一个角落&#xff0…

作者头像 李华
网站建设 2026/2/21 18:27:32

3.42 Pulp工具实战:Python线性规划求解器,5分钟上手运筹优化

3.42 Pulp工具实战:Python线性规划求解器,5分钟上手运筹优化 引言 PuLP是Python的线性规划求解器,简单易用。本文将演示如何使用PuLP解决优化问题。 一、PuLP安装 1.1 安装方法 # PuLP安装 # pip install pulp print("安装命令: pip install pulp")二、基础使…

作者头像 李华
网站建设 2026/2/7 0:40:14

[Linux外设驱动详解]6. 中断处理

6. 中断处理 概述 中断是硬件与操作系统内核通信的核心机制。当硬件设备需要 CPU 注意时,会通过中断信号线向 CPU 发送请求。Linux 内核采用分阶段处理策略来响应中断: 上半部(Hard IRQ):在硬件中断上下文中执行,快速响应,禁止抢占 下半部:在稍后执行,处理耗时操作,…

作者头像 李华
网站建设 2026/2/19 17:12:00

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码 引言 相机标定和角点检测是工业视觉的基础技术。本文将深入解析这些技术的原理和实现。 一、相机标定 1.1 标定原理 相机标定用于确定相机的内参和外参。 # 相机标定 import cv2 import numpy as npdef camera_…

作者头像 李华
网站建设 2026/2/26 19:43:21

3.34 RCNN算法详解:Selective Search、IOU、NMS,目标检测的开山之作

3.34 RCNN算法详解:Selective Search、IOU、NMS,目标检测的开山之作 引言 R-CNN是目标检测领域的开山之作,引入了Selective Search、IOU、NMS等关键技术。本文将深入解析R-CNN的原理和实现。 一、R-CNN概述 1.1 算法流程 R-CNN的流程:候选区域生成 -> 特征提取 -&g…

作者头像 李华
网站建设 2026/2/24 17:51:21

3.35 FastRCNN算法详解:RoI Pooling、多任务损失函数,速度提升10倍

3.35 FastRCNN算法详解&#xff1a;RoI Pooling、多任务损失函数&#xff0c;速度提升10倍 引言 Fast R-CNN是对R-CNN的改进&#xff0c;通过RoI Pooling和多任务损失函数&#xff0c;速度提升10倍。本文将深入解析Fast R-CNN的改进。 一、Fast R-CNN改进 1.1 主要改进 # Fast …

作者头像 李华